• 字典树入门


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

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

    描述:建立一个词库,输入若干个单词,输入以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;
    }
  • 相关阅读:
    Docker 部署 Nginx
    Docker 安装 Redis
    linux shell "2>&1"
    定时备份docker mysql
    SpringBoot 中拦截器和过滤器的使用
    SpringBoot WebMvcConfigurer
    springboot自定义参数解析HandlerMethodArgumentResolver
    mysql在linux下查看my.cnf位置的方法
    Linux下设置mysql允许远程连接
    Android项目实战(六十):修改项目包名
  • 原文地址:https://www.cnblogs.com/rain-1/p/5027882.html
Copyright © 2020-2023  润新知