我有一个包含k个数字的最小堆,其计数器是我们从用户那里获得此数字的次数(例如,我们可以使数字5的计数器为0而不出现在用户输入中)。插入函数在O(logk)中运行,而FindMin函数的工作方式如下:
FindMin:在O(1)中取堆的根,如果其计数器不为0,则返回此数字。否则在O(logk)中删除DeleteMin,然后再次使用FindMin。
现在我知道m的insert和findmin的摊销时间为O(logk),但我仍然无法证明这一点。这是我到目前为止的内容:
让我们假设M1是调用FindMin的次数,而M2是调用Insert的次数。我们知道M1 + M2 = m 我们还假设K是我们在堆中使用DeleteMin的节点数。然后我们知道$ \ sum_ {k = 1} ^ M1 k <= M2 $,依此类推:
T(m)= $ \ sum_ {k = 1} ^ M2 O(logk)$ + $ \ sum_ {k = 1} ^ M1 k * O(logk)$
从这里我不确定该去哪里,在我看来我会得到T(m)= O(M2 * logk),这不是正确的答案。
感谢您的帮助!