zoukankan      html  css  js  c++  java
  • 动态字典树

    本文转自于:http://www.cnblogs.com/tanky_woo/archive/2010/09/24/1833717.html

    代码部分有改动。

      字典树:

      又称单词查找树Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来节约存储空间,最大限度地减少无谓的字符串比较,查询效率比哈希表高。 

                      

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

    字典树的结构定义:

    struct Trie
    {
        bool suffix;       // 这里应根据题目要求灵活变化
        int cnt;
        Trie *next[26];
        Trie()
        {
            suffix = false;
            cnt = 0;
            _clr(next, 0);
        }
    } * root;

      next是表示每层有多少种类的数,如果字典树里只有小写字母,则26即可,若加上为大小写字母,则是52,若再加上数字,则是62了,这里根据题意来确定。
    cnt标识一个字典树到此有多少相同前缀的数目,suffix 表示自此为一个单词的结束,这里根据需要应当学会自由变化。

    Trie的查找(最主要的操作):
    (1) 每次从根结点开始一次搜索;
    (2) 取得要查找关键词的第一个字母,并根据该字母选择对应的子树并转到该子树继续进行检索;

    (3) 在相应的子树上,取得要查找关键词的第二个字母,并进一步选择对应的子树进行检索。   
    (4) 迭代过程……   
    (5) 在某个结点处,关键词的所有字母已被取出,则读取附在该结点上的信息,即完成查找。

    这里给出生成字典树和查找的模版
    生成字典树:

     1 void CreatTrie(char str[])
     2 {
     3     Trie *Pre = root;
     4     for(int i=0; str[i]; i++)
     5     {
     6         int id = str[i] - 'a';
     7         if(Pre->next[id]==NULL)
     8             Pre->next[id] = new Trie();
     9         Pre->next[id]->cnt++;
    10         Pre  = Pre->next[id];
    11     }
    12     Pre->suffix = true;
    13 }

    查找过程:

    // 查找字符串s是否为一个存在的单词
    bool Find(char * s)
    {
        Trie * Pre=root;
        for(int i=0; s[i]; i++)
        {
            int id = s[i] - 'a';
            if(Pre->next[id]==NULL)
                return false;
            Pre = Pre->next[id];
        }
        return Pre->suffix;
    }

    动态创建的内存在用完后记得释放空间:

    1 void Dele(Trie * a)
    2 {
    3     for(int i=0; i<26; i++)
    4         if(a->next[i])
    5             Dele(a->next[i]);
    6     delete a;
    7 }
  • 相关阅读:
    HDU 1501 Zipper(DFS)
    HDU 2181 哈密顿绕行世界问题(DFS)
    HDU 1254 推箱子(BFS)
    HDU 1045 Fire Net (DFS)
    HDU 2212 DFS
    HDU 1241Oil Deposits (DFS)
    HDU 1312 Red and Black (DFS)
    HDU 1010 Tempter of the Bone(DFS+奇偶剪枝)
    HDU 1022 Train Problem I(栈)
    HDU 1008 u Calculate e
  • 原文地址:https://www.cnblogs.com/khan724/p/4333428.html
Copyright © 2011-2022 走看看