学习总结-来自《数据结构与算法》
一、Trie树的概念
结构:树形结构
特点:利用字符串之间公共的前缀,将重复的前缀合并在一起
作用:可以高效的匹配。用来解决在一组字符串集合中快速查找某个字符串的问题。(搜索引擎中的关键词提示)。比较适用于有共用前缀的情况
二、构建Trie树
- 问题一;如何存储一个节点对应的所有子节点
解决:假设存储范围为a-z。那么可以用一个26个大小的数据来存储。索引为0的位置表示子节点是a。索引为1的位置表示子节点为b。
(如果)
因此。一个TrieNode的结构如下
class TrieNode{
char data;
TrieNode[] children= new TrieNode[26];//存储子节点
boolean isEndingChar = false;//标志是不是最后一个节点
public TrieNode(char c) {
this.data =c;
}
}
(如果存储的不止26个字母
childen可以改为 Map(Integer,TrieNode)的形式。)
- 构建(插入字符串)
粗略示意图
public void insert(String s) {
TrieNode p =root;
for(int i=0;i<s.length();i++) {
int index = s.charAt(i)-'a';//获取该字符应存储的索引位置
if(p.children[index]==null) { //如果空的,则新建插入
p.children[index] = new TrieNode(s.charAt(i));
}
p = p.children[index];//指向下一个节点
}
p.isEndingChar =true;//标注是最后一个尾巴节点(在匹配搜索字符串的时候需要用到这个变量)
}
- 完全匹配搜索(搜索字符串)
public boolean search(String s) {
TrieNode p =root;
for(int i=0;i<s.length();i++) {
int index = s.charAt(i)-'a';//获取该字符应存储的索引位置
if(p.children[index]==null) {//说明不存在
return false;
}
p = p.children[index];//指向下一个节点
}
if(p.isEndingChar ==false) return false;//说明不是完全匹配,只是匹配了前缀
else return true;
}
前缀匹配搜索(搜索满足前缀的字符串)
public boolean matchPrefix(String prefix) {
TrieNode p =root;
for(int i=0;i<prefix.length();i++) {
int index = prefix.charAt(i)-'a';//获取该字符应存储的索引位置
if(p.children[index]==null) {//说明不存在
return false;
}
p = p.children[index];//指向下一个节点
}
return true;//如果顺利跳出循环,说明都匹配到了、直接return true
}