Trie树,前缀树,字典树,又称单词查找树或键树,是一种树形结构。
典型应用是用于统计和排序大量的字符串(但不仅限于字符串),可以用于搜索引擎系统,用于文本词频统计。
Trie利用字符串的公共前缀来避免无谓的查找,从而降低查询时间的开销以达到提高效率的目的。
Trie性质:
1.根节点不包含字符,除根节点外每一个节点都只包含一个字符。
2.每一个节点与它所在树中的位置一起决定了它所代表的字符串(虽然它自身只保存一个char)。
也可以这样理解,每条边对应着一个字符char(事实上是该边指向的节点保存的这个char),从根节点到某一节点,路径上经过的字符连接起来,为该节点所代表的字符串。
3.每个节点的所有子节点包含的字符都不相同。
写了一个简单的有增加,查找功能的Trie树,代码如下
public class Trie {
/** * 节点数据结构 */
class Node {
int val;
boolean isExist;
Node[] subs = new Node[26];
Node(char c) {
this.val = c;
}
}
/** * Initialize */
private Node root;
public Trie() {
root = new Node(' ');
}
/** * 插入 */
public void insert(String word) {
Node ns = root;
for (int i = 0; i < word.length(); i++) {
char c = word.charAt(i);
if (ns.subs[c - 'a'] == null) {
ns.subs[c - 'a'] = new Node(c);
}
ns = ns.subs[c - 'a'];
}
ns.isExist = true;
}
/** * 查找 */
public boolean search(String word) {
Node ns = root;
for (int i = 0; i < word.length(); i++) {
char c = word.charAt(i);
if (ns.subs[c - 'a'] == null) return false;
ns = ns.subs[c - 'a'];
}
return ns.isExist;
}
/** * 查找前缀是否存在 */
public boolean startsWith(String prefix) {
Node ns = root;
for (int i = 0; i < prefix.length(); i++) {
char c = prefix.charAt(i);
if (ns.subs[c - 'a'] == null) return false;
ns = ns.subs[c - 'a'];
}
return true;
}
}
使用的话,直接new Trie()就可以,非常简洁,树的深度大概为字符串的平均长度,查找效率O(sLen),即为平均插入字符串的长度。
这个应该只是简单版的Trie,以后还有待深入学习。