zoukankan      html  css  js  c++  java
  • 字典树的学习(剪辑的博客文章)

    字典树(讲解+模版)

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

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


    Trie的数据结构定义:

    复制代码
    #define MAX 26
    typedef struct Trie   
    {   
        Trie *next[MAX];   
        int v;   //根据需要变化
    };   
     
    Trie *root;
    复制代码

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

    Trie的查找(最主要的操作):
    (1) 每次从根结点开始一次搜索;
    (2) 取得要查找关键词的第一个字母,并根据该字母选择对应的子树并转到该子树继续进行检索;   (3) 在相应的子树上,取得要查找关键词的第二个字母,并进一步选择对应的子树进行检索。   
    (4) 迭代过程……   
    (5) 在某个结点处,关键词的所有字母已被取出,则读取附在该结点上的信息,即完成查找。

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

    复制代码
    void createTrie(char *str)
    {
        int len = strlen(str);
        Trie *= root, *q;
        for(int i=0; i<len; ++i)
        {
            int id = str[i]-'0';
            if(p->next[id] == NULL)
            {
                q = (Trie *)malloc(sizeof(Trie));
                q->= 1;    //初始v==1
                for(int j=0; j<MAX; ++j)
                    q->next[j] = NULL;
                p->next[id] = q;
                p = p->next[id];
            }
            else
            {
                p->next[id]->v++;
                p = p->next[id];
            }
        }
        p->= -1;   //若为结尾,则将v改成-1表示
    }
    复制代码

    接下来是查找的过程了:

    复制代码
    int findTrie(char *str)
    {
        int len = strlen(str);
        Trie *= root;
        for(int i=0; i<len; ++i)
        {
            int id = str[i]-'0';
            p = p->next[id];
            if(p == NULL)   //若为空集,表示不存以此为前缀的串
                return 0;
            if(p->== -1)   //字符集中已有串是此串的前缀
                return -1;
        }
        return -1;   //此串是字符集中某串的前缀
    }
    复制代码

    对于上述动态字典树,有时会超内存,比如 HDOJ 1671 Phone List,这是就要记得释放空间了:

    复制代码
    int dealTrie(Trie* T)
    {
        int i;
        if(T==NULL)
            return 0;
        for(i=0;i<MAX;i++)
        {
            if(T->next[i]!=NULL)
                deal(T->next[i]);
        }
        free(T);
        return 0;
    }
    复制代码
  • 相关阅读:
    动态生成 Excel 文件供浏览器下载的注意事项
    JavaEE 中无用技术之 JNDI
    CSDN 泄露用户密码给我们什么启示
    刚发布新的 web 单点登录系统,欢迎下载试用,欢迎提建议
    jQuery jqgrid 对含特殊字符 json 数据的 Java 处理方法
    一个 SQL 同时验证帐号是否存在、密码是否正确
    PostgreSQL 数据库在 Windows Server 2008 上安装注意事项
    快速点评 Spring Struts Hibernate
    Apache NIO 框架 Mina 使用中出现 too many open files 问题的解决办法
    解决 jQuery 版本升级过程中出现 toLowerCase 错误 更改 doctype
  • 原文地址:https://www.cnblogs.com/yspworld/p/3885825.html
Copyright © 2011-2022 走看看