【问题标题】:Can't define runtime of this algorithm无法定义此算法的运行时间
【发布时间】:2017-07-31 13:35:36
【问题描述】:

我这里有一种算法。

Click here to check algorithm image

它的作用是遍历一个数组并找到 3 个最大值并返回它们的总和。 例如,数组 [1,2,3,4,5] 将返回 12 (3+4+5=12)。

图像中的算法说它是 O(nlogk)。但这是我无法理解的。

以下是我对图中第一个 for 循环的看法:

Heap 的方法“insert()”和“deleteMin()”,它们都需要 O(logn)。所以在第一个 for 循环中,它通过添加它们的运行时间来生成 O(2*logn),这只是 O(logn)。由于第一个 for 循环遍历数组中的所有元素,所以第一个 for 循环的总运行时间为 O(nlogn)。

以下是我对图中第二个 while 循环的看法:

从前面的 for 循环中,如果 h.size() > k,我们已经删除了一些最小值。所以堆中的值的数量当前是k。 “sum=sum+h.min()” 需要 O(logn),因为如果我知道正确,在堆中搜索最小值需要 O(logn),而“h.deleteMin()”也需要 O(logn),因为它必须再次搜索并删除。通过添加它们的运行时间也是 O(2*logn),这只是 O(logn)。因为我们只迭代这个while循环k次,因为有k个元素,所以第二个while循环的结果是O(k*logn)

所以我们有来自第一个 for 循环的 O(nlogn) 和来自第二个 while 循环的 O(klogn)。很明显,O(nlogn) 大于 O(klogn),因为 k 是某个常数。因此这个算法最终以 O(nlogn) 结束。

但答案是“O(nlogk)”而不是“O(nlogn)”。

你能解释一下原因吗?

【问题讨论】:

    标签: algorithm data-structures runtime heap binary-heap


    【解决方案1】:

    堆上的操作采用O(log(size_of_heap))。在这种算法的情况下,堆大小为k(不包括前几次迭代)。

    所以我们得到O(total_number_of_elements*log(size_of_heap))=O(n*log(k))

    【讨论】:

      【解决方案2】:

      您对 insert() 和 deletemin() 运行时需要 O(log n) 的假设是不正确的。 O(log n) 中的“n”表示堆中元素的数量。在这种情况下,它是 k。

      因此,对于第一个循环 - 每个元素都有 O(2*logk) 并且总共将有 O(nlogk) 和第二个循环 - O(klogk) 总复杂度可以定义为 O(n*logk)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-03
        • 1970-01-01
        • 2015-09-25
        • 2014-03-22
        • 2015-06-18
        相关资源
        最近更新 更多