字典树学习材料

字典树,又称单词查找树,Trie树,是一种树形结构,典型应用是用于统计,排序和保存大量的字符串,所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来节约存储空间,最大限度的减少无谓的字符串比较,查询效率比哈希表高。Trie树示意图如附件图所示:该trie树存有abc、d、da、dda四个字符串,如果是字符串会在节点的尾部进行标记。没有后续字符的branch分支指向NULL。Trie的特点:1. 根结点不包含任何字母。2. 其余结点仅包含一个字母(非元素)3. 从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串。 4. 每个结点的子节点包含字母不同。5. 采用标记的方法确定是否为字符串。Trie的缺点:动态建树时,用new很费时;静态建树时,预存节点数很费空间。

Trie树的模板一:静态建树:

Cpp代码 
  1. #include<iostream>  
  2. using namespace std;  
  3. const int Max = 1000;  
  4. const int branchNum = 26;  
  5.    
  6. struct tree_node{  
  7.     int count;  
  8.     bool isstr;  
  9.     tree_node *next[branchNum];  
  10. }root, node[Max];  
  11. int p = 0;    //  静态建树的特点,记录用了几个tree_node,则下一个节点为node[p]。  
  12.    
  13. void insert(char *word){  
  14.     tree_node *location = &root;   //  起初先指向根,再一层层向下查找。  
  15.     while(*word){  
  16.         if(location->next[*word-'a'] == NULL){  
  17.             node[p].count = 0;     //  初始化新节点。  
  18.             node[p].is = false;  
  19.             memset(node[p].next, NULL, sizeof(node[p].next));  
  20.             location->next[*word-'a'] = &node[p ++];  
  21.         }  
  22.         location = location->next[*word-'a'];  
  23.         location->count ++;  
  24.         word ++;  
  25.     }  
  26.     loaction->isstr = true;  
  27. }  
  28.    
  29. bool search(char *word){  
  30.     tree_node *loaction = &root;  
  31.     while(*word && loaction){  
  32.         loaction = loaction->[*word-'a'];  
  33.         word ++;  
  34.     }  
  35.     return (location != NULL && location->isstr);  
  36. }  
  37.    

 Trie的模板二:动态建树

 

Cpp代码 
  1. struct tree_node  
  2. {  
  3.     bool isstr;     //   记录此处是否构成一个串。  
  4.     tree_node  *next[branchNum];    //   指向各个子树的指针,下标0-25代表26字符  
  5.     tree_node(){  
  6.         isstr = false;  
  7.         memset(next, NULL, sizeof(next));  
  8.     }  
  9. }root;  
  10.    
  11. void insert(char *word){     //  向以root为根结点的树中插入串word  
  12.     tree_node *location = &root;  
  13.     while(*word){  
  14.         if(location->next[*word-'a'] == NULL){     //  不存在则建立  
  15.             tree_node *tmp = new tree_node;  
  16.             location->next[*word-'a'] = tmp;  
  17.         }  
  18.         location = location->next[*word-'a'];  //  每插入一步,有一个新串经过,指针要向下移动  
  19.         word ++;  
  20.     }  
  21.     location->isstr = true;  
  22. }  
  23.    
  24. bool search(char *word){  
  25.     tree_node *location = &root;  
  26.     while(*word && location){  
  27.         location = location->next[*word-'a'];  
  28.         word ++;  
  29.     }  
  30.     return (location != NULL && location->isstr);  
  31. }  

 

关于字典树的材料大多大同小异,需要自己进一步去理解去消化~~

你可能感兴趣的:(字典树学习材料)