如何从Double链表中找到第k个最小元素?

时间:2015-03-06 14:59:24

标签: algorithm sorting data-structures linked-list doubly-linked-list

我需要实现一个可以从双向链表中找到第k个最小值的函数。

我在网上搜索并了解了这个:

  • quickSelect逻辑和第k阶统计算法对数组或向量有效,但在这里我使用的是链表,我没有任何大小的链表,所以很难将它们分成5个元素部分。

我的函数测试用例如下所示:

for(int i = 0; i < 1000; ++i)
{
    // create linked list with 1000 elements
    int kthMinimum = findKthMin(LinkedList, i);
    // validate kthMinimum answer.
}

这里的链表可以是任意顺序,我们只能假设是随机的。

是否有任何想法或建议在有效时间内从双向链表中找到第k个最小值?

由于

2 个答案:

答案 0 :(得分:2)

算法

您可以通过执行以下操作来维护大小为k的堆:

  1. 使用列表中的k个第一个元素填充数组。
  2. 修复数组(使用MaxHeap)
  3. 处理列表的其余元素:
    • 如果堆的顶部(最大值)大于列表 e 中的当前元素,请将其替换为 e (并保持堆不变)
    • 如果元素更大,则忽略它并继续
  4. 在算法结束时,第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))