2

以下のAlexTaggartの発言の後に編集されました。

私はジッパーを使用して、何千ものノードに成長する可能性のあるツリーを簡単にトラバースして編集しています。各ノードは、最初に作成された時点では不完全です。データは常にランダムな位置で追加/削除され、リーフノードはブランチに置き換えられます。

ツリーは非常に不均衡になる可能性があります。ノードへの高速ランダムアクセスも重要です。

実装は、ジッパーを使用してツリーをトラバースし、キーでインデックス付けされたノードのハッシュテーブルを作成することです。言うまでもなく、上記は次のように非常に非効率的です。

  • 各ノードの2つのコピーを作成する必要があります
  • 変更は、2つのデータ構造(ツリーとハッシュマップ)間で一貫してミラーリングする必要があります。

要するに、トラバース/更新の容易さと、clojureのハッシュテーブルへの高速アクセスを組み合わせるための時間/スペース効率の良い方法はありますか?

4

1 に答える 1

2

Clojureのデータ構造は永続的であり、構造共有を使用します。これは、追加、削除、累積などの操作が、説明したほど非効率的ではないことを意味します。すでに存在するものを複製しないため、メモリコストは最小限に抑えられます。

デフォルトでは、Clojureのデータ構造は不変です。したがって、ツリーのような構造内のノードは、ある種の参照型(Varなど)を使用しない限り、それ自体を更新しません。ノードにアクセスするための最良の方法についてアドバイスするための特定のユースケースについては十分にわかりません。ネストされた構造のノードにアクセスする1つの方法は、ノードへのパスを指定してその値を返すget-in関数です。

これがあなたの問題の解決に役立つことを願っています。

于 2012-12-08T13:28:55.493 に答える