Algorithm 合并k个链表的时间复杂度为O(nk log(k))
我知道这方面有几个问题,但我还没有找到我问题的答案 问题很简单:合并KN长度排序的链表 有很多答案,使用复杂度为O(n log(k))的k长度优先级队列 不知道怎么做。这是链接 这让我觉得我错了。因此,我的解决方案是: 要合并两个n长度的列表,我们需要O(2n)个时间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 最后一项
感谢您的时间。除非另有说明,否则当算法的复杂性以
N
表示时,N
就是输入的大小。所以当我们说“合并k个链表是O(N logk)”时,我们的意思是N是所有链表中元素的总数
正如您所说,合并k m长度列表是O(km log k)。这里输入的大小是km(元素的总数),因此这与上面的陈述是一致的
不过,你的陈述没有那么有力,因为它只涵盖了长度相等的k个列表。“合并k个链表是O(N log k)”是正确的,无论这些N个元素如何分布在列表中。考虑问这个问题,我想我的解决方案是好的,那么为什么只有具有优先级队列实现的解决方案。你的方法很好。编写良好的优先级队列版本在最坏情况下的性能在实践中会更快,因为它具有更好的局部性和更少的指针篡改。谢谢:)良好的处理是另一个问题。:)