字典树
字典树
怎么存储一篇文章里面出现的所有的单词,需要将所有单词存下来吗?字典树给出的答案是no。
朴素的字典树
字典树,英文名 trie。顾名思义,就是一个像字典一样的树。
看看OIwiki的这张图:
对于一个单词比如caab,就表示从1->4->8->13这样一条路径。我们可以使用13来表示这个单词。也就是从根节点1到13这条路径。
看看代码:
struct Trie{
int tree[N][65],cnt;
int get_num(char x){
if(x>='A'&&x<='Z') return x-'A';
else if(x>='a'&&x<='z') return x-'a'+26;
else return x-'0'+52;
}
void _insert(const char *s,int len){
int p = 0;
for(int i = 0;i < len;i++){
int c = get_num(s[i]);
if(!tree[p][c]) tree[p][c] = ++cnt;
p = tree[p][c];
}
}
int _find(const char *s,int len){
int p = 0;
for(int i = 0;i < len;i++){
int c = get_num(s[i]);
if(!tree[p][c]) return 0;
p = tree[p][c];
}
return p;
}
void init(){
for(int i = 0;i <= cnt;i++){
for(int j = 0;j < 65;j++){
tree[i][j] = 0;
}
}
cnt = 0;
}
}trie;
字典树的基本处理非常简单,看十分钟就会了。