Data structures 查找最大堆中第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)时间

标题说明了一切;在包含n元素的最大堆中,查找logn第个最大数的最有效方法是什么?

ps:我正在阅读的教科书模糊地解释了一个时间复杂度为
O(lognloglogn)
的解决方案,通过使用另一个我无法理解的堆,我们能做得更好吗?

H
成为原始的最大堆。让
H'
成为另一个最大堆,初始为空,它对来自第一堆的元素对
(索引,值)
进行操作,并根据第二个组件对这些对进行排序

  • 推送(0,H[0])
  • 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.:)