2011-03-02 9 views
10

Esta es una entrevista question: Encuentre todas las subcadenas (en inglés) de una cadena determinada. (cada = cada, siempre, muy).Buscar todas las subcadenas (en inglés) de una cadena determinada

Obviamente, podemos recorrer todas las subcadenas y verificar cada una en un diccionario de inglés, organizado como un conjunto. Creo que el diccionario es lo suficientemente pequeño como para caber en la memoria RAM. ¿Cómo organizar el diccionario? Por lo que recuerdo, el comando original spell cargó el archivo words en un bitmap, representaba un conjunto de valores hash de palabras. Yo partiría de eso.

Otra solución es un trie construido a partir del diccionario. Usando el trie podemos recorrer todos los caracteres de cadena y verificar el trie para cada caracter. Supongo que la complejidad de esta solución sería la misma en el peor de los casos (O(n^2))

¿Tiene sentido? ¿Sugerirías otras soluciones?

+0

Complejidad de bucle sobre todas las subcadenas comprobación de hashes depende de su cálculo hash - hay subcadenas Theta (n^2) de longitud promedio no O (1), por lo que necesita calcular un hash parcial que puede incrementar con un carácter a la vez para mantener O (n^2) en general. Lo mismo puede decirse de la búsqueda de trie o DAWG, por supuesto, desearía descender gradualmente comprobando todas las cadenas a partir de un punto determinado, pero probablemente sea más obvio que es lo correcto. –

+0

Caminar por el trie, comenzando con cada posible carácter de inicio y emitir todas las palabras legales a medida que las encuentre parece bastante eficiente; dejas de buscar tan pronto como encuentras una secuencia de caracteres que no puede ser un prefijo de una palabra, y no puedes hacer mejor que O (n^2) - es posible que cada subcadena sea válida, y hay O (n^2) de esos. –

Respuesta

1

No estoy seguro de que Trie trabaje fácilmente para que coincida con las palabras secundarias que comienzan en el medio de la cadena.

Otra solución con un concepto similar es utilizar una máquina de estado o expresión regular. la expresión regular es solo word1 | word2 | .... No estoy seguro si los motores de expresiones regulares pueden manejar una expresión que cubra todo el idioma inglés, pero no debería ser difícil construir la máquina de estado equivalente dado el diccionario.

Una vez que la expresión regular se compila \ la máquina de estado se construye la complejidad del análisis de una cadena específica es O (n)

+0

Esto es esencialmente lo mismo que la solución trie. – biziclop

+1

@ biziclop: he trabajado con una biblioteca que contiene un DFA de estado mínimo para todo el inglés y es sustancialmente más compacta que un trie estándar. Sí, es esencialmente lo mismo que el trie, pero es mucho más eficiente con la memoria. – templatetypedef

1

La primera solución puede ser refinado para tener un mapa hash diferente para cada longitud de palabra (a reducir las colisiones) pero aparte de eso, no puedo pensar en nada significativamente mejor.

6

El Aho-Corasick string matching algorithm que "construye una máquina de estados finitos que se asemeja a un trie con enlaces adicionales entre los distintos nodos internos".
Pero todo lo que se considera "construir un trie del diccionario de inglés y hacer una búsqueda simultánea de todos los sufijos de la cadena dada" debería ser bastante bueno para una entrevista.

Cuestiones relacionadas