一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第12天,点击查看活动详情。
Trie树
Trie 树,也叫“字典树”。顾名思义,它是一个树形结构。它是一种专门处理字符串匹配的数据结构,用来解决在一组字符串集合中快速查找某个字符串的问题。 Trie 树的本质,就是利用字符串之间的公共前缀,将重复的前缀合并在一起。 Trie 树的这个应用可以扩展到更加广泛的一个应用上,就是自动输入补全,比如输入法自动补全功能、IDE 代码编辑器自动补全功能、浏览器网址输入的自动补全功能等等。
-
构建Trie树时间复杂度是
O(n)(n是Trie树中所有元素的个数) -
查询Trie树时间复杂度是
O(k)(k 表示要查找的字符串的长度)
Go实现Trie树
package trie
type Node struct {
isWord bool
next map[string]*Node
}
type Trie struct {
root *Node
size int
}
func generateNode() *Node {
return &Node{
next: make(map[string]*Node),
}
}
func New() *Trie {
return &Trie{
root: generateNode(),
}
}
// 获得Trie中存储的单词数量
func (t *Trie) GetSize() int {
return t.size
}
// 向Trie中添加一个新的单词word
func (t *Trie) Add(word string) {
cur := t.root
for _, w := range []rune(word) {
c := string(w)
if cur.next[c] == nil {
cur.next[c] = generateNode()
}
cur = cur.next[c]
}
if cur.isWord == false {
cur.isWord = true
t.size++
}
}
Trie查询
package trie
type Node struct {
isWord bool
next map[string]*Node
}
type Trie struct {
root *Node
size int
}
func generateNode() *Node {
return &Node{
next: make(map[string]*Node),
}
}
func New() *Trie {
return &Trie{
root: generateNode(),
}
}
// 获得Trie中存储的单词数量
func (t *Trie) GetSize() int {
return t.size
}
// 向Trie中添加一个新的单词word
func (t *Trie) Add(word string) {
cur := t.root
for _, w := range []rune(word) {
c := string(w)
if cur.next[c] == nil {
cur.next[c] = generateNode()
}
cur = cur.next[c]
}
if cur.isWord == false {
cur.isWord = true
t.size++
}
}
// 查询单词word是否在Trie中
func (t *Trie) Contains(word string) bool {
cur := t.root
for _, w := range []rune(word) {
c := string(w)
if cur.next[c] == nil {
return false
}
cur = cur.next[c]
}
return cur.isWord
}