どのクラスのデータ構造を永続化できますか?


19

永続データ構造は不変のデータ構造です。それらに対する操作は、データ構造の新しい「コピー」を返しますが、操作によって変更されます。ただし、古いデータ構造は変更されません。一般に、効率性は、基礎となるデータの一部を共有し、データ構造の完全なコピーを回避することにより達成されます。

質問:

  • (同じまたは非常に類似した複雑さを維持しながら)永続化できるデータ構造のクラスに関する結果はありますか?

  • (同じまたは非常に類似した複雑さを維持しながら)すべてのデータ構造を永続化できますか?

  • (同じまたは非常に類似した複雑さを維持しながら)永続化できないデータ構造はありますか?


1
ランダム要素にアクセスするために、O(1)の複雑さを保持したままベクトルを永続化することはできません。
smossen


2
@smossenはそれを証明できますか?
リアルツスロー

1
最初の質問は非常に広範な質問です。永続化できるデータ構造のトピックに関する多くの結果があります。主題に関する本全体を書くこともできますし、一部の人々はこうします。例えば、岡崎の本は主題に関する古典です。このトピックに関する調査を実施しましたか?質問を絞り込むことができますか?現状では、このサイトに適したものには幅が広すぎると思われます。3番目の質問を別の質問に分割することもできますか?
DW

@Realz Slaw:正式に証明することはできませんが、それは常識だと思います。ベクトル(ハッシュテーブルを含む)の要素へのO(1)アクセスは、特定のハードウェアでのアドレスデコードの固定時間に依存します。永続性により、ベクトルインデックスに加えて1次元または2次元が追加されます。ただし、ハードウェアアドレスは1次元のままです。
smossen

回答:


22

肯定的な結果:永続性はあまりコストがかかりません。最大でスローダウンで、すべてのデータ構造を完全に永続化できることを示すことができます。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)

次のリソースで、きれいな写真でより多くの説明を見つけることができます。

  • http://toves.org/books/persist/index.htmlにある「バイナリ検索ツリー」および「ランダムアクセス構造」(具体的にはツリーメソッド)というラベルの付いたセクションを読んでください。

  • または、http://netcode.ru/dotnet/?artID = 6592#BinaryTreesおよび後続のセクションの一部をお読みください。

  • または、上記のDemaine論文の「機能データ構造」および「パスのコピー」(p.4以降)というラベルの付いたセクションを読んでくださいhttp ://erikdemaine.org/papers/ConfluentTries_Algorithmica/paper.pdf

それはあなたに主なアイデアを与えます。世話をする追加の詳細がありますが、詳細はこの質問の範囲外です。幸いなことに、これはすべて標準のものであり、そのようなデータ構造を構築する方法に関する文献には多くの情報があります。上記のリソースが十分ではなく、永続的な配列データ構造の構築の詳細についてさらに情報が必要な場合は、お気軽に質問してください。


最初の段落は本当に理解できませんが、赤黒木を使用して配列を永続化するにはどうすればよいですか?
G.バッハ

G.Bach @、「二分探索木」と「ランダム・アクセス構造」で(具体的には、ツリー方式)ラベルのセクションではかなり良い説明がありますtoves.org/books/persist/index.htmlが。別の素晴らしい説明については、netcode.ru / dotnet / ?artID = 6592BinaryTreesおよび以降のセクションを参照してください。それはあなたに主なアイデアを与えます。詳細はこの質問の範囲外ですが、これはすべて標準的なものです。そのようなデータ構造を構築する方法についての詳細が必要な場合は、別の質問をすることをお勧めします。
DW

4
O(lglgn)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.