Algorithm 查找最大元素和n/3最大元素的实现

Algorithm 查找最大元素和n/3最大元素的实现,algorithm,Algorithm,假设你一直都有数字,你不知道一开始会有多少数字。在任何时候,我都希望能够立即输出最大的数字和n/3最大的数字(其中n是到目前为止输入的数字的数量)(在O(1)中)。输入新号码的最长时间是O(log(n)) 实现这一点的最佳方法是什么?您可以使用两种方法来实现它:最小堆(a)和最大堆(B) 其思想是将n/3最大值存储在A中,其余值存储在B中,以便B中的最大值是n/3最大值(以零为基础计数)。假设在n不是三的倍数的情况下n/3被截断,并且结果值是零基的(n/3==0表示最大值也是n/3最大元素),这

假设你一直都有数字,你不知道一开始会有多少数字。在任何时候,我都希望能够立即输出最大的数字和
n/3
最大的数字(其中
n
是到目前为止输入的数字的数量)(在O(1)中)。输入新号码的最长时间是
O(log(n))


实现这一点的最佳方法是什么?

您可以使用两种方法来实现它:最小堆(a)和最大堆(B)

其思想是将n/3最大值存储在A中,其余值存储在B中,以便B中的最大值是n/3最大值(以零为基础计数)。假设在n不是三的倍数的情况下n/3被截断,并且结果值是零基的(
n/3==0
表示最大值也是n/3最大元素),这意味着必须保持以下不变性:

A.size == floor((A.size + B.size)/3)
…这归结为:

0 <= B.size - 2*A.size < 3 
上述方法的时间复杂度为:

  • 尺寸:O(1)
  • peek:O(1)
  • 拉力:O(对数)
  • 地址:O(logn)

保持总体最大值是一项容易的任务。堆只用于跟踪第n/3个最大值。

本质上,这是选择算法的一个变体:最大值很容易。
n/3
我将处理两个最大的堆,一个最小堆和一个最大堆。即使是简单的也能满足您的要求。非常感谢!!但是拉是什么意思呢?
pull
的另一个名称是
extract
。这意味着从堆的根中获取值,并将其从堆中移除,然后需要通过heapify算法获得一个新的根。
if v < B.peek():
    B.add(v)
    if B.size - 2*A.size >= 3:
        A.add(B.pull())
else:
    A.add(v)
    if B.size - 2*A.size < 0:
        B.add(A.pull())
B.peek()