标签:
字典树又称单词查找树,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