zoukankan      html  css  js  c++  java
  • 字典树入门

    字典树入门,包括建树,插入以及查找

    我的算法知识太差,有待提高,多看多练

    描述:建立一个词库,输入若干个单词,输入以0结束

       可以查询单词,返回他在词库中出现的次数,(ps:作为某个词的前缀时也算出现一次)

    /*
        本来以为字典树挺难的,结果看了之后感觉基础还是挺简单的
        下面算法算出建立一棵字典树,输入为0表示结束
        输入要查询的单词,返回字典树中这个词出现的频率
    */
    #include <stdio.h>
    #define MAX 26 //英文字母的个数
    //定义字典树的节点的数据类型
    typedef struct TrieNode
    {
        int nCount;//存储改节点前缀出现次数
        struct TrieNode *next[MAX];//该节点的后续节点
    }TrieNode;
    
    //定义存储节点的数组
    TrieNode Memory[1000000];//定义一个存储字典树节点的数组
    int allocp = 0;//可以看到用到下标为几的节点了,创建节点的时候用
    
    //创建字典树
    TrieNode *CreatTrie()
    {
        TrieNode *tmp = &Memory[allocp++];//tmp是指向树根的指针
        tmp->nCount = 1;
        for(int i = 0; i < 26; i++)
            tmp->next[i] = NULL;//每次创建节点之后树根下面都是空的
        return tmp;//返回所建立的数的树根,改树根是谁的子树,返回值就赋给谁的成员
    }
    
    //在字典树中插入字符串
    void InsertTrieTree(TrieNode **root, char *str)
    {
        TrieNode *tmp = *root;
        int i = 0, k;
        while(str[i])
        {
            k = str[i] - 'a';//0-25分别代表26个英文字母
            if(tmp->next[k])//如果这个词中的某个字母在相应位置出现过,
            {               //那么相应位置的前缀数目就加1
                tmp->next[k]->nCount++;
            }
            else//如果这个词在相应位置没有出现过,就在树中的相应位置加上该节点
            {
                tmp->next[k] = CreatTrie();
            }
            i++;
            tmp = tmp->next[k];
        }
    }
    
    //查询一个字符串,返回字符串在字典中出现的次数
    int SearchTrieTree(TrieNode **root, char *str)
    {
        TrieNode *tmp = *root;
        int i = 0, k;
        while(str[i])
        {
            k = str[i] - 'a';
            if(tmp->next[k])
                tmp = tmp->next[k];
            else
                return 0;
            i++;
        }
        return tmp->nCount;z
    }
    
    int main()
    {
        char s[11];
        TrieNode *root = CreatTrie();
        while(gets(s) && s[0] != '0')
        {
            InsertTrieTree(&root, s);
        }
        while(gets(s))
        {
            printf("%d
    ", SearchTrieTree(&root, s));
        }
        return 0;
    }
  • 相关阅读:
    topcoder srm 320 div1
    topcoder srm 325 div1
    topcoder srm 330 div1
    topcoder srm 335 div1
    topcoder srm 340 div1
    topcoder srm 300 div1
    topcoder srm 305 div1
    topcoder srm 310 div1
    topcoder srm 315 div1
    如何统计iOS产品不同渠道的下载量?
  • 原文地址:https://www.cnblogs.com/rain-1/p/5027882.html
Copyright © 2011-2022 走看看