欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

字典树小结

程序员文章站 2024-01-29 14:00:22
...

字典树小结

  • 这是百度百科上的解释:
    又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。

  • 我理解的字典树:
    保存字符串(或数字),能快速找到与之匹配的或者与之有某种关系的串。
    普通字典树 解决匹配问题,01字典树解决异或问题

模板:
1.普通字典树 tree[i][j] 表示i标号的节点的第j个孩子
sum[i] i标号的节点经过了几次。
flag[i] i标号的节点是否是某个字符串的最后一个点。

int tree[maxn][30];//30取决于字母的个数,第i个节点的第j个孩子
int tot = 0;
ll sum[maxn];
bool flag[maxn];//标号为i的是否为一个字符串的最后一个
void add(char *s){
	int root = 0;
	int id;
	int len = strlen(s);
	for(int i=0;i<len;i++){
		id = s[i]-'a';//这个字母是几
		if(!tree[root][id]) tree[root][id] = ++tot;
		sum[tree[root][id]]++;
		root = tree[root][id];
	
	}
	flag[root] = true;//这是个字符串
}

ll find(char *s){
	int root = 0;
	int id;
	ll res = 0;
	int len = strlen(s);
	for(int i=0;i<len;i++){
		id = s[i]-'a';
		if(!tree[root][id]) return 0;
		root = tree[root][id];
	}
	return sum[root];
}

2.01字典树
就相当于把一个数的二进制表示看错一个字符串插入到字典树中 i到几取决于插入的数最大是2的多少次方。

void add(int x,int f){
	int root=0;
	int id;
	for(int i=31;i>=0;i--){
		id = (x>>i)&1;
		if(!tree1[root][id]) tree1[root][id] = ++tot1;
		root = tree1[root][id];
		num[root][0]++;
	}
	vis[root] = x; 
	
}
int find(int x,int f){
	int root = 0;
	int id;
	for(int i=31;i>=0;i--){
		id = (x>>i)&1;
		if(tree2[root][id]&&num[tree2[root][id]][1]) root=tree2[root][id];
		else root = tree2[root][id^1];
	}
	return vis[root]

}

做完了 就可以入门啦~