私はtrieに配置したいセットのコレクションを持っています。セットトライを圧縮するアルゴリズム
通常の試行は要素の文字列で行われます。つまり、要素の順序が重要です。セットには定義された順序がないため、より大きな圧縮の可能性があります。例えば
、文字列を与え、"bc"
、および"c"
、私がトライを作成したい:
(*,3) -> ('a',1) -> ('b',1) -> ('c',1)
-> ('b',1) -> ('c',1)
-> ('c',1)
しかしセット{ 'a', 'b', 'c' }
、{ 'b', 'c' }
、{ 'c' }
与えられ、私は上記のトライを作成したり、任意の可能性これらの11の:
(*,3) -> ('a',1) -> ('b',1) -> ('c',1)
-> ('c',2) -> ('a',1)
(*,3) -> ('a',1) -> ('c',1) -> ('b',1)
-> ('b',1) -> ('c',1)
-> ('c',1)
(*,3) -> ('a',1) -> ('c',1) -> ('b',1)
-> ('c',2) -> ('a',1)
(*,3) -> ('b',2) -> ('a',1) -> ('c',1)
-> ('c',1)
-> ('c',1)
(*,3) -> ('b',1) -> ('a',1) -> ('c',1)
-> ('c',2) -> ('b',1)
(*,3) -> ('b',2) -> ('c',2) -> ('a',1)
-> ('c',1)
(*,3) -> ('b',1) -> ('c',1) -> ('a',1)
-> ('c',2) -> ('b',1)
(*,3) -> ('c',2) -> ('a',1) -> ('b',1)
-> ('b',1) -> ('c',1)
(*,3) -> ('c',2) -> ('a',1) -> ('b',1)
-> ('b',1)
(*,3) -> ('c',2) -> ('b',1) -> ('a',1)
-> ('b',1) -> ('c',1)
(*,3) -> ('c',3) -> ('b',2) -> ('a',1)
したがって、圧縮のためのスペース(7つのノードから4)があります。
I 容疑者子どもの相対頻度に応じて各ノードでローカル注文を定義するとしますが、それはあまりにも高価かもしれません。
ホワイトボードにヒットする前に、自分の圧縮アルゴリズムでクラックを開始する前に、既存の圧縮アルゴリズムがありますか?それはどれくらい費用がかかりますか?それはバルクプロセスか、または挿入/削除ごとに行うことができますか?
私はトライはセットを表現するための非常に良い構造ではないと思います。ビット配列のコレクションは良くないでしょうか?あなたは何の操作を期待していますか?どうしてそんなにメモリについて心配していますか? – svick
@svick:おそらく、私のセットは要素の大きな世界から引き出されているので、ビット配列はあまり効率的でないかもしれません。 (サブセット、周波数)のペアを繰り返します。私にはたくさんのデータがあるからです。 – rampion
あなたはどんな操作をしますか?伝統的なトライは、与えられた文字列がそれが表す文字列に含まれているかどうかを効率的に伝えることができます。あなたのトライが構造体のサイズを最小限にするために文字列を再注文する場合、与えられた文字集合がトライに含まれているかどうかを実際にどのようにテストできますか?すべての順列を検索する必要があるようです。 – Weeble