我需要实现一个可以从双向链表中找到第k个最小值的函数。
我在网上搜索并了解了这个:
我的函数测试用例如下所示:
for(int i = 0; i < 1000; ++i)
{
// create linked list with 1000 elements
int kthMinimum = findKthMin(LinkedList, i);
// validate kthMinimum answer.
}
这里的链表可以是任意顺序,我们只能假设是随机的。
是否有任何想法或建议在有效时间内从双向链表中找到第k个最小值?
由于
答案 0 :(得分:2)
您可以通过执行以下操作来维护大小为k
的堆:
k
个第一个元素填充数组。在算法结束时,第k个最小元素将位于堆的顶部。
累积前k个元素+堆积数组: O(k)
处理列表的剩余部分 O((n-k)ln(k))。
答案 1 :(得分:0)
如果列表是双向链接的,则可以在其上运行QuickSort算法。根据我的经验,QuickSort是最快的排序算法(测量生成随机列表,并将其与HeapSort和MergeSort进行对比)。之后,只需遍历列表k位置即可获得第k个最小元素。
QuickSort平均时间为O(n*log(n))
,行走列表为O(k)
,最差情况为O(n)
。因此,总时间为O(n*log(n))
。