← 中文资源

简体中文版本

Go 前缀树查找

按 rune 构建字典树,支持插入去重、前缀存在性判断,并用排序后的深度优先遍历收集字典序补全结果。

阅读英文原文

功能说明

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 不变;查询空树的前缀应返回空。