的parent
,left
,並right
手續簡單計算得到parent
,left
和right
元素,給出當前元素(在i
處)。
家長是i/2
左地板2i
右是2i + 1
考慮您提供的例子。 通常數組基於0,但您的示例似乎是基於1的。
我們有一個數組,稱之爲A,其中A = [16, 14, 10, 8, 7, 9, 3, 2, 4, 1]
。
比方說,我們正在尋找A[3]
是10 使用上述計算,A[3]
的母公司是A[1]
這是16 A[3]
的左孩子是A[6]
這是9 A[3]
的右孩子A[7]
這是3.
在大多數計算機,則LEFT程序可以通過簡單地移動的二進制表示計算2I在一個指令i的左移一個位的位置。
類似地,RIGHT過程可以快速計算2i + 1,方法是將左邊的二進制表示移位一位,然後將1加爲低位。 PARENT程序可以通過向右移動一個位位置來計算[i/2]。 heapsort的良好實現經常將這些過程實現爲「宏」或「內聯」過程。
這是描述在處理器級別這些功能的複雜性。要點是parent
,left
和right
通常可以在處理器上的一個或兩個指令中執行。
關於inline procedures的評論正在描述編譯器優化。如果編譯器本身編寫彙編代碼,編譯器通常會生成比人類更多的彙編指令。所以這個評論只是說假設正確的編譯器優化可用,那麼(parent
,left
和right
)過程可以被編譯爲單個(或幾個)指令。
如果您想了解這些過程如何在處理器級別上實際運行,那麼您可以閱讀bit shifting(或閱讀其他答案)。
隨機放在一邊:我實際上會*不推薦從CLRS學習算法。這是關於算法的第二本書,但其中很多解釋都是技術性和數學性的。您可能想查看Kleinberg和Tardos的「算法設計」,這是我過去使用過的,並且認爲它能更好地激勵事物。 – templatetypedef