trie
v0.0.1
Go 中 Trie 資料結構的實作。它提供了比通常的 Trie 前綴搜尋更多的功能,並且旨在用於自動完成。
可以在 shivamMg.github.io/trie 嘗試 WebAssembly 演示。
鍵是[]string
而不是string
,從而支援更多用例 - 例如 []string{the Quick Brown Fox} 可以是鍵,其中每個單字都是 Trie 中的一個節點
支援Put鍵和Delete鍵
支援前綴搜尋 - 例如搜尋nation可能會回傳nation 、 nation 、 nationism 、 nationist等。
支援編輯距離搜尋(又稱 Levenshtein 距離) - 例如搜尋小麥可能會傳回相似的單字,如小麥、作弊、熱、什麼等。
搜尋結果的順序是確定的。它遵循插入順序。
tri := trie.New()// 放置鍵([]string)和值(任意)tri.Put([]string{"the"}, 1)tri.Put([]string{"the", " Quick", "brown", "fox"}, 2)tri.Put([]string{"the", "quick", "sports", "car"}, 3)tri.Put([]string{" the", "green", "tree"}, 4)tri.Put([]string{"an", "apple", "tree"}, 5)tri.Put([]string{"an", "傘"}, 6)tri.Root().Print()// 輸出(以($) 結尾的完整trie):// ^// ├─ ($)// │ ├─ fast// │ │ ├ ─ 棕色// │ │ │ └─ 狐狸($)// │ │ └─ 運動// │ │ └─ 汽車($)// │ └─ 綠色// │ │ │($ │ ─ │ │ │ │ │($ / │ │ │ │ │ 4$ 1($ │ │ │ │ │ ─ │ 一個 │ 4 樹─ // ├─ 蘋果// │ └─ 樹($)// └─ 傘($) 結果:= tri.Search([]string{"the", "quick"})for _, res :=範圍結果.Results { fmt.Println(res.Key, res.Value) }// 輸出(基於前綴的搜尋):// [快速的棕色狐狸] 2// [快速的跑車] 3key := []string{"the", "tree"}results = tri.Search(key , trie.WithMaxEditDistance(2), // 編輯可以插入、刪除、取代trie.WithEditOps())for _, res := range results.Results { fmt.Println(res.Key, res.EditDistance) // EditDistance是轉換為[樹] 所需的編輯次數}// 輸出(結果與[樹] 的編輯距離不超過2 次):// [the] 1// [the green tree] 1// [an apple tree] 2 // [雨傘] 2result := results.Results[2]fmt.Printf("將%v 轉換為%v:n", result.Key, key)printEditOps(result.EditOps)// 輸出 (將結果轉換為[樹] 所需的編輯操作):// 將[一棵蘋果樹] 轉換為[樹]:// - 刪除“an”// - 將“apple”替換為“the”// -不編輯“ tree”results = tri.Search(key, trie.WithMaxEditDistance(2), trie.WithTopKLeastEdited(), trie.WithMaxResults(2))for _, res := range results.Results { fmt.Println( res.、Printres .Value、res.EditDistance) }// 輸出(前 2 個最少編輯的結果):// [the] 1 1// [the green tree] 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