Una implementación de la estructura de datos Trie en Go. Proporciona más funciones que la búsqueda de prefijo habitual de Trie y está diseñada para usarse para autocompletar.
Se puede probar una demostración de WebAssembly en shivamMg.github.io/trie.
Las claves son []string
en lugar de string
, lo que admite más casos de uso; por ejemplo, []string{el rápido zorro marrón} puede ser una clave donde cada palabra será un nodo en el Trie.
Soporte para la tecla Poner y Eliminar
Soporte para búsqueda de prefijos; por ejemplo, la búsqueda de nación puede devolver nación , nacional , nacionalismo , nacionalista , etc.
Soporte para Editar búsqueda de distancia (también conocida como distancia de Levenshtein); por ejemplo, la búsqueda de trigo puede devolver palabras similares como trigo , trampa , calor , qué , etc.
El orden de los resultados de la búsqueda es determinista. Sigue el orden de inserción.
tri := trie.New()// Poner claves ([]cadena) y valores (cualquiera)tri.Put([]cadena{"el"}, 1)tri.Put([]cadena{"el", " rápido", "marrón", "zorro"}, 2)tri.Put([]string{"el", "rápido", "deportivo", "coche"}, 3)tri.Put([]string{" el", "verde", "árbol"}, 4)tri.Put([]cadena{"una", "manzana", "árbol"}, 5)tri.Put([]cadena{"una", "paraguas"}, 6)tri.Root(). Print()// Salida (prueba completa con terminales que terminan en ($)):// ^// ├─ ($)// │ ├─ rápido// │ │ ├─ marrón// │ │ │ └─ zorro ($)// │ │ └─ deportivo// │ │ └─ auto ($)// │ └─ verde// │ └─ árbol ($)// └─ an/ / ├─ manzana// │ └─ árbol ($)// └─ paraguas ($)resultados := tri.Search([]string{"the", "quick"})for _, res := rango resultados.Resultados { fmt.Println( res.Clave, res.Valor) }// Salida (búsqueda basada en prefijos):// [el rápido zorro marrón] 2// [el rápido auto deportivo] 3key := []string{"the", "tree"}results = tri.Search(key , trie.WithMaxEditDistance(2), // Se puede insertar, eliminar y reemplazar una edicióntrie.WithEditOps())for _, res := rango de resultados.Resultados { fmt.Println(res.Key, res.EditDistance) // EditDistance es el número de ediciones necesarias para convertir a [el árbol]}// Salida (los resultados no están a más de 2 ediciones de [el árbol]):// [el] 1// [el árbol verde] 1// [un manzano] 2// [un paraguas] 2resultado := resultados.Resultados[2]fmt.Printf("Para convertir %v a %v:n", resultado.Key, key)printEditOps(result.EditOps)// Salida (editar operaciones necesarias para convertir un resultado en [el árbol]):// Para convertir [un manzano] en [el árbol]:// - eliminar "un"// - reemplace "apple" con "the"// - no edite "tree"results = tri.Search(key, trie.WithMaxEditDistance(2), trie.WithTopKLeastEdited(), trie.WithMaxResults(2))for _, res := rango de resultados.Resultados { fmt.Println(res.Key, res.Value, res.EditDistance) }// Salida (los 2 resultados menos editados):// [el] 1 1// [el árbol verde] 4 1
https://en.wikipedia.org/wiki/Levenshtein_distance#Iterative_with_full_matrix
http://stevehanov.ca/blog/?id=114
https://gist.github.com/jlherren/d97839b1276b9bd7faa930f74711a4b6