Si la atención se centra en el rendimiento, que implementaría un algoritmo basado en una estructura trie
(funciona bien para encontrar las palabras en un texto, o para ayudar a corregir una palabra, pero en su caso para encontrar rápidamente todas las palabras que contiene una palabra dada o todas menos una letra, por ejemplo).
Siga primero el enlace de la wikipedia arriba.Tries
son las palabras más rápido método de clasificación (n palabras, la búsqueda s, O (n) para crear el trie, O (1) para buscar s (o si se prefiere, si un es el longitud promedio, O (y) para el trie y O (s) para la búsqueda)).
Una aplicación rápida y fácil (para ser optimizado) de su problema (palabras similares) se compone de
- Hacer el trie con la lista de palabras, que tiene todas las cartas en un índice frontal y posterior (ver el siguiente ejemplo)
- para buscar s, iterar desde s [0] para encontrar la palabra en el trie, entonces s [1], etc ...
- En el trie, si el número de letras encontradas es len (s) - k aparece la palabra, donde k es la tolerancia (falta 1 letra, 2 ...).
- El algoritmo se puede extender a las palabras en la lista (ver más abajo)
ejemplo, con las palabras car
, vars
.
Construyendo el trie (una letra grande significa una palabra termina aquí, mientras que otra puede continuar). El >
es post-index (seguir adelante) y <
es pre-index (ir hacia atrás). En otro ejemplo, es posible que tengamos que indicar también la letra inicial, que no se presenta aquí para mayor claridad.
La <
y >
en C++, por ejemplo, sería Mystruct *previous,*next
, el significado de a > c < r
, puede ir directamente a
-c
, y en sentido inverso, también a
-R
.
1. c < a < R
2. a > c < R
3. > v < r < S
4. R > a > c
5. > v < S
6. v < a < r < S
7. S > r > a > v
buscando estrictamente para coche el trie le da acceso a 1., y usted se encuentra coche (que habría encontrado también todo lo que empieza con coche, sino también nada con el coche en el interior - que es no en el ejemplo, pero vicar por ejemplo se habría encontrado en c > i > v < a < R
).
Para buscar permitiendo al mismo tiempo 1-letra equivocada tolerancia/faltante, iterar por cada letra del s y, contar el número de consecutivo - o saltándose 1 letra - las cartas que recibe de s en el trie .
buscando car
,
c
: buscar el trie para c < a
y c < r
(letra que falta en s).Para aceptar una letra incorrecta en una palabra w, intente saltar en cada iteración la letra incorrecta para ver si ar
está detrás, esto es O (w). Con dos letras, O (w ²) etc ... pero se podría agregar otro nivel de índice al trie para tener en cuenta saltar sobre letras, lo que hace que el trie sea complejo y codicioso con respecto a la memoria.
a
, entonces r
: igual que el anterior, pero buscando hacia atrás, así
Esto es sólo para dar una idea sobre el principio - el ejemplo anterior puede tener algunos problemas técnicos (Voy a comprobar de nuevo mañana).
wiki de la comunidad porque no hay una respuesta correcta a su pregunta –
posible duplicado de [un mejor ranking algoritmo de similitud de cadenas de longitud variable] (http://stackoverflow.com/questions/653157/a-better-similarity -ranking-algorithm-for-variable-length-strings) –
Hay * cargas * de preguntas que ya tratan con * exactamente * este tema. Por favor busca antes de hacer una pregunta. –