此問題與this類似。區別在於我有一個二進制最大堆而不是最小堆。這使問題完全不同。從二進制最大堆中刪除第二小元素
我的想法:
1)我經歷的所有節點,以找到第二個最小的元素,這將需要O(n)的
2)當我找到第二個最小的元素,我泡那元素,通過交換它的父元素直到它到達根,這將花費O(logn)
3)我從根中刪除該元素,並採取最右邊的元素,並將其存儲在根位置(常規堆刪除操作),這將花費O(logn)
總數爲O(n)+ O(logn)+ O(logn),即O(n)。
編輯:新增二進制
難道還有比這更好的解決方案呢?
爲什麼不使用分鐘堆?無論如何,任何有效的解決方案都會間接地創建最小堆。 – ElKamina
@ElKamina;這是一個問題(不是家庭作業),我有興趣知道答案。 –
我假設你說的「堆」是指[二進制堆](http://en.wikipedia.org/wiki/Binary_heap) - 是否正確? – amit