功能说明
Trie 按 rune 构建字典树,适合包含非 ASCII 字符的前缀查询。Insert 去掉首尾空白、拒绝空串,并返回是否新增了单词;HasPrefix 只判断前缀路径是否存在;Complete 收集前缀子树中的所有单词,按字典序排序后截断到指定数量。
关键代码
func (t *Trie) find(prefix string) *node {
current := t.root
for _, char := range prefix {
next, ok := current.children[char]
if !ok {
return nil
}
current = next
}
return current
}
用 range 遍历字符串得到 rune,避免按字节切分破坏多字节字符。
使用注意
HasPrefix("")对非空树返回 true,空前缀被视为匹配所有单词。Complete先收集整个子树再排序截断,前缀越短开销越大。- 节点使用
map[rune]*node,内存开销高于压缩字典树,超大数据集应换用更紧凑的结构。 - 插入与查询都非线程安全,并发访问需要外部读写锁。
- 示例只存单词本身,不存附加 payload;实际场景可在节点上扩展值。
验证方式
示例输出 has prefix go: true、has prefix zig: false,补全 go 应返回 [go golang gopher](最多 3 条)。插入重复单词后 size 不变;查询空树的前缀应返回空。