Estoy buscando una estructura de datos que almacene un conjunto de cadenas sobre un conjunto de caracteres , capaz de realizar las siguientes operaciones. Denotamos como la estructura de datos que almacena el conjunto de cadenas .D ( S ) S
Add-Prefix-Set
en : dado un conjunto de cadenas (posiblemente vacías), cuyo tamaño está limitado por una constante y cuyas longitudes de cadena están delimitadas por una constante, devuelve . Tanto estas constantes delimitadores son globales: son los mismos para todas las entradas .T D ( { t s | t ∈ T , s ∈ S } ) TGet-Prefixes
en : return . Tenga en cuenta que realmente no me importa qué estructura se utiliza para este conjunto, siempre que pueda enumerar su contenido en tiempo .{ a | a s ∈ S , a ∈ Σ } O ( | Σ | )Remove-Prefixes
en : devuelve .D ( { s | a s ∈ S , a ∈ Σ } )Merge
: dado y , devuelve .D ( S ∪ T )
Ahora, realmente me gustaría hacer todas estas operaciones en tiempo , pero estoy bien con una estructura que hace todas estas operaciones en tiempo , donde es la longitud de la cadena más larga en el estructura. En el caso de la fusión, me gustaría un tiempo de ejecución , donde es para el primero y el para la segunda estructura.o ( n ) n o ( n 1 + n 2 ) n 1 n n
Un requisito adicional es que la estructura es inmutable, o al menos que las operaciones anteriores devuelven estructuras 'nuevas' de modo que los punteros a las antiguas sigan funcionando como antes.
Una nota sobre la amortización: está bien, pero hay que estar atento a la persistencia. A medida que reutilizo estructuras viejas todo el tiempo, estaré en problemas si llego al peor de los casos con un conjunto particular de operaciones en la misma estructura (ignorando las nuevas estructuras que crea).
Me gustaría usar dicha estructura en un algoritmo de análisis en el que estoy trabajando; la estructura anterior mantendría el lookahead que necesito para el algoritmo.
Ya he considerado usar un trie , pero el problema principal es que no sé cómo fusionar los intentos de manera eficiente. Si el conjunto de cadenas para Add-Prefix-Set
consta de solo cadenas de un solo carácter, entonces podría almacenar estos conjuntos en una pila, lo que le daría tiempos de ejecución para las primeras tres operaciones. Sin embargo, este enfoque tampoco funciona para la fusión.
Finalmente, tenga en cuenta que no estoy interesado en los factores: esto es constante para todo lo que me importa.
Add-Prefix-Set
)
Add-Prefix-Set
o comienzas con un conjunto arbitrario de cadenas?