码迷,mamicode.com
首页 > 其他好文 > 详细

字典树

时间:2016-08-17 12:00:21      阅读:198      评论:0      收藏:0      [点我收藏+]

标签:

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

----摘自必应

其建立过程类似链表的生成,顾名思义,每次我们查询、插入一个单词,都从单词首字母开始,查看本节点内是否存在指向下一字母的指针,依次向后查找字典树。在结构体里还可以存放其他变量,使得查找到单词时可以输出和单词对应的数据。

插入、查找过程见代码详解。

模板题:POJ-2503

 1 #include <iostream>
 2 #include <string>
 3 using namespace std;
 4 struct Node
 5 {
 6     Node *ap[26];//保存指向下一节点的指针
 7     //---
 8     //存放每个单词的一些属性,数据类型根据需求自定,或者使用结构体保存
 9     int num;//保存出现次数
10     string val;//保存当前单词对应的内容
11     //---
12     void ini()//生成新节点时调用对其初始化
13     {
14         num=0;
15         for(int i=0;i<26;i++)
16             ap[i]=NULL;
17     }
18 }*head;//申明头指针用于指向字典树
19 void Insert(string str,string val)
20 {
21     Node *now=head,*makeNode;//now指针用于指向当前位置,makeNode用于生成新节点,再让now->ap[odx]指向新生成的节点
22     for(int i=0;i<str.length();i++)
23     {
24         int odx=str[i]-a;
25         if(now->ap[odx]==NULL)//如果为空说明字典树没有后续的内容,就建立新节点
26         {
27             makeNode=new Node;
28             makeNode->ini();
29             now->ap[odx]=makeNode;
30         }
31         now=now->ap[odx];//迭代now指针,使其转移到下一位置
32         now->num++;
33         if(i==str.length()-1)//当i满足条件时,此时位置为插入单词的末尾,故可以用当前节点代表这个单词,把要存储的对应信息存入此节点
34             now->val=val;
35     }
36 }
37 string Find(string str)//返回值根据要求而定
38 {
39     int counter=0;
40     Node *now=head;
41     for(int i=0;i<str.length();i++)//迭代过程类似插入
42     {
43         int odx=str[i]-a;
44         counter=now->num;
45         if(now->ap[odx]==NULL)
46             break;
47         now=now->ap[odx];
48         if(i==str.length()-1)
49             return now->val;
50     }
51     return "";
52 }
53 void getstr(string &temp,string &str,string &val)
54 {
55     unsigned long len=temp.length();
56     int pos;
57     for(int i=0;i<len;i++)
58     {
59         if(temp[i]!= )
60             str+=temp[i];
61         else
62         {
63             pos=i+1;
64             break;
65         }
66     }
67     for(int i=pos;i<len;i++)
68         val+=temp[i];
69 }
70 int main(int argc, const char * argv[]) {
71     string str,val,temp;
72     head=new Node;
73     head->ini();
74     while(getline(cin,temp))
75     {
76         if(temp.length()==0)
77             break;
78         str=val="";
79         getstr(temp,str,val);
80         Insert(val,str);
81     }
82     while(cin>>str)
83     {
84         temp=Find(str);
85         if(temp.length()==0)
86             cout<<"eh"<<endl;
87         else
88             cout<<Find(str)<<endl;
89     }
90     return 0;
91 }

 

字典树

标签:

原文地址:http://www.cnblogs.com/LukeStepByStep/p/5779036.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!