回答:
明白な候補は、永続的なバランスのとれたバイナリツリーです。リストしたすべての操作は、パスコピーを使用して、またはO (lg n )時間で実行できます。このランタイムを実現する方法の詳細については、以下で参照されているChris Okasakiの本または私の回答はこちらを参照してください。
もちろん、変形として、そのようなツリーの各リーフ自体が不変の配列(連続した値のシーケンス)を含むことができます。これにより、値の更新の効率が低下しますが、既存の値を変更するつもりがない場合は、追加して追加するだけで、状況によってはうまく機能する場合があります。このようにして、ベクトルは不変のシーケンスのシーケンスとして表され、葉に不変の配列を持つ平衡バイナリツリーとして表されます。これにより、高速なインデックス作成(葉の数の対数)、高速な追加と付加、高速な反復が可能になります。最悪の場合の漸近的な複雑さはこれより良くはありませんが、実際のパフォーマンスは大幅に向上する可能性があります。
標準的なリファレンスは、Chris Okasakiの1998年の著書「純粋に機能的なデータ構造」です。
こちらもご覧ください
このようなデータ構造の1つの実装について、正規表現の増分一致に関する記事で説明しました-http://jkff.info/articles/ire/#ropes-strings-with-fast-concatenationとそのセクションの前後のテキストを参照してください。
これは、さまざまな高さの一定のツリーです(Bツリーや2-3ツリーなど)。基本的には要素ごとのオーバーヘッドを回避するために、葉が(N、2N-1)配列である(2,3)ツリーです。((N、2N-1)配列は、長さがN..2N-1の範囲の配列です。)Nを大きくするとオーバーヘッドが小さくなりますが、分割と連結の複雑さが直線的に増加します。インデックス付け、分割、連結などの操作は、2〜3のツリーでの動作と非常に似ており、リーフレベルで一般化すると(N、2N-1)になります。