的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