在CLRS給出的內建堆算法構建堆算法(一個或多個)上的array.Generate成果無暴力破解
BUILD-MAX-HEAP(A)
1 heap-size[A] ← length[A]
2 for i ← ⌊length[A]/2⌋ downto 1
3 do MAX-HEAPIFY(A, i)
它僅產生一個幾種可能cases.Are還有其他算法,其將產生與上述算法不同的情況。 對於輸入數組 A = {4,1,3,2,16,9,10,14,8,7} 構建堆產生A = {16,14,10,8,7,9,3, 2,4,1}滿足堆性質。 可能這是從數組中構建一個堆的最有效的算法,但是還有其他幾個排列也具有堆屬性的數組。 當我生成數組的所有排列,並執行堆屬性的測試。我得到了具有堆屬性的數組的3360排列。
Count1 16 9 14 4 8 10 3 2 1 7
Count2 16 9 14 4 8 10 3 1 2 7
Count3 16 9 14 4 8 10 2 1 3 7
Count4 16 9 14 4 8 10 2 3 1 7
Count5 16 9 14 4 8 10 7 2 1 3
Count6 16 9 14 4 8 10 7 2 3 1
Count7 16 9 14 4 8 10 7 1 3 2
Count8 16 9 14 4 8 10 7 1 2 3
Count9 16 9 14 4 8 10 7 3 1 2
Count10 16 9 14 4 8 10 7 3 2 1
...........................................................
Count3358 16 8 14 7 4 9 10 2 1 3
Count3359 16 8 14 7 4 9 10 3 2 1
Count3360 16 8 14 7 4 9 10 3 1 2
那麼,有一個不同的構建堆算法這將使從與上述算法或其中的不同的輸出給出了部分3360個可能的結果?
一旦我們使用了構建堆來獲得滿足堆屬性的數組,我們如何使用這個數組產生最大數量的其他案例。我們可以交換堆的葉節點以生成一些案例。是否有其他方法可以在不檢查堆屬性測試的所有排列的情況下獲得更多可能的情況?
給定數組中值的範圍和所有值是不同的。我們可以說可以滿足堆屬性的可能情況的總數?
如果兩個非葉節點交換將不需要調用Heapify()。你可以給你一個例子,你的意思是升檔? – bl3e
@ n000b:這是「篩選」,而不是「上移」 。* *相信*「篩選」在處理堆時是一個相當常見的術語,當您在堆的末尾添加一個新項時,您會進行「篩選」(例如,在堆排序中)你把一個物品放在堆的開始,然後你做一個篩選,以保持h eap不變。 –