字典树,又称单词查找树,Trie树,是一种树形结构,典型应用是用于统计,排序和保存大量的字符串,所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来节约存储空间,最大限度的减少无谓的字符串比较,查询效率比哈希表高。
这个图片比较经典
就是在每一次边存的是字符,点标记着个点是否之前的边的字符都存在
如图存在的字符串有 abc abcd abd。。。。
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
using namespace std;
int cnt;
struct node
{
int id;
int prefix;//记录前缀个数
node *next[26];//指向字典树下一层,如果全是小写字母是26这视情乱而定
node(){
for(int i=0;i<26;i++)
next[i]=NULL;
id =0;
prefix=0;
}//初始化
}*root;
int Insert(char *s){
int len =strlen (s);
node *p= root;
for(int i=0;i<len;i++){
int k=s[i]-‘a‘;
if(p->next[k]==NULL){
p->next[k]=new node();
}
p=p->next[k];
p->prefix++;
}
if(p->id==0)
return p->id=++cnt;
return p->id;
}//插入并分配id
int find(char s[]){
int len =strlen(s);
node *p =root;
for(int i=0;i<len;i++){
p=p->next[s[i]-‘a‘];
}
return p->prefix;
}//查找此前缀是多少人的前缀
int x;//记录总共有多少字符串参与了排序
int all[200];//记录排好序的id
void output(node *p){
if(p!=NULL){
if(p->id!=0){
all[x++]=p->id;
}
for(int i=0;i<26;i++){
if(p->next[i]){
output(p->next[i]);
}
}
}
}//字符串排序
int main(){
cnt =0;
root =new node();
char s[100][100];
char s2[100][100];
int n;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%s",s[i]);
printf("%d\n",Insert(s[i]));
strcpy(s2[Insert(s[i])],s[i]);
}
for(int i=0;i<n;i++){
printf("%d\n",find(s[i]));
}
/*排序后*/
x=0;
output(root);
printf("%d\n",x);
for(int i=0;i<x;i++){
printf("%d %s\n",all[i],s2[all[i]]);
}
}
一些题及其代码 戳我
版权声明:都是兄弟,请随意转载,请注明兄弟是谁
原文地址:http://blog.csdn.net/u013076044/article/details/47132547