BTreeMap

キーが整列順で保持される連想配列。B木(多分木の平衡探索木)が基盤で、Rust 標準ライブラリの BTreeMap が代表。HashMap(swiss-table)が「順不同・平均 O(1)」なのに対し、こちらは「整列・範囲クエリ可・O(log n)」。

なぜ二分木でなく B木か

平衡二分探索木(赤黒木等)でも O(log n) は出るが、各ノードがキー1個=ポインタ追跡(キャッシュミス)が深さ分発生する。B木は 1ノードに多数のキーを詰めるので:

→ メモリ階層(キャッシュ)に優しいのが現代の B木採用理由。元々はディスクブロック単位の探索(DB/ファイルシステム)向けだった発想を、RAM のキャッシュラインに転用した形。Rust の BTreeMap は1ノードに最大11要素程度を持つ。

HashMap との比較

BTreeMap (B木)HashMap (ハッシュ表)
探索/挿入O(log n)平均 O(1) / 最悪 O(n)
キーの順序整列して保持無秩序
範囲クエリ range(a..b)できるできない
最小/最大・ソート列挙できる(first/last/順次走査)できない(別途ソート要)
必要な性質キーが Ord(順序)キーが Hash + Eq
メモリ局所性ノードに密集制御バイト+スロット

いつ使うか

use std::collections::BTreeMap;
let mut m = BTreeMap::new();
m.insert(3, "c"); m.insert(1, "a"); m.insert(2, "b");

// 整列順でイテレート(HashMap では保証されない)
for (k, v) in &m { /* 1,2,3 の順 */ }

// 範囲クエリ(BTreeMap の真価)
for (k, v) in m.range(2..) { /* k>=2 だけ */ }

押さえどころ(カード化候補)

関連

Graph