trie
A missing trie implementation for Go.
Installation
go get github.com/krasun/trie
Usage
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()
t.Insert("apple")
t.Insert("alphabet")
t.Insert("banana")
t.Contains("apple")
t.Contains("app")
t.Contains("banana")
t.Contains("ban")
t.SearchByPrefix("a")
t.StartsWith("a")
A goroutine-safe (thread-safe) trie
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())
Tests
To run tests, just execute:
$ go test . -race
Benchmarking
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.
Applications
Use the trie in cases when it only outperforms hash tables or hash sets (map[string]{}struct):
- Search key by the prefix.
License
trie is released under the MIT license.