【发布时间】:2016-12-12 20:53:58
【问题描述】:
我的问题来自下面leetcode中的解决方案,我不明白为什么是O(k+(n-k)log(k))。
补充:可能复杂度不是这个,其实我不知道heappush()和heappop()的时间复杂度
# O(k+(n-k)lgk) time, min-heap
def findKthLargest(self, nums, k):
heap = []
for num in nums:
heapq.heappush(heap, num)
for _ in xrange(len(nums)-k):
heapq.heappop(heap)
return heapq.heappop(heap)
【问题讨论】:
-
@ValentinLorentz,我相信
lgx一般是指log(x)。 -
我们需要更多的上下文。你了解
heappush()和heappop()的时间复杂度吗?你明白第 4 行和第 5 行的循环是低效的,而且整个例程确实没有必要的效率吗? -
不是。有一种相当简单的方式来使用堆,给出了声明的
O()复杂性,但是这个特定的代码并不接近。 -
@RoryDaulton 好吧,我不知道 heappush() 和 heappop() 的时间复杂度。我在任何地方都找不到它们...
-
那么在回答这个问题之前,您需要学习
priority queue和heap以及binary tree的概念。如果名为heap的堆大小为n,则heappush()或heappop()的复杂度为O(log(n))。这是因为堆在概念上是一个完整的二叉树,大约有 log(n) 个级别。