• 字典树(Trie树)


    1. trie基础

    (1) 是什么?

    Trie,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种。

    (2) 性质

    • 根节点不包含字符,除根节点外每一个节点都只包含一个字符
    • 从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串
    • 每个节点的所有子节点包含的字符都不相同

    例如,单词序列a, to, tea, ted, ten, i, in, inn,对应的trie。

    (3) 应用

    用于统计和排序大量的字符串,但不仅限于字符串,所以经常被搜索引擎系统用于文本词频统计。

    (4) 优点

    • 最大限度地减少无谓的字符串比较
    • 查询效率比哈希表高

    2. 一个例子

      1 #include <stdio.h>  
      2 #include <string.h>  
      3 #include <stdlib.h>  
      4   
      5 #define MAX 256//ascii码有256个字符,故每棵树的子节点最多有256个  
      6 #define MAXLEN 256//单词最长为256  
      7   
      8 typedef struct TrieNode  
      9 {  
     10     int count;  
     11     struct TrieNode *next[MAX];  
     12 }TrieNode;    
     13   
     14 //插入一个单词  
     15 void Insert(char *word,TrieNode *root)  
     16   
     17 {  
     18     int i;  
     19     TrieNode *cur;  
     20     if(word[0]=='')  
     21         return;  
     22     cur=root;  
     23     for(i=0;word[i]!='';i++)  
     24     {  
     25         if(cur->next[word[i]]==NULL)  
     26         {  
     27             TrieNode *newNode = (TrieNode *)malloc(sizeof(TrieNode));  
     28             memset(newNode,0,sizeof(TrieNode));  
     29             cur->next[word[i]]=newNode;  
     30         }  
     31         cur=cur->next[word[i]];  
     32     }  
     33   
     34     cur->count++;  
     35     return;  
     36 }  
     37   
     38 //创建树输入每个单词,以回车结束,则单词被插入树中,碰到*停止树的创建  
     39 void Construct(TrieNode *&root)  
     40 {  
     41      char inStr[MAXLEN];  
     42      int size=0;  
     43      root = (TrieNode *)malloc(sizeof(TrieNode));  
     44      memset(root,0,sizeof(TrieNode));  
     45      while(1)  
     46      {  
     47          scanf("%s",inStr);  
     48          if(strcmp(inStr,"*")==0)  
     49              break;  
     50          Insert(inStr,root);  
     51      }  
     52      return;  
     53 }  
     54   
     55 //遍历整棵树  
     56 void Traverse(TrieNode *curP)  
     57 {  
     58     static char theWord[MAXLEN];  
     59     static int pos=0;   
     60     int i;  
     61     if(curP==NULL)  
     62         return;  
     63     if(curP->count)  
     64     {  
     65         theWord[pos]='';  
     66         printf("%s:%d
    ",theWord,curP->count);  
     67     }  
     68     for(i=0;i<MAX;i++)  
     69     {  
     70         theWord[pos++]=i;   
     71 //从这句话可以看出在递归调用子节点前,子节点的值已经加入到单词中了  
     72         Traverse(curP->next[i]);   
     73         pos--;    
     74     }  
     75     return;  
     76 }  
     77   
     78 //查找一个单词是不是在树中  
     79 bool Find(TrieNode *root,char *word)  
     80 {  
     81     int i;  
     82     TrieNode *cur;  
     83     cur=root;  
     84     for(i=0;word[i]!='';i++)  
     85     {  
     86         if(cur->next[word[i]]==NULL)  
     87         {  
     88             return false;  
     89         }  
     90         cur=cur->next[word[i]];  
     91     }  
     92   
     93     if(cur->count)  
     94         return true;  
     95     else  
     96         return false;  
     97 }  /* 何问起 hovertree.com */
     98   
     99 int main()    
    100 {    
    101     TrieNode *root;  
    102     char str[MAXLEN];  
    103     Construct(root);    
    104     printf("
    ");    
    105     Traverse(root);    
    106     printf("
    ");    
    107     while(1)  
    108     {  
    109         scanf("%s",str);  
    110         if(strcmp(str,"*")==0)  
    111             break;  
    112         printf("%s:%d
    ",str,Find(root,str));   
    113     }  
    114   
    115     return 0;    
    116 }  

    推荐:http://www.cnblogs.com/roucheng/p/wendang.html

  • 相关阅读:
    初探Remoting双向通信(三)
    MySQL主从复制
    MySQL锁机制
    mySql索引
    连接池
    JDBC
    数据库建表、约束、索引
    Oracle和SQL简介
    Stream API 和 注解
    lambda表达式
  • 原文地址:https://www.cnblogs.com/roucheng/p/trie.html
Copyright © 2020-2023  润新知