Mam kolekcję zestawów, które chciałbym umieścić w trie.Algorytmy kompresji zestawu prób
Normalne próby są wykonane z ciągów elementów - to znaczy, kolejność elementów jest ważna. Zestawy nie mają zdefiniowanej kolejności, więc istnieje możliwość większej kompresji.
Na przykład, biorąc pod uwagę struny "abc"
, "bc"
i "c"
, chciałbym stworzyć Trie:
(*,3) -> ('a',1) -> ('b',1) -> ('c',1)
-> ('b',1) -> ('c',1)
-> ('c',1)
Ale biorąc pod uwagę zestawy { 'a', 'b', 'c' }
, { 'b', 'c' }
, { 'c' }
, mogę tworzyć powyższy Trie lub dowolny z nich jedenaście:
(*,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)
Więc nie ma oczywiście miejsca dla kompresji (7 węzłów do 4).
Podejrzewam definiowania zlecenie lokalne w każdym węźle zależy od względnej częstotliwości swoich dzieci zrobi to, ale nie jestem pewna, a to może być zbyt kosztowne.
Więc zanim uderzę w tablicę i zacznę łamać się przy moim własnym algorytmie kompresji, czy istnieje już jeden? Ile to kosztuje? Czy jest to proces zbiorczy, czy może być wykonywany za wstawieniem/usunięciem?
Myślę, że trie nie jest bardzo dobrą strukturą do przedstawiania zestawów. Czy zbiór bit bitów nie byłby lepszy? Jakie operacje zamierzasz wykonać?Dlaczego tak bardzo martwisz się pamięcią? – svick
@svick: Być może, ale moje zbiory pochodzą z dużej części elementów, więc tablice bitów mogą nie być zbyt wydajne. Iteracja par (podzbiór, częstotliwość). Ponieważ mam dużo danych. – rampion
Jakie operacje zamierzasz wykonywać? Tradycyjny gracz może efektywnie powiedzieć, czy dany ciąg jest zawarty w zestawie łańcuchów, które reprezentuje. Jeśli twój trie zmienia kolejność strun, aby zminimalizować rozmiar struktury, jak możesz sprawdzić, czy dany zestaw znaków jest zawarty w trie? Wygląda na to, że musisz szukać każdej permutacji. – Weeble