parent
、left
、およびright
手順は簡単です現在の要素(i
に)が与えられた場合、parent
,left
、およびright
の要素を得るための計算。
親はi/2
の床で左は2i
で右ご提供例を考えてみましょう2i + 1
です。 一般的に配列は0ベースですが、あなたの例は1ベースのようです。
私たちは配列を持っています。それはAと呼ばれ、A = [16, 14, 10, 8, 7, 9, 3, 2, 4, 1]
です。
のは、我々は、上記の計算を使用して10 あるA[3]
を見ているとしましょう、A[3]
の親ですA[1]
ある16 A[3]
の左の子は9 A[3]
の右の子があるA[6]
ですほとんどのコンピュータ3.
あるA[7]
、LEFT手順は単に私のバイナリ表現をシフトすることによって一つの命令で2Iを計算することができるが1ビット位置だけ左。
同様に、RIGHTプロシージャは、1ビット位置だけ左にあるiのバイナリ表現をシフトし、次に下位ビットとして1を加算することによって、2i + 1を迅速に計算できます。 PARENTプロシージャは、iを1ビット右にシフトすることによって[i/2]を計算できます。ヒープソースの実装は、マクロプロシージャまたはインラインプロシージャとしてこれらのプロシージャを実装することがよくあります。
これは、プロセッサレベルでのこれらの機能の複雑さを示しています。要点は、parent
,left
、およびright
は通常プロセッサ上の1つまたは2つの命令で実行できることです。
inline proceduresのコメントは、コンパイラの最適化について説明しています。コンパイラは、通常、アセンブリコードを自分で記述すると、人間よりも多くのアセンブリ命令を生成します。したがって、このコメントは、(parent
、left
、およびright
)プロシージャを、適切なコンパイラ最適化が利用可能であると仮定して、単一(または2つ)の命令にコンパイルすることができるということだけです。
これらの手順が実際にプロセッサレベルでどのように実行されているかを理解しようとしている場合は、bit shiftingを読む(または他の回答を読む)ことができます。
ランダム:私は実際にはCLRSの学習アルゴリズムを推奨しません。アルゴリズムに関する素晴らしい* 2番目の本ですが、その説明の多くは技術的で数学的です。私は過去に使ったKleinbergとTardosの "アルゴリズム設計"をチェックして、より良い仕事をしていると思うかもしれません。 – templatetypedef