Trie 树简介及应用
作者:京东物流 马瑞
1 什么是 Trie 树
1.1 Trie 树的概念
Trie 树,即字典树,又称单词查找树或键树,是一种树形结构,典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。
Trie, also called digital tree and sometimes radix tree or prefix tree (as they can be searched by prefixes), is a kind of search tree—an ordered tree data structure that is used to store a dynamic set or associative array where the keys are usually strings. It is one of those data-structures that can be easily implemented.
1.2 Trie 树优点
最大限度地减少无谓的字符串比较,查询效率比较高。核心思想是空间换时间,利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的。
插入、查找的时间复杂度均为 O(N),其中 N 为字符串长度。
空间复杂度是 26^n 级别的,非常庞大(可采用双数组实现改善)。
1.3 Trie 树的三个基本性质
根节点不包含字符,除根节点外每一个节点都只包含一个字符
从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串
每个节点的所有子节点包含的字符都不相同
2 Trie 树数据结构
以字符串”hi”和”经海路”的数据为例:
Java 的数据结构定义:
如果只是处理 26 个英文字符,data 可以通过 children 数组是否为空来判断。如果处理程序,默认 children 为空来判断是否为最后一个节点,则 isEnd 字段可以省略。
前缀 prefix 和 suffix 可以在数据处理的时候,方便拿到当前节点前缀和后缀信息,如果不需要可以去除。
3 Trie 树在脏话过滤中的应用
3.1 脏话关键词 Keyword 定义
3.2 关键词查询器
3.3 字符串构造一棵树
对关键词字符串,逐个字符进行构建。
3.4 词库树的生成
3.5 关键词提取
思路是对某个字符串 text,逐个字符 ch,获取 ch 对应的词库树的 children,然后获取匹配到的单个或多个结果,将匹配到的关键词在 text 中的开始和结束下标进行记录,如后续需要 html 标记,或者字符替换可直接使用。如果未能在词库树中找到对应的 ch 的 children,或者词库树的 children 未能匹配到去除 ch 的子字符串,则继续循环。具体可再详细读一下代码。
4 Radix Tree 的应用
4.1 RAX - Redis Tree
Redis 实现了不定长压缩前缀的 radix tree,用在集群模式下存储 slot 对应的的所有 key 信息。
如 Redis 源码中的注释所写,RAX 进行了一些优化,并不会将一个字符串直接按照每个字符进行树的构建,而是在 Insert 有冲突时节点分割处理,在 Delete 时如果子节点和父节点都只有一个,则需要进行合并操作。
对于 RAX 有兴趣的同学,可以看一下 rax.h、rax.c 的相关代码。
4.2 Linux 内核
Linux radix 树最广泛的用途是用于内存管理,结构 address_space 通过 radix 树跟踪绑定到地址映射上的核心页,该 radix 树允许内存管理代码快速查找标识为 dirty 或 writeback 的页。Linux radix 树的 API 函数在 lib/radix-tree.c 中实现。Linux 基数树(radix tree)是将指针与 long 整数键值相关联的机制,它存储有效率,并且可快速查询,用于指针与整数值的映射(如:IDR 机制)、内存管理等。
关于 Linux 内核使用 Radix Tree 的具体代码,有兴趣的同学可以继续深入。
5 总结
Trie 树在单词搜索、统计、排序等领域有大量的应用。文章从基础概念到具体的脏话过滤的应用、Redis 的 RAX 和 Linux 内核的 Radix Tree 对 Trie 树做了介绍。数据结构和算法是程序高性能的基础,本文抛砖引玉,希望大家对 Trie 树有所了解,并在未来开发过程实践和应用 Trie 树解决中类似情景的问题。
版权声明: 本文为 InfoQ 作者【京东科技开发者】的原创文章。
原文链接:【http://xie.infoq.cn/article/d3b0e13fb52a6cce47a7be1c9】。文章转载请联系作者。
评论