算法查找数组中的第k个下一个元素

时间:2015-06-14 07:28:41

标签: algorithm

我无法解决一个问题,请你帮忙吗?

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个元素在kth中查找bst个最小元素的时间复杂度是多少?

3 个答案:

答案 0 :(得分:1)

我可以在O(klogk)完成,并假设k<<n - 与替代方案相比,这将非常有效。

这个想法是维持一个小堆,从头部开始(id == 0),这是最低的元素,并迭代地添加所有&#34;新的候选者&#34; (对于给定的当前最低i - &#34;候选人&#34;是2i2i+1

创建一个新的空min-heap,其中每个元素包含一个tupple(x,i) - x是数组中的键,i是它的索引

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)

答案 1 :(得分:1)

有两种方法:

  1. O(k ln(n))时间复杂度。
  2. O(k ln(k))时间复杂度+ O(K)空间复杂度。

答案 2 :(得分:1)

首先,你的意思是&#34;堆&#34;,不是&#34; bst&#34; (您描述的数据结构必然是堆,不一定是bst)。

其次,在O(k)时间内这个问题是可以解决的并不是很明显 - 直到1992年才Frederickson gave an O(k)-time algorithm for this。我一直都没有读过这篇论文,但这是18页错综复杂的技术论证,我很高兴奥林匹克运动会的组织者会期望学生从头开始提出这个问题! (或许他们希望他们已经熟悉算法 - 在这种情况下我会说(a)它仍然要求很多,而且(b)它不是一个非常好的问题。)