字典树学习笔记

字典树

算法简介

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

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

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

by 百度百科

算法结构

aaaa
aaab
abab
abba
abbb

为例构建出的字典树

字典树示例1

性质

  1. 根节点为空。
  2. 从根开始的链都是其中某些字符串的前缀。
  3. 标记所有字符串的最后一位节点的 cnt 为该字符串的个数。进行回溯统计后,对于任意一个节点,它的 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);
	}
};
posted @   qzccy  阅读(41)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示