前言
提示:以下是本篇文章正文内容,下面案例可供参考
一、什么是前缀树
前缀树又名字典树,单词查找树,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。
二、优缺点
缺点:Trie树也有它的缺点,Trie树的内存消耗非常大。
优点:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。
应用场景
- 字符串的快速检索
- 字符串排序
- 最长公共前缀
- 自动匹配前缀显示后缀
代码实现
public class Triel {
public static void main(String[] args) {
String str = "world";
trie t = new trie();
t.insert(str);
System.out.println(t.search(str));
System.out.println(t.startsWith("word"));
}
}
class trie {
Node root;
public trie() {
root = new Node();
}
//插入字符串
public void insert(String word) {
//辅助结点
Node p = root;
for(int i = 0;i < word.length();i ++)
{
//字母对应的下标
int u = word.charAt(i) - 'a';
//下标为空则在当前下标创建结点
//这里的结点也可以保存对应的字符,代码得自行添加了
if(p.son[u] == null) p.son[u] = new Node();
//让p指向这个结点
p = p.son[u];
}
//是结尾返回true
p.is_end = true;
}
//搜索字符串
public boolean search(String word) {
Node p = root;
for(int i = 0;i < word.length();i ++)
{
//字母对应的下标
int u = word.charAt(i) - 'a';
//不存在该字母对应的下标,该字母不存在
if(p.son[u] == null) return false;
//接着往下找下一个字符
p = p.son[u];
}
//退出循环找到最后了返回true
return p.is_end;
}
//搜索最长公共前缀
public boolean startsWith(String prefix) {
Node p = root;
for(int i = 0;i < prefix.length();i ++)
{
int u = prefix.charAt(i) - 'a';
if(p.son[u] == null) return false;
p = p.son[u];
}
return true;
}
}
class Node
{
//是否是最后一个字符
boolean is_end;
Node[] son = new Node[26];
//初始化
Node()
{
is_end = false;
for(int i = 0;i < 26;i ++)
son[i] = null;
}
}