Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2877567
  • 博文数量: 471
  • 博客积分: 7081
  • 博客等级: 少将
  • 技术积分: 5369
  • 用 户 组: 普通用户
  • 注册时间: 2012-01-04 21:55
文章分类

全部博文(471)

文章存档

2014年(90)

2013年(69)

2012年(312)

分类: C/C++

2012-04-18 17:20:52

字典树的基本功能是用来查询某个单词(前缀)在所有单词中出现次数的一种数据结构 
1、统计一组字符串中某前缀出现次数(字典树第一类应用)

2、一组字符串中是否有一个字符串是另一个字符串的前缀(字典树第二类应用) 
理解上面两种功能有利于理解字典树的数据结构的设置
  1.  int count;//记录该字符在该位置出现次数(即前缀出现次数)
  2.  struct node *next[Max];//定义26个分节点,数字的话则10个


1)定义结点 

点击(此处)折叠或打开

  1. #define Max 26
  2. struct node
  3. {
  4.     int count;//记录该字符在该位置出现次数
  5.     struct node *next[Max];//定义26个分节点
  6. };
2)建立一个结点

点击(此处)折叠或打开

  1. struct node *build()//建立节点
  2. {
  3.     struct node *p;
  4.     p=(struct node *)malloc(sizeof(struct node));
  5.     for(int i=0;i<26;i++)
  6.     {
  7.         p->next[i]=NULL;//令其指向0;
  8.     }
  9.         p->count=1;/*如果出现这个站点,那么它的次数肯定是大于等于1的。
  10.         但是我们刚开始建立不必考虑后续问题*/
  11.     return p;//返回新建立的节点
  12. }
3、存储结点,(对于一个字符串)不断把上面的字符结点插入组成一棵字典树
     通过不断输入字符串构建字典树

点击(此处)折叠或打开

  1. void save(char *s)//储存字母
  2. {
  3.     int len=strlen (s);
  4.     if(len==0)return ;
  5.     struct node *p;
  6.     p=root;
  7.     for(int i=0;i<len;i++)
  8.         if(p->next[s[i]-'a']!=NULL)
  9.             /*如果这个节点之前就已经存在呃,我们只需要把统计次数加上1.*/
  10.         {
  11.             p=p->next[s[i]-'a'];
  12.             p->count=p->count+1;
  13.         }
  14.         else//如果不存在的话,我们就建立一个新的节点
  15.         {
  16.             p->next[s[i]-'a']=build();
  17.             p=p->next[s[i]-'a'];
  18.         }
  19. }
4、查询前缀次数(输入一个前缀,统计出现次数)

点击(此处)折叠或打开

  1. int search (char *s)//这个函数来查询数据
  2. {
  3.     struct node *p;
  4.     int len=strlen(s);
  5.     if(len==0)
  6.         return 0;
  7.     p=root;//此处小心,root是不存储任何字符,所以下面p->next[]比较是否为NULL;root在main()创建
  8.     for(int i=0;i<len ;i++)
  9.     {
  10.         if(p->next[s[i]-'a']!=NULL)//说明还有下个节点,继续查询
  11.             p=p->next[s[i]-'a'];//执行i=0之后,p=p0,直接指向当前字符
  12.         else
  13.             return 0;
  14.         /*如果没有指向下个节点,说明这个要查询的字符串根本不存在,直接返回0*/
  15.     }
  16.     return p->count;//直接返回以这个字符结尾的前缀次数
  17. }




阅读(815) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~