肯定的な結果:永続性はあまりコストがかかりません。最大でスローダウンで、すべてのデータ構造を完全に永続化できることを示すことができます。O (lgn )
証明:標準のデータ構造(バランスの取れたバイナリツリーなど。詳細についてはこの回答の最後を参照してください)を使用して、配列を取得し、永続化することができます。これにより、スローダウンが発生します。各配列へのアクセスには、非永続配列のO (1 )時間ではなく、永続データ構造でO (lg n )時間かかります。ここで、RAMモデルでの実行時間がO (f (n ))である命令型アルゴリズムを使用します。ここで、nは使用されるメモリの量を示します。すべてのメモリを1つの大きな配列として表します(O (lgn )O (lgn )O (1 )O (f(n ))n要素)、永続マップを使用して永続化します。命令型アルゴリズムの各ステップでは、最大で O (lg n )の減速が発生するため、合計実行時間は O (f (n )lg n )になります。nO(lgn)O(f(n)lgn)
どうやらもう少し良くすることが可能です:明らかに、以下に引用するデメインの論文の技術を使用して、減速係数を(予想、償却時間)に減らすことができます-しかし、私は詳細に精通していませんその仕事ので、私はこれを自分で保証することはできません。この観察をしてくれたjbappleに感謝します。O(lglgn)
負の結果:一部のデータ構造では、速度の低下を避けることはできません。3番目の質問に答えるために、永続化すると速度が低下することがわかっているデータ構造が存在します。
nO(1)O(1)Ω(lglgn)
下限はMihai Patrascuに起因しますが、この断定された下限の証拠の詳細を提供する情報源への引用はありません。
O(1)
関数型プログラミング言語との強いつながりもあります。特に、純粋に機能的な方法で(突然変異なしで)実装できるすべてのデータ構造は、すでに永続的なデータ構造です。(逆は必ずしもそうではありません。)目を細めたい場合は、これを何らかの弱い分類の部分的定理としてとらえることができます。命令型言語の場合、非永続的なものと同じ時間制限を持つ永続的なデータ構造があります。私はこれがおそらくあなたが探していたものではないことを理解しています-それは主に状況のささいな言い直しにすぎません。
O(lgn)
ℓdd
nO(lgn)O(lgn)O(lgn)
次のリソースで、きれいな写真でより多くの説明を見つけることができます。
それはあなたに主なアイデアを与えます。世話をする追加の詳細がありますが、詳細はこの質問の範囲外です。幸いなことに、これはすべて標準のものであり、そのようなデータ構造を構築する方法に関する文献には多くの情報があります。上記のリソースが十分ではなく、永続的な配列データ構造の構築の詳細についてさらに情報が必要な場合は、お気軽に質問してください。