平衡二分木 vs 非平衡二分木

平衡二分木と非平衡二分木の違い、木の形状がパフォーマンスに与える影響、AVL 木や Red-Black 木などの自己平衡木が存在する理由を理解します。

Properties

詳細な説明

平衡木 vs 非平衡木

二分木が平衡であるとは、すべてのノードについて、左右の部分木の高さの差が最大 1 であることです。非平衡(偏った)木はノードが一方に集中し、パフォーマンスが O(log n) から O(n) に低下します。

視覚的比較

平衡(高さ 3):           非平衡(高さ 5):
        4                    1
       / \                    \
      2   6                    2
     / \ / \                    \
    1  3 5  7                    3
                                  \
                                   4
                                    \
                                     5

パフォーマンスへの影響

操作 平衡 O(log n) 非平衡 O(n)
探索 100万ノードで ~20 ステップ 最大 100万ステップ
挿入 100万ノードで ~20 ステップ 最大 100万ステップ
削除 100万ノードで ~20 ステップ 最大 100万ステップ

不均衡の原因

ソート済みまたはほぼソート済みのデータを通常の BST に挿入すると退化木が作成されます。[1, 2, 3, 4, 5] を挿入すると右に偏った連結リストになります。

自己平衡木

いくつかの木の変形は自動的にバランスを維持します:

  • AVL 木: 厳密なバランス — すべてのノードで高さの差が最大 1。挿入/削除のたびに回転を使用。
  • Red-Black 木: 緩やかなバランス — 高さが最大 2 * log(n+1) であることを保証。Java TreeMap、C++ std::map で使用。
  • B-Tree: データベースやファイルシステムのディスクベースストレージに使用される多分岐平衡木。

ユースケース

バランスの理解は適切なデータ構造の選択に不可欠です。本番システムでデータベースインデックスに非平衡 BST を使用すると、O(log n) のクエリが O(n) のスキャンになる可能性があります。これがすべての主要データベースがインデックスに平衡木の変形(B-tree、B+ tree)を使用する理由です。

試してみる — Binary Tree Visualizer

フルツールを開く