7

次の機能を持つペア (Key,T) を格納するためのマップのようなデータ構造 (C++) が必要です。

  • 新しい要素 (Key,T) を現在の構造に挿入できます
  • 現在の構造のキーに基づいて要素を検索できます
  • 構造の現在のバージョンの「スナップショット」を作成できます
  • スナップショットを作成した構造のバージョンの 1 つに切り替えて、そこからすべての操作を続行できます。
  • バージョンの 1 つを完全に削除する

必要ないもの

  • 構造からの要素の削除
  • 構造の異なるバージョンを 1 つにマージする
  • 現在構造体に格納されているすべての (または一部の) 要素に対する反復

言い換えれば、構築できる検索構造がありますが、いつでも履歴をジャンプして、構造の以前の/別のバージョンを別の方法で拡張できます。後で、これらの異なるバージョン間をジャンプできます。

私のプロジェクトでは、Key と T は整数またはポインター値である可能性が高く、文字列ではありません。

主な目的は、時間の複雑さを軽減することです。スペースの消費は二次的なものです (しかし、同様に妥当なはずです)。明確にするために、私にとっては log(N)+log(S) (N個の要素、S個のスナップショット)で十分ですが、速いほど良いです:)

実装方法の大まかなアイデアがあります---たとえば、構造が二分探索ツリーであるため、新しい要素を挿入すると、ルートから挿入場所までのパスを複製できますが、ツリーの残りの部分はそのままです。ツリー バージョンを切り替えることは、ルート ノードの別のバージョンを選択することと同じであり、一部の変更は単に表示されません。

ただし、このカスタム ツリーを効率的にする (自己均衡など) には、追加の作業と注意深いコーディングが必要です。もちろん、私はそれを自分で行うことができますが、おそらくそれを行うための既存のライブラリがすでに存在しますか?

また、おそらく私が知らないこの種のデータ構造には適切な名前があり、Google検索(またはSO検索)が完全に失敗します...

ご協力ありがとうございました!

4

2 に答える 2

4

あなたが探しているのは不変の地図だと思います。関数型 (または関数型に着想を得た) プログラミング言語 (Haskell や Scala など) には、STL にあるほとんどのコンテナーの不変バージョンがあります。挿入/削除などの操作は、要求された変更を含むコピーを含むマップのコピー (オリジナルを保持) を返します。各操作の時間とメモリの複雑さを軽減するために、コピーが元のデータ構造のできるだけ多くを指すことができるように、データ構造の設計に多くの作業が行われました。

詳細については、http: //www.amazon.co.uk/Purely-Functional-Structures-Chris-Okasaki/dp/0521663504などの書籍を参照してください。

于 2012-06-21T07:55:41.997 に答える
0

いくつかの永続的な検索ツリー ライブラリを検索しているときに、これに出くわしました。

http://cg.scs.carleton.ca/~dana/pbst/

必要な機能とまったく同じではありませんが、それにかなり近いようです。調査します。

(誰かが役に立つと思うかもしれないので、ここに投稿します)

于 2012-06-23T09:40:08.807 に答える