Ho una collezione di set che vorrei inserire in un trie.Algoritmi per la compressione dei tentativi impostati
I tentativi normali sono costituiti da stringhe di elementi, ovvero l'ordine degli elementi è importante. Gli insiemi mancano di un ordine definito, quindi c'è la possibilità di una maggiore compressione.
Ad esempio, date le stringhe "abc"
, "bc"
e "c"
, mi piacerebbe creare il trie:
(*,3) -> ('a',1) -> ('b',1) -> ('c',1)
-> ('b',1) -> ('c',1)
-> ('c',1)
ma dato il set { 'a', 'b', 'c' }
, { 'b', 'c' }
, { 'c' }
, ho potuto creare il trie superiore, o qualsiasi di questi undici:
(*,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)
Quindi c'è ovviamente spazio per la compressione (7 nodi su 4).
ho sospetto definire un ordine locale in ogni nodo dipende dalla frequenza relativa dei suoi figli avrebbe fatto, ma non sono certo, e potrebbe essere eccessivamente costoso.
Quindi, prima di colpire la lavagna e iniziare a scricchiolare il mio algoritmo di compressione, ce n'è uno esistente? Quanto è costoso? È un processo di massa, o può essere fatto per-inserire/eliminare?
Penso che Trie non sia una struttura molto buona per rappresentare gli insiemi. Non sarebbe meglio una collezione di array di bit? Quali operazioni ti aspetti di fare?Perché ti preoccupi tanto della memoria? – svick
@svick: Forse, ma i miei set stanno attingendo da un grande universo di elementi, quindi i bit array potrebbero non essere molto efficienti. Iterare attraverso (sottoinsieme, frequenza) coppie. Perché ho molti dati. – rampion
Che operazioni intendete fare? Un trie tradizionale può dirvi in modo efficiente se una determinata stringa è contenuta nell'insieme di stringhe che rappresenta. Se il tuo trie riordina le sue stringhe per minimizzare la dimensione della struttura, come puoi testare effettivamente se un dato insieme di caratteri è contenuto nel trie? Sembra che tu abbia bisogno di cercare ogni permutazione. – Weeble