木とヒープの基本
algorithmdata-structuresundergraduatelecture
data/lecture/information/graph/graph-basics.lecture.n.md
data/lecture/information/algorithm/data-structures/data-structures-portal.lecture.n.md
1導入
この講義では、根付き木の親子関係と深さを定義し、二分ヒープの不変条件、基本操作、計算量を説明する。
2根付き木
木は、任意の二頂点間に道がただ一つ存在する無向グラフである。根付き木は、木の一頂点を根として指定した構造である。根でない頂点 v について、v から根への道で v の直後にある頂点を v の親という。親が v である頂点を v の子という。根に親は存在しない。
頂点 v の深さは、根から v への道の辺数である。根の深さは 0 であり、子の深さは親の深さより 1 大きい。木の高さは頂点の深さの最大値である。各頂点の子が高々 2 個である根付き木を二分木という。
3二分ヒープ
n 個の要素をもつ完全二分木は、最下段を除く各段が充足され、最下段の頂点が左から連続している二分木である。この形状の高さは \lfloor\log_2 n\rfloor(n>0)であり、添字 0 から始まる配列に段階順で格納できる。添字 i の子の添字は 2i+1 と 2i+2 である。
最小ヒープは、完全二分木の形状をもち、各辺について
\operatorname{key}(\operatorname{parent}(v))\leq\operatorname{key}(v)
が成立する。このヒープ不変条件により、根は全要素の最小鍵をもつ。実際、根から任意の頂点への道に沿って不等式を推移的に適用すると、根の鍵はその頂点の鍵以下である。ただし、兄弟間や異なる部分木間の順序は規定されない。最大ヒープは不等号を逆にした構造である。
4基本操作と計算量
- 最小値参照は根を参照するため \Theta(1) 時間である。空のヒープへの参照は事前条件違反とする。
- 挿入では配列末尾に要素を追加し、親より鍵が小さい間、親と交換する。交換前に不変条件を破り得る辺は追加要素とその親の間だけであり、この違反を根方向へ移動させるため、停止時には不変条件が回復する。一段の交換を O(1) とすれば、最悪時は O(\log n) 時間である。
- 最小値削除では、空でないことを事前条件とする。n=1 なら根を削除して空のヒープとする。n>1 なら根を削除し、末尾要素を根へ移動する。子が存在し、かつ現在要素より小さい鍵の子が存在する間、存在する子のうち最小鍵の子と交換する。停止時には現在要素と子の間にも不変条件が成立し、交換しなかった部分の不変条件は保存される。最悪時は O(\log n) 時間である。
最小ヒープは優先度付きキューを実装できる。優先度付きキューは、要素の挿入と最小優先度要素の参照・削除を提供する抽象データ型である。ヒープは全要素を整列順に保持しないため、任意鍵の探索が高速になるとは限らない。