zoukankan      html  css  js  c++  java
  • Trie树

    这周将Trie树看了一下下面进行总结

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

    在这个Trie结构中,保存了A、to、tea、ted、ten、i、in、inn这8个字符串(有数字的代表单词)

    个人理解:Trie树就是将每个单词用树形进行存储,当有几个单词有一样的前缀的时候,可有几天支是相同的

    zoj 2876 水题Trie树

    #include<iostream>
    #include<string.h>
    #include<stdlib.h>
    #include<stdio.h>
    using namespace std;
    #define MAX 26//这是代表26个字母,如果包含数字需要重新定义
    
    struct Trie
    {
        Trie *next[MAX];
        int v;//v可以表示一个字典树到此有多少相同前缀的数目,这里根据需要应当学会自由变化。
    };
    Trie *root;
    
    void creatTrie(char *str)//创建结点,并且插入单词
    {
        int len=strlen(str);
        Trie *p=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->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->v=-1;//该单词插入完毕,封结点
    }
    
    int findTrie(char *str)
    {
        int len=strlen(str);
        Trie *p=root;
        for (int i=0;i<len;i++)
        {
            int id=str[i]-'0';
            p=p->next[id];
            if(p==NULL) return 0;//若为空集,表示不存以此为前缀的串
            if(p->v==-1) return -1;////字符集中已有串是此串的前缀
        }
        return -1;////此串是字符集中某串的前缀
    }
    //比如911为窜已存储,输入9133判断911是不是他的前窜
    //当911到达第二个1的时候,p->next[id](2)=NULL
    
    int dealTrie(Trie *T)//删除树
    {
        int i;
        if(T==NULL) return 0;
        for (i=0;i<MAX;i++)
        {
            if(T->next[i]!=NULL) dealTrie(T->next[i]);
        }
        free(T);
        return 0;
    }
    
    int main()
    {
        int T;
        char str[100];
        scanf("%d",&T);
        while(T--)
        {
            int n,i;
            int flag=0;
            root=(Trie *)malloc(sizeof(Trie));//刚开始需要建立结点
            for (i=0;i<MAX;i++)
                 root->next[i]=NULL;
            scanf("%d",&n);
            scanf("%s",str);
            creatTrie(str);
            for (i=1;i<n;i++)
            {
                 scanf("%s",str);
                 if(flag) continue;
                 if(findTrie(str)==-1) flag=1;
                 else creatTrie(str);
            }
            if(flag) printf("NO\n");
            else printf("YES\n");
            dealTrie(root);
        }
    }

    模版网站:http://zh.wikipedia.org/wiki/Trie

     

     

  • 相关阅读:
    asp.net基础开发中常用代码大全
    IPv6網絡開發范例
    [轉]现场:是谁在住救灾帐篷者?
    运送救灾物资路上的感人画面纪实
    DataGridView新特色、常用操作
    [ZT]定制自己的Windows CE 5.0 ARM中文模拟器
    LoadRunner参数化功能详解
    [轉]灾区那么大,王十为什么直奔遵道镇,不去别处?
    [理想?夢想?]ERP项目怎么管
    乞讨老人为地震灾区捐款105元(图)
  • 原文地址:https://www.cnblogs.com/zsboy/p/2543351.html
Copyright © 2011-2022 走看看