関連する質問:バイナリ ツリー O(N) のインオーダー ツリー トラバーサルの時間の複雑さ? 、ただし、反復子は O(1) スペースのみの消費を許可しているのに対し、再帰によるトラバーサル (O(log N) スペース内) に基づいています。
C++ では、通常、標準コンテナーのイテレーターをインクリメントすることは O(1) 操作であるという要件があります。ほとんどのコンテナでは自明に証明されていますが、その他のコンテナでmap
は少し難しいようです。
- a
map
がスキップ リストとして実装されている場合、結果は明らかです。 - ただし、それらはしばしば赤黒木として (または少なくとも二分探索木として) 実装されます。
そのため、順序通りのトラバーサル中に、「次の」値に簡単に到達できない瞬間があります。たとえば、左のサブツリーの右下の葉を指している場合、次にトラバースするノードはルートであり、数depth
歩離れています。
アルゴリズムの複雑さ (「ステップ」の観点から) がO(1)に償却されたことを「証明」しようとしましたが、これは問題ないようです。しかし、私はまだデモンストレーションを行っていません。
これは、深さ 4 のツリーについてトレースした小さな図です。(ノードの場所にある) 数字は、順序どおりのトラバーサル中にそのノードから次のノードに移動するステップの数を表します。
3
2 2
1 1 1 1
1 2 1 3 1 2 1 4
注: これがより大きなツリーのサブツリーである場合、右端の葉のコストは 4 です。
ノードの合計数が 15 の場合、合計は 28 です。したがって、ノードあたりのコストは平均で 2 未満であり、(それが維持されれば) 償却コストとしては優れています。そう:
- 順序通りのトラバーサル中、バランスの取れた (完全な) 二分探索木に対してイテレータを実際に O(1) インクリメントしていますか?
- 完全ではない二分探索木をカバーするように結果を拡張できますか?