Tengo una colección de conjuntos que me gustaría colocar en un trie.Algoritmos para la compresión de conjuntos de intentos
Los intentos normales están hechos de cadenas de elementos, es decir, el orden de los elementos es importante. Los conjuntos carecen de un orden definido, por lo que existe la posibilidad de una mayor compresión.
Por ejemplo, dadas las cuerdas "abc"
, "bc"
y "c"
, que crearía el trie:
(*,3) -> ('a',1) -> ('b',1) -> ('c',1)
-> ('b',1) -> ('c',1)
-> ('c',1)
pero teniendo en cuenta los conjuntos { 'a', 'b', 'c' }
, { 'b', 'c' }
, { 'c' }
, que podría crear el trie anteriormente, o cualquier de estos once:
(*,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)
Así que obviamente hay espacio para la compresión (7 nodos a 4).
I sospechoso definir un pedido local en cada nodo depende de la frecuencia relativa de sus hijos lo haría, pero no estoy seguro, y podría ser demasiado caro.
Entonces, antes de presionar la pizarra, y comenzar a descifrar mi propio algoritmo de compresión, ¿existe uno existente? ¿Qué tan caro es? ¿Es un proceso masivo, o puede hacerse por inserción/eliminación?
Creo que trie no es una estructura muy buena para representar conjuntos. ¿No sería mejor una colección de matrices de bits? ¿Qué operaciones esperas hacer?¿Por qué te preocupas tanto por la memoria? – svick
@svick: Tal vez, pero mis conjuntos se extraen de un gran universo de elementos, por lo que las matrices de bits pueden no ser muy eficientes. Itera a través de pares (subconjunto, frecuencia). Porque tengo muchos datos. – rampion
¿Qué operaciones tiene la intención de hacer? Un trie tradicional puede decirle de manera eficiente si una cadena determinada está o no contenida en el conjunto de cadenas que representa. Si su trie reordena sus cadenas para minimizar el tamaño de la estructura, ¿cómo puede realmente probar si un conjunto dado de caracteres está contenido en el trie? Parece que necesitarías buscar cada permutación. – Weeble