- R向单词查找树
- 数据结构
- 查找
- 插入
- 查找所有键
- 通配符匹配
- 最长前缀
- 删除
- R向单词查找树的性质
- 三向单词查找树
- 三向单词查找树的性质
同字符串的排序一样,利用字符串的性质开发的查找算法也比通用的算法更有效,这些算法可以用于在以字符串作为被查找键的场合。这类算法在面对巨量的数据时,仍然可以取得这样的性能:查找命中所需的时间与被查找的键的长度成正比;而查找未命中时只需检查若干个字符。这样的性能是相当惊人的,也是算法研究的最高成就之一,这些算法成了建成现在能够便捷、快速地访问海量信息所依赖的基础设施的重要因素。
R向单词查找树
数据结构
单词查找树(Trie)是用于字符串键查找的数据结构。与之前的查找树类似,它也是由链接的结点所组成的数据结构,这些链接可能为空,也可能指向其他结点。
结点的数据结构为:
private static class Node {
private Object val;
private Node[] next = new Node[R];
}
每个节点都只有一个或0个指向它的结点(父结点),只有根结点不会有父结点。每个节点都含有R条链接,R为字母表的大小,如果字符都由26个小写英文字母构成,则R为26;如果字符属于ASCII字符集,则R=128;DNA研究中用4个字母表示4个碱基,R=4。
R条链接对应可能出现的字符,这其中会有大量的空链接,键是由从根节点到含有非空值的结点的路径所隐式表示的。每个结点也含有一个相应的值,可以是空也可以是符号表中的某个键所关联的值。值为空的结点在符号表中没有对应的键,它们的存在是为了简化单词查找树中的查找操作,每个键所关联的值保存在给定键的最后一个字母所对应的结点中。
也将基于含有R个字符的字母表的单词查找树称为R向单词查找树。
查找
在单词查找树中查找给定字符串键所对应的值时,是以被查找的键中的字符为导向的。单词查找树中的每个结点都包含了下一个可能出现的所有字符的链接。从根结点开始,首先经过的是键的首字母所对应的链接,在下一个结点沿着第二个字符所对应的链接继续前进,以此类推,直到找到键的最后一个字母所指向的结点,或者遇到了一条空链接。
- 如果键的尾字符所对应的结点中的值非空,则查找命中,键所对应的值就是键的尾字符中所存储的值;
- 如果键的尾字符所对应的结点中的值为空,或者查找的过程中遇到了空链接,则查找未命中。
public Value get(String key) {
Node x = get(root, key, 0);
if (x == null)
return null;
return (Value) x.val;
}
private N