Arbol de sufijos Patricia ayuda!

JuAn4k4

Pues resulta que tengo hasta el domingo para averiguar como buscar si una palabra "ol" es subcadena de cualquier otra incluida en un arbol.

La cosa es que en el arbol estan todas las palabras del diccionario, y tengo que saber como buscar la mayor palabra de el arbol patricia, que tenga como subcadena la otra ( "ol" ).

en el diccionario aparecerian por ejemplo : futbol , hola, etc..

El patricia lo tengo montado ( Y eso que no se como funciona ) de ahi mi problema para implementar esta mierda que me han mandado para el domingo y sino .... pues suspenso.

El arbol es de sufijos por eso no entiendo que nos pidan cadenas... también le pregunte al profesor.

Ando completamente perdido, a ver si alguien ha usado antes esta estructura y sabe como va.. aunque ya imagino que no muchos la habran llegado a conocer aunque si usar.

bLaKnI

Primero de todo: que estas estudiando y para que asignatura es? Situanos porque las respuestas pueden variar muchisimo, si estas estudiando Programación II o Estructuras de Datos I o por ejemplo, Linguistica Computacional, o por ejemplo Algebra II con teoria de gráfos unidireccionales... Teoria de automatas...

Situanos.

2º) http://en.wikipedia.org/wiki/Radix_tree

Creo que se explica bastante bien.

JuAn4k4

El arbol esta ya implementado.

La asignatura es Tecnicas avanzadas de programación, pero basicamente son estructuras de datos si.

El arbol hay que implementarlo ( ya lo tengo ) , busquedas e inserciones.

Tengo que cojer un palabro y buscar las palabras más grandes que tengan como subcadena al palabro.

Encontrar un sufijo es muy sencillo, pero una subcadena, esque no se me ocurre nada.

Por ejemplo en el ejemplo de wikipedia de los romanos, buscar el palabro "man" y encontrar romanus.

El problema es encontrar donde esta "man" porque luego es bajar hasta abajo del todo del arbol (creo).

Y no creo que sea buscando subcadenas O(n) en todas las palabras del diccionario O(n) porque es un O(n2) y ademas el palabro es cualquier convinacion de letras de una secuencia de caracteres, por lo que se me va a las nuves el tiempo, se pega hasta mañana ejecutando.

LOc0

Yo tiraría por ver cómo se puede formar la subcadena. Es decir, el "man" puede ser un nodo entero o formar parte de varios (hasta 3). En el caso del ejemplo de la wikipedia, para llegar a romanus se pasa por OM-AN, pero en otro podría ser MA-NA o M-A-N, etc... Vamos, que sería ir analizando los nodos para ver si entre sus antecesores y sucesores se forma la subcadena. Puedes buscarte la letra del medio de la subcadena en los nodos y en los que la contengan tiras hacia arriba buscando la M y hacia abajo buscando la N (cuando digo hacia arriba es hacia la izquierda en el propio nodo y luego ya hacia el antecesor). Una vez tengas localizado el MAN ya es tirar hacia abajo por el camino más largo.

Así de primeras no se me ocurre mucho más...

Salu2 ;)

JuAn4k4

Lo he pensado detenidamente y creo que no se puede hacer bien con este arbol, ya que "man" aparecera en más sitios, por ejemplo en: balonmano, y eso esta en la otra punta del arbol.

No le veo sentido.

Buscar prefijos si que es facil, ya que para eso esta hecho ! porque se trata de usar el mismo algoritmo que insertar, que lo inserta entre padre e hijo, pues sus hijos (por ej. man- co sera el "co") seran las palabras que contengan como prefijo a "man".

PD: Cada nodo tiene toda la palabra entera.

En definitiva, creo que el profesor se ha colado o algo porque no es posible buscar ahi subcadenas.

LOc0

No tenía mucha idea de este árbol, la verdad. Ahora sé un poquito (muy poquito) más.

Según he podido entender en cada nodo se guarda una palara y el nº de BIT dónde mirar para decidir el camino de la izquierda o la derecha. Para buscar las palabras que comparten prefijo por lo visto se empieza por la raíz y se va elegiendo camino hasta que nos topamos con un nodo cuyo nº de BIT es mayor que la longitud en bits del prefijo que buscamos. Entonces paramos en ese nodo que se convierte en el raíz del árbol de palabras que comparten prefijos. (Sacado de -> http://www.codeproject.com/KB/string/PatriciaTrieTemplateClass.aspx)

Las palabras que contienen la subcadena "caca" son el conjunto de las:

a) Las que tienen el PREfijo "caca" (Estas si sabes localizarlas)

b) Las que tienen el prefijo Xcaca

c) Prefijo XYcaca

d) Prefijo XYZcaca
.
.
.
n) Las que tienen el SUfijo "caca" (Estas creo que tb se pueden encontrar fácilmente)

Podrías ir probando con estos prefijos "genéricos" con BITS "difusos", de tal forma que cuando llegues a una bifurcación tires por los dos lados al mismo tiempo (bueno, al mismo tiempo no, utilizando backtracking). La cosa sería ver hasta dónde sigues construyendo prefijos de palo (palabra más larga con el sufijo "caca"??)...

Ahora bien, de la complejidad O() npi :( (Intuitivamente creo que es menor que ir buscando la subcadena en cada nodo de longitud >= que el palabro buscado, pero cuánto, no lo sé)

Salu2 ;)

Soleil

Echa un vistazo aquí a ver si te ayuda
http://www.allisons.org/ll/AlgDS/Tree/Suffix/

JuAn4k4

#6 Teniendo en cuenta que puedes crear prefijos de longitud infinita, pues tienes un algoritmo infinito, y puede ser que un palabro no sea subcadena de ninguna palabra.

Tienes 29 posibilidades de la 'a' a la 'z' en cada posicion que te inventas

zcaca
xcaca
ycaca
...

zzcaca
zxcaca
...
xzcaca
xycaca
...
aacaca
zzzcaca
....
aaacaca

pero no sabes donde ni cuando parar. O(29n) siendo n las posiciones del prefijo que te inventas.

Sigo en mis trece, no se puede.

Si se puede como dices las palabras que empiezan por caca- ( Que para eso es el arbol ) o las que terminan en -caca. ( Dependiendo de como este implementado, en mi caso el primero ( prefijos )

PD: Que significa esta linea:

A given suffix tree can be used to search for a substring, pat[1..m] in O(m) time.

Con un sufijo dado no? Pero y si no te lo dan ? xD

LOc0

#8 Podrías parar si te pasas de una longitud máxima (la palabra más larga del diccionario), pero vamos, estoy contigo es que es mala idea.

Por cierto, aquí hablan de usar un PATRICIA tree para buscar subcadenas -> http://www.cs.cmu.edu/afs/cs/academic/class/15492-f07/www/scribe/lec15/lecture15.pdf

Lo digo porque a lo mejor imposible no es ¬¬...

Ánimo.

Salu2 ;)

JuAn4k4

Vaya ahi pone que se puede hacer en un patricia en O(m + log n) pero no lo explica, explica haciendolo de otra forma.

Pero la cosa es, que en el ejemplo ese, solo tiene 1 string y la "p", pero yo tengo un diccionario (strings) y una "p" que es cualquier permutacion de una secuencia de hasta 5 caracteres de longitud m hasta 2 (abcd -> tambien valen ab ac ad abc abd etc.. ). ( salen unos 100.000) , por lo que es O(m2 + log n*q) siendo "q" los 100k esos.

Gracias de todas formas.

Mierda, si que se puede
http://en.wikipedia.org/wiki/Suffix_tree#Applications

pero no dicen como.

EDIT:
Esto he encontrado, dice que se puede resolver en O(n+k) creo que n es el tamaño de la substring y k el numero de ocurrencias donde se encuentre la subcadena. A ver si encuentro alguno de los algoritmos que dice al final " the Knuth-
Morris-Pratt, Boyer-Moore, or even the Aho-Corasick algorithm"

Suffix trees yield a very attractive solution to this database problem. A
generalized suffix tree T for the strings in the database is built in 0(m) time and,
more importantly, requires only 0(m) space. Any single string S of length n is found
in the database, or declared not to be there, in 0(n) time. As usual, this is
accomplished by matching the string against a path in the tree starting from the root.
The full string S is in the database if and only if the matching path reaches a leaf of
T at the point where the last character of S is examined. Moreover, if S is a substring
of strings in the database then the algorithm can find all strings in the database
containing S as a substring. This takes O(n + k) time, where k is the number of
occurrences of the substring. As expected, this is achieved by traversing the subtree.
below the end of the matched path for S. If the full sting S cannot be matched
against a path in T, then S is not in the database and neither is it contained in any
string there. However, the matched path does specify the longest prefix of S that is
contained as a substring in the database.
The substring problem is one of the classic applications of suffix trees. The
results obtained using a suffix tree are dramatic and not achieved using the Knuth-
Morris-Pratt, Boyer-Moore, or even the Aho-Corasick algorithm.

Joer me he leido todo y siempre hablan de lo mismo, tener 1 cadena y encontrar en ella la subcadena, pero yo tengo un diccionario entero :S, le van a dar por el culo, total es 1 de 4 practicas...

Necesito un 2 sobre 10 en las practicas, malo sera....

Bueno por lo menos esto se queda aqui para la posteridad , igual a alguien le sirve.

1

Usuarios habituales

  • JuAn4k4
  • LOc0
  • Soleil
  • bLaKnI