• Trie


    Trie

    Trie:又称前缀树或者字典树,是一种树形结构,是哈希树的变种。

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

    它的优点是:利用字符串的公共前缀节约存储空间,最大限度地减少无所谓的字符串比较,查询效率比哈希表高。

    字典树与字典很相似,当你要差一个单词是不是在字典树中,首先看单词的第一个字母是不是在字典的第一层,如果不在,说明字典树里没有该单词,如果在就在该字母的孩子节点里查找是不是有单词的第二个字母,没有说明没有该单词,有的话用同样的方法继续查找。字典树不仅可以用来存储字母,也可以存储数字等其他数据。

     

    Trie的数据结构定义:

    1 #define MAX 26
    2 struct Tire
    3 {
    4     Tire *next[MAX];
    5     int count;
    6 };
    7 Trie *root;
    View Code

    next 是表示每层有多少种类的数,如果只是小写字母,则26即可,若改为大小写字母,则是52,若再加上数字,则是62了,这里根据题意来确定。

    count 可以表示一个字典树到此有多少相同前缀的数目,这里根据需要应当学会自由变化。

    Trie的查找(最主要的操作)

    ①  每次从根节点开始一次搜索;

    ②  取得要查找关键词的第一个字母,并根据该字母选择对应的子树并转到该子树继续进行检索;

    ③  相应的子树上,取得要查找关键词的第二个字母,并进一步选择对于的子树进行检索。

    ④  迭代过程……;

    ⑤  在某个节点处,关键词的所有字母已被取出,则读取附在该节点上的信息,即完成查找。

    生成字典树:

     1 void createTrie(char *str)
     2 {
     3     int len = strlen(str);
     4     Trie *p = root, *q;
     5     for(int i=0; i<len; ++i)
     6     {
     7         int id = str[i]-'0';
     8         if(p->next[id] == NULL)
     9         {
    10             q = (Trie *)malloc(sizeof(Trie));
    11             q->count = 1;    //初始v==1
    12             for(int j=0; j<MAX; ++j)
    13                 q->next[j] = NULL;
    14             p->next[id] = q;
    15             p = p->next[id];
    16         }
    17         else
    18         {
    19             p->next[id]->count++;
    20             p = p->next[id];
    21         }
    22     }
    23     p->count = -1;   //若为结尾,则将v改成-1表示
    24 }
    View Code

    查找字典树:

     1 int findTrie(char *str)
     2 {
     3     int len = strlen(str);
     4     Trie *p = root;
     5     for(int i=0; i<len; ++i)
     6     {
     7         int id = str[i]-'0';
     8         p = p->next[id];
     9         if(p == NULL)   //若为空集,表示不存以此为前缀的串
    10             return 0;
    11         if(p->v == -1)   //字符集中已有串是此串的前缀
    12             return -1;
    13     }
    14     return -1;   //此串是字符集中某串的前缀
    15 }
    View Code

    对于上述动态字典树,又是会超内存,记得释放空间

     1 int dealTrie(Trie* T)
     2 {
     3     int i;
     4     if(T==NULL)
     5         return 0;
     6     for(i=0;i<MAX;i++)
     7     {
     8         if(T->next[i]!=NULL)
     9             deal(T->next[i]);
    10     }
    11     free(T);
    12     return 0;
    13 }
    View Code
  • 相关阅读:
    hdu 4521 小明系列问题——小明序列(线段树 or DP)
    hdu 1115 Lifting the Stone
    hdu 5476 Explore Track of Point(2015上海网络赛)
    Codeforces 527C Glass Carving
    hdu 4414 Finding crosses
    LA 5135 Mining Your Own Business
    uva 11324 The Largest Clique
    hdu 4288 Coder
    PowerShell随笔3 ---别名
    PowerShell随笔2---初始命令
  • 原文地址:https://www.cnblogs.com/M-D-LUFFI/p/4191846.html
Copyright © 2020-2023  润新知