找到第k个最小元素的以下算法的平均时间复杂度是多少?

时间:2016-10-18 22:39:56

标签: arrays algorithm sorting heap quicksort

在数组中找到第k个最小数字的算法

  1. 构建给定数组的前k个元素(arr [0]到arr [k-1])的Max-Heap MH。 O(k)的

  2. 对于每个元素,在第k个元素(arr [k]到arr [n-1])之后,将它与MH的根进行比较。

    a)如果元素小于root,则将其设为root并为MH *

    调用heapify

    b)否则忽略它。

    //第2步是O((n-k)* logk)

  3. 最后,MH的根是第k个最小元素。

  4. 此解决方案的时间复杂度为O(k +(n-k) Logk)

    如果不是确切的值,你能告诉它的粗略范围吗?我假设最好的情况是当k = n,然后时间= O(n),最坏的情况是当k = n / 2,然后O(n)= nlogn。

1 个答案:

答案 0 :(得分:0)

此算法的最坏情况,正如您所说的O(k +(n-k)* log(k))。我们说它一般是O(n log k),因为这是主导词。平均时间通常被确认为O(n log k)。

算法的实际运行时间由两个因素决定:k的值和项目的呈现顺序。通常,对于给定的n值,实际运行时间随着k的增加而增加。但有特殊情况。

请记住,仅当数字小于堆上已有的最大数字时才会发生O(log n)堆插入。也就是说,你有一个看起来像这样的循环:

for each remaining item
    if item < top of heap
        replace top of heap with this item

如果列表中的项目按升序排列,那么您将构建前k个项目的堆,并且永远不会再次修改堆。相反,如果列表按降序排列,则每个项目都将添加到堆中。

几年前我对这个和其他选择算法做了一些非常广泛的分析,并在我的博客中写了这篇文章。见When theory meets practice