Tire 树又称单词查找树、前缀树,是一种哈希树变种的树形结构。核心思想是空间换时间,利用字符串的公共前缀来提高查询效率,常常被应用字符统计、检索等场景,比如搜索引擎的词频统计和提示等

原理
前缀树的存储原理很简单,即合并字符串相同的字符前缀进行存储。
比如,存储dog
、cat
、doing
三个字符串的树结构:

需要注意:前缀树不是二叉树,而是多叉树
。
前缀树的特征:
- 根结点不存储任何内容。
- 每个节点只存储 1 个字符。
- 根节点到任意子节点是为存储的字符串。
- 写入和查询操作的时间复杂度均为 O(N)。
如何实现
一般可以通过以下两种方式来实现,
- 单向链表(本文采用方式)
- 二维数组
- 存储
1 | // 定义根结点 |
从结构可以看出,其实前缀树就是把字符串按字符顺序存储。
1 | func (r *Tire) Append(s string) { |
- 查找
1 | func (r *Tire) Find(s string, isFullMatch bool) bool { |
- 删除
删除是前缀树中稍复杂一点的操作,如果字符被其他字符串使用,不能直接删除。
1 | func (r *Tire) Remove(s string) bool { |
最后
附上完整代码:tire