其他分享
首页 > 其他分享> > 字典树学习笔记

字典树学习笔记

作者:互联网

字典树

算法简介

又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。

典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。

它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。

by 百度百科

算法结构

aaaa
aaab
abab
abba
abbb

为例构建出的字典树

字典树示例1

性质

  1. 根节点为空。
  2. 从根开始的链都是其中某些字符串的前缀。
  3. 标记所有字符串的最后一位节点的 \(\texttt{cnt}\) 为该字符串的个数。进行回溯统计后,对于任意一个节点,它的 \(\texttt{cnt}\) 为有该前缀的字符串的个数。

作用

  1. 统计字符串的前(后)缀个数。
  2. 判断字符串是否存在(类似于字符串哈希作用)。
  3. 计算字符串最长公共前缀。
  4. 将字符串排序。

基本代码

struct Trie{
	int num;
	struct trie{int cnt=0,v[63];}E;
	vector<trie>t;
	void init(){num=0;t.push_back(E);}
	int change(char ch){
		if('a'<=ch&&ch<='z')return ch-'a'+00;
		if('A'<=ch&&ch<='Z')return ch-'A'+26;
		if('0'<=ch&&ch<='9')return ch-'0'+52;
	}
	void insert(string s,int node){
		if(!s.size()){t[node].cnt++;return;}int ret=t[node].v[change(s[0])];
		if(!ret)t[node].v[change(s[0])]=++num,t.push_back(E),t[num].cnt=0;
		s.erase(s.begin());insert(s,ret?ret:num);
	}
	void dfs(int u){
		for(int i=0;i<63;i++){if(t[u].v[i]){dfs(t[u].v[i]);t[u].cnt+=t[t[u].v[i]].cnt;}}
	}
	int quary(string s,int node){
		if(!s.size()){return t[node].cnt;}int ret=t[node].v[change(s[0])];
		if(!ret)return 0;s.erase(s.begin());return quary(s,ret);
	}
};

标签:cnt,前缀,int,笔记,学习,哈希,字符串,字典
来源: https://www.cnblogs.com/qzccy/p/Trie.html