前缀树动画演示
按字符一层层往下走,公共前缀只存一份。
键盘:← → 单步 ·空格 播放/暂停 · R 重置 ·Home/End 到两端
前缀树把单词拆成字符序列存:公共前缀只留一份,一个词从根走到叶子要几个字符就走几步,查找代价只跟词的长度有关,跟词库里存了几百万条完全无关。这一页把边标上字符、词尾用 ⊤ 记号点亮,插入时遇到现成分支就沿边走、缺了就新建,新建与复用一眼分明。
「是不是词」和「是不是前缀」是两种完全不同的判定:前者要求走完且落点带 ⊤,后者只要求走得通。页面上完整词查找、落空查找、前缀染色三段各跑一遍——落点有 ⊤ 的 cat 命中、延伸出来的 catz 走到一半断链、前缀 ca 则把走过的路径一路点亮,顺带亮出挂在下面的所有分支,自动补全就是把这棵子树里的词掏出来。代价是空间与指针数,收益是不用排序、不用哈希、还能按前缀聚合。
前缀树演示怎么用
- 自定义词表:在自定义栏用空格分隔写几个短单词即可换样本;为保证一页画得下,单节点分叉与全树节点数有上限,超出的词会被跳过并在首步点名。
- 看三种查询:插入阶段结束后依次演示完整词命中、延伸词失败和前缀染色,对比三段的落点差异就能分清判定口径。
- 数新建:计数条累计新建节点与字符访问次数:插入 car 时 c、a 两字符是复用走账,只有 r 才计入新建。
常见问题
每个节点不是要开 26 个孩子指针吗,空间受得了?
这是字典树真实的空间痛点,工程上用「数组只开实际存在的孩子」、单链压缩成边(Radix Tree)或双数组trie 来压体积。本页为了看清结构,把每个节点的分叉数压到极小,属于教学口径。
⊤ 标记为什么不能省掉?
没有它,「ca」这种只存在于半路的路径会被当成词,「cat 是词、cats 也在库里」这类事实就没法表达。词尾标记一位,把「走得通」与「是词」分成两个正交问题,这是 trie 查询语义的命门。
什么场景值得上字典树?
自动补全、搜索建议、按前缀聚合、拼写检查与 IP 路由的最长前缀匹配是经典主场;关键词批量匹配(Aho-Corasick)也是在它之上叠 fail 指针。判定标准就一条:问题是围绕「前缀」展开的吗。