- スプレー木のErlang実装
- スプレー木 * http://ja.wikipedia.org/wiki/%E3%82%B9%E3%83%97%E3%83%AC%E3%83%BC%E6%9C%A8
- 各要素は == で比較される (ex. 1 と 1.0 は等価)
- 0.2.6
空のスプレー木を作成する
木に格納されている要素数を返す。処理オーダーは O(要素数)
木が空かどうかを判定する。
木に要素を挿入する。既にKeyに対応する要素が存在する場合は、その値が更新される。
木の要素を以下のルールに従い、更新する。
a] Keyに対応する要素がない場合: Initialを値とする要素を追加する
b] Keyに対応する要素がある場合: Fun(既存の値)を適用し、その返り値で要素の値を更新する
update/4と同様に要素の更新を行う。
ただし、キーに対応する要素が存在しない場合は、更新は行われず、結果として error が返る。
Keyに対応する要素の値を検索する。
※ スプレー木では、要素検索時にも木のリバランシングが行われるため、新しい木が返り値に含まれる
最大の要素を検索する。
最小の要素を検索する。
最大の要素を取り出す。
最小の要素を取り出す。
Keyに等しいかより大きい最初の要素を返す.
Keyより大きい最初の要素を返す.
Keyに対応する要素の値を検索する。
Keyに対応する要素の値を返す。要素が存在しない場合は DefaultValue が返される。
Keyに対応する要素を木から削除する。
Keyで指定した位置で木を分割する。
結果の LeftTree には Key より小さなキーを持つ要素が、
RightTree には Key と等しいかより大きなキーを持つ要素が、格納される。
{Key,Value}を要素とするリストから、スプレー木を生成する。
※ Keyが重複する要素がある場合は、後に出現するものの値が使用される
木を{Key,Value}形式のリストに変換する。
リスト内の要素はKeyの昇順にソートされている。
木の全ての要素にFun(Key,Value)を適用し、その結果で各要素の値を更新する。
木の全ての要素に述語関数Pred(Key,Value)を適用し、結果がfalseとなった要素を木から除去する
キーの昇順に、木の要素の畳み込みを行う。
畳み込み:
1] 木の始めの要素に対してFun(Key, Value, Acc0)を適用する
2] 二番目以降の要素に対してFun(Key, Value, 一つ前の適用結果)を実行する
3] 一番最後に要素に対する適用結果がAccとなり、foldl関数呼び出し元に返される
キーの降順に、木の要素の畳み込みを行う。
畳み込み:
1] 木の始めの要素に対してFun(Key, Value, Acc0)を適用する
2] 二番目以降の要素に対してFun(Key, Value, 一つ前の適用結果)を実行する
3] 一番最後に要素に対する適用結果がAccとなり、foldr関数呼び出し元に返される
畳み込み関数がfalseを返すまで、キーの昇順に、木の要素の畳み込みを行う。
畳み込み:
1] 木の始めの要素に対してFun(Key, Value, Acc0)を適用する
2-a] 関数適用結果が{false, AccTmp}の場合は、そこで畳み込みは終了する (3へ)
2-b] 関数適用結果が{true, AccTmp}の場合は、二番目以降の要素に対してFun(Key, Value, AccTmp)を実行する
3] 一番最後に要素に対する適用結果タプルの二番目の値がAccとなり、foldl_while関数呼び出し元に返される
畳み込み関数がfalseを返すまで、キーの降順に、木の要素の畳み込みを行う。
畳み込み:
1] 木の始めの要素に対してFun(Key, Value, Acc0)を適用する
2-a] 関数適用結果が{false, AccTmp}の場合は、そこで畳み込みは終了する (3へ)
2-b] 関数適用結果が{true, AccTmp}の場合は、二番目以降の要素に対してFun(Key, Value, AccTmp)を実行する
3] 一番最後に要素に対する適用結果タプルの二番目の値がAccとなり、foldr_while関数呼び出し元に返される