【发布时间】:2015-03-09 09:54:05
【问题描述】:
HERE 据说构建堆的最坏情况时间复杂度是 O(nlogn) 但上限是 O(n)。
上限与最坏情况的时间复杂度有何不同,以及何时比其他更有意义。 严格的上限有什么不同吗?
【问题讨论】:
-
我相信某处存在一些误解。他们可能想说 heapify() 是 O(n),尽管乍一看它似乎是 O(n log n) 算法。此外,如果通过按顺序执行堆插入来天真地实现,则复杂度确实为 O(n log n)。我的猜测——他们随意使用“最坏情况”,而不是严格意义上的数学。
-
感谢您的回复。我不认为这是打字错误。你能检查一下吗geeksforgeeks.org/nearly-sorted-algorithm 即使在第二个解决方案中,他们提议使用堆,他们说要形成 k 个元素的堆,这将需要 O(k)
-
维基百科和我的 CS 教科书一样 - 构建堆的复杂性是 O(n)。输入数据分布无关紧要——它总是 O(n)。
-
heapify 和 build heap 不是一回事。我这里说的是构建堆
-
从一组输入构建一个堆是并且将始终是 O(n) (无论所述输入和堆的分支因子如何 - 例如。二进制, 三元,...)。您只是误读了您提供的链接:它说“虽然最坏的情况复杂度看起来像 O(nLogn),但时间复杂度的上限是O(n)。”
标签: java algorithm heap time-complexity