构建Tire树--字典树、前缀树

学习总结-来自《数据结构与算法》

一、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
	}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值