最近搞大数据的题目,Tried树出现的频率太大,在这里暂时先记录一个Tried树的基本操作,
日后再进行扩展(最近有点忙)。上正题。
字典树,顾名思义,就是建一本树形字典,使得下次查字典中的单词的速度大增。字典树又叫Tried Tree,或者前缀树。
字典树有几个特点:
1.利用串的公共前缀,节约内存;
2.根结点不包含任何字母;
3.其余结点仅包含一个字母;
先给出一个字典树的图片(网上大多是这张):
字典树是一棵26叉树,需要存储的空间是26^n这个数量级的,有点不可思议,真是万幸的是并不需要这么多组合。而且字典树的初衷就是用空间换时间。
字典树的主要操作有插入,查询,删除(较少使用)。插入就是利用字典中的某一个单词,在一条分支上建立一条链表,如果之前已经存在有,则不需要再建重复的结点。代码比较容易看明白:
#include<iostream> #include<string> using namespace std; struct node { bool isWord; node* next[26]; node():isWord(false) { int i=0; for(;i<26;++i) next[i]=NULL; } }; node* Insert(string str,node* root) { if(!root) //if(!root)=if(root==NULL) { root=new node; } node* cur=root; int i=0; for(;i<str.length();++i) { int num=str[i]-'a'; if( !cur->next[num] ) { cur->next[num]=new node; } cur = cur->next[num]; } cur->isWord=true; return root; } bool Search(string str,node* root) { node* cur=root; int i=0; for(;i<str.length();++i) { int num=str[i]-'a'; if( !cur->next[num] ) return false; cur=cur->next[num]; } return cur->isWord; } int main() { string str[]={"hello","world","like","lin","raise","good","luck"},str1; int n=sizeof(str)/sizeof(str[0]),i=0; node* root=NULL; for(;i<n;++i) root=Insert(str[i],root); while(cin>>str1) cout<<Search(str1,root); }