Data structures 查找最大堆中第logn个最大值的最有效方法
标题说明了一切;在包含n元素的最大堆中,查找logn第个最大数的最有效方法是什么?Data structures 查找最大堆中第logn个最大值的最有效方法,data-structures,max,time-complexity,heap,max-heap,Data Structures,Max,Time Complexity,Heap,Max Heap,标题说明了一切;在包含n元素的最大堆中,查找logn第个最大数的最有效方法是什么? ps:我正在阅读的教科书模糊地解释了一个时间复杂度为O(lognloglogn)的解决方案,通过使用另一个我无法理解的堆,我们能做得更好吗?让H成为原始的最大堆。让H'成为另一个最大堆,初始为空,它对来自第一堆的元素对(索引,值)进行操作,并根据第二个组件对这些对进行排序 推送(0,H[0]) count=ceil(日志n) 计数>0时执行 (i,v):=H.extract-max()//需要O(logn)时间
ps:我正在阅读的教科书模糊地解释了一个时间复杂度为
O(lognloglogn)
的解决方案,通过使用另一个我无法理解的堆,我们能做得更好吗?让H
成为原始的最大堆。让H'
成为另一个最大堆,初始为空,它对来自第一堆的元素对(索引,值)
进行操作,并根据第二个组件对这些对进行排序
count=ceil(日志n)
计数>0时执行
(i,v):=H.extract-max()
//需要O(logn)
时间H'。推送(2i+1,H[2i+1])
如果H[2i+1]
存在/O(日志n)
时间H'。推送(2i+1,H[2i+2])
如果H[2i+2]
存在/O(日志n)
时间count:=count-1
v
H'
操作的运行时间有O(log log n)
限制的原因是H'
最多包含log n
元素,并且每个操作的运行时间与堆的元素数成对数关系,即O(log log n)
总运行时间显然是
O(logn logn)
。我假设原始的最大堆H
是用数组表示的。一个明显但不是很有趣的解决方案是简单地执行log n extract max操作,导致运行时间O((log n)^2)
。如何在O(log logn)时间内从H中提取最小值?该堆包含n个元素,@Amen无需提取min,您需要提取max.max
通过堆的构造,在表示堆的数组的索引0处……很抱歉,我的评论是错误的,我的意思是说您不能执行第4行。你的代码的时间复杂度。我认为你可以H'
最多包含log n
项,其中n
是H
中的项数(注意H
和H'
是不同的最大堆)。由于H'.extract-max()
在时间O(log(H'.size())
和H'.size()=O(log n)
中运行,我们知道它的运行时间是O(log log log n)
。啊哈,现在我看到它被更改了,最初是从H中提取min.:)