ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

字典树学习笔记

2022-09-14 18:33:04  阅读:227  来源: 互联网

标签:cnt 前缀 int 笔记 学习 哈希 字符串 字典


字典树

算法简介

又称单词查找树,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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有