如何找到最大堆中1到n個不同元素中第3個最小元素的可能索引? 我知道最小的元素會在樹葉中的任何地方。 第二小的將是從n/2到n的任何地方,大於3的時候n 但我不知道要計算第三小的值。有什麼建議麼?最大堆中第3小元素的索引
3
A
回答
1
第三小元素至多有兩個後代,這意味着它的子(ren)是葉子,或者它是葉子。 (爲了證明這一點,你還必須證明,一個只有一個孩子的元素不可能有一個非葉子作爲孩子。簡單但乏味)
葉子,你幾乎注意到,範圍爲[floor(n/2)+1, n]
。如果n/2
是一個整數,那麼該元素恰好有一個子元素(它是一個葉子),因此添加該元素將給出可能包含第二大元素的索引範圍。
第一個孩子在葉子範圍[floor(n/2)+1,n]
中的元素最多有兩個孩子,並且沒有非葉孩子。該範圍與[ceil(n/2),n]範圍連續,並且這兩個範圍的並集爲第三大元素提供所有可能的位置。
i
元素的第一個子元素索引爲2i
,因此第一個子元素至少爲floor(n/2)+1
的第一個元素爲floor(n/4)+1
。
因此,您可以找到第三大元素的可能指數是範圍:[floor(n/4)+1,n]
。
這是另一種方法。請索引i
索取一些元素。其直系子女是2i
和2i+1
;它的孫子們是4i, 4i+1, 4i+2, 4i+3
,一般來說它的後代k
是2ki, 2ki+1, ..., 2ki + 2ki-1
;總之,[2ki, ..., 2k(i+1)-1 ]
。這些範圍當然是不重疊的(實際上,除非i
是1
,它們甚至不是連續的)。所以如果i
至少有一個在k
級別的後裔,它也有一整套k' < k
的後裔,其中有2k-2
。
從所有這一切,我們可以得出結論:
如果
n ≥ 2ki and n < 2k(i+1)
,然後i
有:2ki-2
後裔在一定程度上在k
水平低於k
n - 2ki+1
後裔;總計:
n-1
後代。
如果
n ≥ 2k(i+1) and n < 2k+1i
,然後i
有:- 正是
2k+1-1
後裔。
- 正是
粗略地說,這意味着最後2k
元件沒有在堆中的底層陣列的所述第一部分1/2k
發現。
相關問題
- 1. 在最大堆中搜索第7大元素?
- 2. 在Haskell中查找大元素的最小元素索引
- 3. 從二進制最大堆中刪除第二小元素
- 4. 4D陣列中最小/最大元素的索引
- 5. 如何查找列表中最大/最小元素的索引?
- 6. 如何從最小 - 最大堆中刪除最大元素?
- 7. 從最小到最大的元素索引
- 8. IndexOutOfBoundsException:索引:3,大小:3
- 9. 如何在堆棧中找到最小或最大的索引
- 10. 從最小或最大堆中刪除根元素的算法
- 11. 二進制堆中最小的元素?
- 12. MySQL中UNIQUE索引的最大大小
- 13. IndexOutOfBoundsException:索引:3,大小:0
- 14. 時間複雜度,以獲得最大的堆最小元素
- 15. 具有相同元素的最大和最小堆
- 16. 矩陣的最大值,最大元素的索引
- 17. 如何查找向量中元素的最大和最小索引?
- 18. 增加數組大小並在最後索引插入元素
- 19. 查找與Excel中另一列的索引(最小/最大元素)對應的列中的元素
- 20. 選擇最大元素後打印數組元素的索引
- 21. 如何查看parquet元數據中的最小/最大索引?
- 22. 在大小爲N的數組的每k個元素中查找最小元素和第二小元素
- 23. 構建最小/最大二元堆
- 24. 索引中的最大元素在元組
- 25. 在O(1)時間查找最大堆的第10個最大元素時間
- 26. Nexus的最大堆大小?
- 27. 獲取Python中列表中最小N個元素的索引
- 28. 如何獲得matlab中數組中最小元素的索引?
- 29. 搜索堆中的元素
- 30. 關於堆(最大堆和最小堆)
在一個真正[二進制最大堆(http://en.wikipedia.org/wiki/Binary_heap),最小的(N + 1)/ 2個節點將是葉,如果我記錯我的數據結構。因此,您的第三小值將是其中一個節點或其中一個節點的直接父節點。我無法想象在O(1)時間內能夠提取該值的封閉形式算法,即使假設堆已經完全構建。 – WhozCraig 2013-03-10 00:53:38