【问题标题】:TimeComplexity of the following merging k linked lists以下合并k个链表的时间复杂度
【发布时间】:2016-11-19 04:08:56
【问题描述】:

http://www.geeksforgeeks.org/merge-k-sorted-linked-lists/

参考链接: 请解释分治策略如何给出 O(nk Log k) 复杂度。 此外,我以稍微不同的方式编写了相同的代码。唯一的区别在于合并的模式。我将前 2 个链接结果合并,然后将它们的结果与另一个链接列表合并。

这会有什么复杂性?

Node * mergek(){
    int n;
    puts("Enter number of linked list you want to enter");
    scanf("%d",&n);
    Node ** arr=malloc(sizeof(Node *)*n);
    int i=0;
    for(i=0;i<n;i++){
        arr[i] = takeInput();
    }
    for(i=0;i<n;i++){
        print(arr[i]);
    }
    Node * temp=NULL;
    for(i=0;i<n;i++){
        if(i==0){
            temp=merge(arr[i],arr[i+1]);
            i=i+1;
        }   
        else{
            temp=merge(arr[i],temp);
        }   
    }
    return temp;    
}

我想知道这是否会具有相同的复杂性,例如。 O(nklog(k)) 复杂度。

合并次数保持不变。

【问题讨论】:

  • 您的代码实际上并没有进行合并,因为您没有显示您的merge() 代码。我们只知道它是O(n) * O(merge)

标签: c merge linked-list time-complexity


【解决方案1】:

虽然合并的次数保持不变,但合并的模式实际上使时间复杂度变得更糟。假设您在 O(n + m) 时间(其中 n = 第一个列表的大小,m = 第二个的大小)和 O(1) 空间中有一个 merge() 函数到 merge two sorted linked lists,请考虑以下分析,其中我假设每个列表都有平均n 个元素。

  • 第一个合并将是 O(n + n),因为我们正在合并两个 n 大小的列表
  • 第二次合并将是 O(2n + n),因为我们正在将一个 n 大小的列表与我们现在的 2n 大小的列表合并
  • 第三次合并将是O(3n + n)...等等。

此时,我们必须将 Big-Oh 中的所有加法相加得到:

O(2n + 3n + 4n + 5n + ... + kn)

所有这些n 项的总和本质上是n*(k(k+1))/2,因为(k(k+1))/2 是第一个k 数字的总和。通过从(k(k+1))/2中取出常数因子和低阶项,我们可以看到O((k(k+1))/2) = O(k^2),从而给出算法O(n*k^2)的时间复杂度。

我写了一篇关于这个问题的小文章并进一步分析了复杂性差异的程度。你应该看看 here


要回答您关于分而治之方法实际上如何产生 O(nk*log(k)) 的其他问题,请考虑归并排序的工作原理。

如果我们有 $n$ 个项目,则合并排序会完成 n 的工作量,它需要将 n 项目成对合并在一起才能成为一个完整的列表。这个数字是log(n)(n 的以 2 为底的对数),因此它需要与nlog(n) 成比例的步数(再次意识到我们正在做n 的工作量,因为总是有n 元素在起作用,log(n) 次)。合并排序必须在合并列表之前将列表分解为单个元素的原因是,单个单元是我们可以得到的最小的东西,根据定义,已排序,无需我们做任何工作对其进行排序。

在我们的例子中,每个列表都已经排序,因此我们可以将每个k 列表(大小为~n)视为按定义排序的元素。没有必要进一步分解排序列表。由于有k 列表,每个列表都带有n 元素,所以总会有n*k 元素在起作用。幸运的是,由于每个列表都已经排序,我们只需将k“元素”合并在一起,而不是所有n*k列表元素。所以同样的逻辑盛行,因为我们必须将k元素/列表合并在一起。由于每个列表需要 O(n) 时间来合并,而不是 O(1) 在处理 n*k 单个元素时,它需要与 O(nk*log(k)) 成比例的时间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-27
    • 1970-01-01
    • 2016-02-03
    • 2017-03-19
    相关资源
    最近更新 更多