Uma implementação da estrutura de dados Trie em Go. Ele fornece mais recursos do que a pesquisa de prefixo Trie normal e deve ser usado para preenchimento automático.
Uma demonstração do WebAssembly pode ser testada em shivamMg.github.io/trie.
As chaves são []string
em vez de string
, suportando assim mais casos de uso - por exemplo, []string{the quick brown fox} pode ser uma chave onde cada palavra será um nó no Trie
Suporte para chave Put e chave Delete
Suporte para pesquisa de prefixo - por exemplo, a pesquisa por nação pode retornar nação , nacional , nacionalismo , nacionalista , etc.
Suporte para pesquisa de edição de distância (também conhecida como distância de Levenshtein) - por exemplo, pesquisar trigo pode retornar palavras de aparência semelhante, como trigo , cheat , calor , what , etc.
A ordem dos resultados da pesquisa é determinística. Segue ordem de inserção.
tri := trie.New()// Coloque chaves ([]string) e valores (qualquer)tri.Put([]string{"o"}, 1)tri.Put([]string{"o", " rápido", "marrom", "fox"}, 2)tri.Put([]string{"o", "rápido", "esportes", "carro"}, 3)tri.Put([]string{" o", "verde", "árvore"}, 4)tri.Put([]string{"an", "maçã", "árvore"}, 5)tri.Put([]string{"an", "guarda-chuva"}, 6)tri .Root().Print()// Saída (tentativa completa com terminais terminando em ($)):// ^// ├─ o ($)// │ ├─ rápido// │ │ ├─ marrom // │ │ │ └─ raposa ($) // │ │ └─ esportes // │ │ └─ carro ($) // │ └─ verde // │ └─ árvore ($) // └─ um// ├─ maçã // │ └─ árvore ($) // └─ guarda-chuva ($) resultados := tri.Search([]string{"the", "quick"})for _, res := range results.Results { fmt.Println(res.Chave, res.Valor) }// Saída (pesquisa baseada em prefixo):// [a raposa marrom rápida] 2// [o carro esportivo rápido] 3key := []string{"the", "tree"}results = tri.Search(key , trie.WithMaxEditDistance(2), // Uma edição pode ser inserida, excluída, substituídatrie.WithEditOps())for _, res := range results.Results { fmt.Println(res.Key, res.EditDistance) // EditDistance é o número de edições necessárias para converter para [a árvore]}// Saída (resultados a não mais de 2 edições de [a árvore]):// [a] 1// [a árvore verde ] 1// [uma macieira] 2// [um guarda-chuva] 2result := results.Results[2]fmt.Printf("Para converter %v em %v:n", result.Key, key)printEditOps(result.EditOps)// Saída (operações de edição necessárias para converter um resultado para [a árvore]):// Para converter [uma macieira] para [a árvore]:// - delete "an"// - substitua "apple" por "the"// - não edite "tree"results = tri.Search(key, trie.WithMaxEditDistance(2), trie.WithTopKLeastEdited(), trie.WithMaxResults(2))for _, res := intervalo results.Results { fmt.Println(res.Key, res.Value, res.EditDistance) }// Saída (2 principais resultados menos editados):// [o] 1 1// [a árvore 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