字典是用来查阅某一个字或词的,所谓字典树也就是用于查找某一个数字序列或字符串的。字典树又称Trie树,是一种用树状结构存储字符串的数据结构,经典题目有最长公共前缀、单词统计等。
字典树的存储
字典树的存储原理可见下图。树的根节点什么都不存,接下来每一层的一个节点存储一个字母(或数字),直到将所有的字符串存储完毕。
上图中的字典树存储了ans、alpha、cry、bee、beef五个单词。
由上图可以看出,以小写字母为例,字符串在存储时先按照每个单词的首字母分为若干个节点,首字母相同的会进入同一个分支,然后再比较第二个字母……依此类推,可以将所有的单词都读入树中。
红色标出的是一个字符串结束的位置,这种标记有利于确定当前是否查找到了一个字符串。
值得注意的是,在字典树中,同一层的字符串长度是相同的。例如第三层s、p、y、e四个字母,含有它们的字符串在此时一定都有三个字母存入树中。
为了方便起见,本文中将根节点的子节点所在一层称为第一层,下一层称为第二层,依此类推。
字典树的插入
插入与存储的原理相同。首先判断被插入字符串的首字母是否存在于第一层,如果不存在就直接将字符串插入到根节点上;如果存在,则沿着匹配到的字母往下走,再判断被插入字符串的第二个字母是否存在于第二层……一直走到字符串全部被插入结束。
字典树的查找
在查找一个字符串时,可以经过树中每一个正确(树上的字母与字符串中相应位置的字母匹配)的节点进行比较,直到被查找的字符串比较完毕,如果这时恰巧遇到结束标记,则说明被查找字符串在树中存在。这一比较方法的时间复杂度是O(n),与暴力枚举的时间相比,已经大大提高。
由此可以发现,字典树可以用来匹配字符串。AC自动机就是以字典树为基础的多字符串匹配算法。
时间: 2024-12-20 01:04:49