C 以下合并k个链表的时间复杂度

C 以下合并k个链表的时间复杂度,c,merge,linked-list,time-complexity,C,Merge,Linked List,Time Complexity,参考链接: 分而治之的策略是如何赋予O(nk Log k)复杂性的请解释。 另外,我用一种稍微不同的方式编写了相同的代码。唯一的区别在于合并的模式。我将前两个链接结果合并,然后将它们的结果与另一个链接列表合并 这将有多复杂? Node * mergek(){ int n; puts("Enter number of linked list you want to enter"); scanf("%d",&n); Node ** arr=malloc(siz

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

这将有多复杂?

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;    
}
Node*mergek(){
int n;
puts(“输入要输入的链接列表的编号”);
scanf(“%d”和“&n”);
节点**arr=malloc(sizeof(节点*)*n);
int i=0;

对于(i=0;i虽然合并的数量保持不变,但合并的模式实际上会使时间复杂度变得更糟。假设您有一个
merge()
函数来输入
O(n+m)
time(其中n=第一个列表的大小,m=第二个列表的大小)和
O(1)空间,考虑下面的分析,我假设每个列表平均有<代码> N< /代码>元素。

  • 第一次合并将是
    O(n+n)
    ,因为我们正在合并两个
    n
    大小的列表
  • 第二次合并将是
    O(2n+n)
    ,因为我们正在将一个
    n
    大小的列表与现在的
    2n
    大小的列表合并
  • 第三次合并将是
    O(3n+n)
    …等等
在这一点上,我们必须将大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)
时间复杂性

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


要回答您的另一个问题,即分而治之方法实际上如何产生O(nk*log(k)),请思考合并排序是如何工作的

如果我们有$n$项,则合并排序需要做
n
大量的工作,这与成对合并
n
项在成为一个完整列表之前所需的次数相同。这个数字是
log(n)
(n的对数基数2),因此它需要与
nlog(n)
(同样,要意识到我们正在做大量的工作,因为总是有
n
元素在起作用,
log(n)
次)合并排序在合并之前必须将列表分解为单个元素的原因是,单个单元是我们能得到的最小的东西,它是按定义排序的,而不需要我们做任何排序工作


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

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