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()