字典树

有时候我们要维护一个字符串集合,然后支持插入、删除、查询某个字符串出现次数和查询某个字符串作为前缀的出现次数。

显然的,暴力肯定 T 飞。

hash:我来!(非常好数据,使我的 hash WA)

所以我们需要字典树。

字典树有三大两大优点:

  • 速度快

  • 无失误(hash 有一定概率会冲突)

  • 支持多模式串匹配

但是,字典树的内存特别庞大,所以数据规模庞大的时候还是乖乖用 hash 吧。

不过,字典树似乎不支持快速判断区间回文串(hash + 树状数组可以 \(O(\log N)\) 完成)。

字典树的结构

下图是一个由 \(\{ \text{a}, \text{asf}, \text{e}, \text{eryt}, \text{radix}, \text{sda} \}\) 构成的 Trie:

11.bmp

(使用 usfca 制作,具体链接可以在 OI-wiki 找到)

可以看到,字典树是一个有向树。

理解(初学者不建议打开) 至于为什么,首先需要理解自动机的概念。

自动机用于判断一组信号序列是否合法(很像图灵机是不是)。

以下是一个判断某个数是否是偶数(以二进制输入)的自动机:

12.bmp

而 Trie 树,就是在给定一个字符串后,如果这个字符串是字符串集合的一个串,那么就接受(上面的“查询某个字符串出现次数和查询某个字符串作为前缀的出现次数”需要两个 Trie,但是可以压成一个)

字典树的操作

插入

很简单,遇到不存在的节点创造一个。

记得维护信息。

删除

遇到一个再也不用的节点就删掉。

记得维护信息。

查找某个字符串

一个一个字符的跳。

查找某个前缀

一样一个一个字符的跳,跳完后返回子树和。

posted @ 2024-04-02 12:48  hhc0001  阅读(5)  评论(0编辑  收藏  举报