Algorithm 合并k个链表的时间复杂度为O(nk log(k))

Algorithm 合并k个链表的时间复杂度为O(nk log(k)),algorithm,merge,linked-list,time-complexity,Algorithm,Merge,Linked List,Time Complexity,我知道这方面有几个问题,但我还没有找到我问题的答案 问题很简单:合并KN长度排序的链表 有很多答案,使用复杂度为O(n log(k))的k长度优先级队列 不知道怎么做。这是链接 这让我觉得我错了。因此,我的解决方案是: 要合并两个n长度的列表,我们需要O(2n)个时间 两对中的合并列表===k/2合并*2n次合并每对 左侧为k/2,2n长度列表 重复步骤1,直到留下1个大小为n*k的数组 因此,时间复杂性将是 k/2*2n=k*n k/4*4n=k*n k/2^x*2^xn=kn 最后一项

我知道这方面有几个问题,但我还没有找到我问题的答案

问题很简单:合并KN长度排序的链表

有很多答案,使用复杂度为O(n log(k))的k长度优先级队列

不知道怎么做。这是链接

这让我觉得我错了。因此,我的解决方案是:

要合并两个n长度的列表,我们需要O(2n)个时间

  • 两对中的合并列表===k/2合并*2n次合并每对 左侧为k/2,2n长度列表
  • 重复步骤1,直到留下1个大小为n*k的数组
  • 因此,时间复杂性将是

    k/2*2n=k*n

    k/4*4n=k*n

    k/2^x*2^xn=kn

    最后一项是k*n,其中2^x=k或x=log(k)

    因此,在每次迭代中进行k*n比较的总日志(k)迭代。所以时间复杂度是O(k*n*log(k))

    有人能告诉我哪里错了吗


    感谢您的时间。

    除非另有说明,否则当算法的复杂性以
    N
    表示时,
    N
    就是输入的大小。所以当我们说“合并k个链表是O(N logk)”时,我们的意思是N是所有链表中元素的总数

    正如您所说,合并k m长度列表是O(km log k)。这里输入的大小是km(元素的总数),因此这与上面的陈述是一致的


    不过,你的陈述没有那么有力,因为它只涵盖了长度相等的k个列表。“合并k个链表是O(N log k)”是正确的,无论这些N个元素如何分布在列表中。

    考虑问这个问题,我想我的解决方案是好的,那么为什么只有具有优先级队列实现的解决方案。你的方法很好。编写良好的优先级队列版本在最坏情况下的性能在实践中会更快,因为它具有更好的局部性和更少的指针篡改。谢谢:)良好的处理是另一个问题。:)