A missing trie implementation for Go.
go get github.com/krasun/trie
Known limitations:
- Empty string keys are not supported. And functions won't return an error.
- Keys are not ordered, so do not expect any ordering.
Without any stress:
t := trie.New() // or trie.NewRuneTrie()
t.Insert("apple")
t.Insert("alphabet")
t.Insert("banana")
t.Contains("apple") // true
t.Contains("app") // false
t.Contains("banana") // true
t.Contains("ban") // false
t.SearchByPrefix("a") // []string{"apple", "alphabet"}
t.StartsWith("a") // true
By default, rune-wise trie are not safe to use concurrently, but it is easy to make them safe. You can wrap any trie into the safe version by:
safeTrie := trie.Safe(trie.NewTrie())
// the same interface as for a regular trie
To run tests, just execute:
$ go test . -race
Zero heap allocations for Contains
function:
$ go test -bench=. -benchmem -benchtime=1000x
goos: darwin
goarch: amd64
op 0 allocs/op
BenchmarkRuneTrieInsert-8 1000 7196 ns/op 6984 B/op 129 allocs/op
BenchmarkRuneTrieContains-8 1000 517 ns/op 0 B/op 0 allocs/op
BenchmarkWordHashSetInsert-8 1000 1406 ns/op 1100 B/op 4 allocs/op
BenchmarkWordHashSetContains-8 1000 178 ns/op 0 B/op 0 allocs/op
PASS
But the hash set (map[string]{}struct) is much much more efficient than the trie. Carefully weigh when to use the trie.
Use the trie in cases when it only outperforms hash tables or hash sets (map[string]{}struct):
- Search key by the prefix.
trie is released under the MIT license.