我无法解决一个问题,能请你帮忙吗?
For i=1 to i=n/2, if A[i]<=A[2i] and A[i]<=A[2i+1] A is called as a "bst"
在一个有n个元素的二叉搜索树中,查找第k小的元素的时间复杂度是多少?
我无法解决一个问题,能请你帮忙吗?
For i=1 to i=n/2, if A[i]<=A[2i] and A[i]<=A[2i+1] A is called as a "bst"
在一个有n个元素的二叉搜索树中,查找第k小的元素的时间复杂度是多少?
set i = 0, currIdx = 0
heap.add((i,0))
while currIdx < k:
currIdx = currIdx + 1
(x,i) = heap.popLowest()
if i != 2i: //for i=2i=0, don't add it twice:
heap.add((arr[2i],2i))
heap.add((arr[2i+1],2i+1))
return heap.getTop()
O(klogk)
,堆上的每个操作都需要O(logN)
(其中N
是其当前大小),堆的最大大小为N=k
,因此堆上的所有操作都是log(1) + log(2) + ... + log(k) = log((k)!)
,它在O(klogk)
中。有两种方法:
首先,你指的是“堆”,而不是“bst”(你描述的数据结构必须是一个堆,并不一定是bst)。
其次,这个问题可在O(k)时间内解决并不明显 - 直到1992年Frederickson给出了一个O(k)时间复杂度的算法。 我没有完全阅读这篇论文,但其中包含18页复杂的技术论证,我很惊讶奥林匹克组织者希望学生从零开始想出它!(或者他们可能已经期望学生熟悉该算法 - 在这种情况下,我会说(a) 这仍然要求相当多的知识; (b) 这不是一个非常好的问题。)
A[i]<=A[2i+1] and A[i]<=A[2i+2]
吗?如果是这样,那么这就是一个二叉堆,你可以在O(k)的时间复杂度内找到第k小的元素。 - amit