zoukankan      html  css  js  c++  java
  • Trie树

    Trie总结

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

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

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

    View Code
     1 #include<iostream>
     2 #include<string.h>
     3 #include<stdlib.h>
     4 #include<stdio.h>
     5 using namespace std;
     6 #define MAX 26//这是代表26个字母,如果包含数字需要重新定义
     7 
     8 struct Trie
     9 {
    10     Trie *next[MAX];
    11     int v;//v可以表示一个字典树到此有多少相同前缀的数目,这里根据需要应当学会自由变化。
    12 };
    13 Trie *root;
    14 
    15 void creatTrie(char *str)//创建结点,并且插入单词
    16 {
    17     int len=strlen(str);
    18     Trie *p=root,*q;
    19     for (int i=0; i<len; i++)
    20     {
    21         int id=str[i]-'0';
    22         if(p->next[id]==NULL)//如果该字母的下一个点为空,则可以插入新
    23         {
    24             q=(Trie *)malloc(sizeof(Trie));
    25             q->v=1;
    26             for (int j=0; j<MAX; j++) q->next[j]=NULL;
    27             p->next[id]=q;
    28             p=p->next[id];
    29         }
    30         else  //若该结点的下一个字母已经在下一个结点中了
    31         {
    32             p->next[id]->v++;//跳过下一个到下下个
    33             p=p->next[id];
    34         }
    35     }
    36     p->v=-1;//该单词插入完毕,封结点
    37 }
    38 int findTrie(char *str)
    39 {
    40     int len=strlen(str);
    41     Trie *p=root;
    42     for (int i=0; i<len; i++)
    43     {
    44         int id=str[i]-'0';
    45         p=p->next[id];
    46         if(p==NULL) return 0;//若为空集,表示不存以此为前缀的串
    47         if(p->v==-1) return -1;////字符集中已有串是此串的前缀
    48     }
    49     return -1;////此串是字符集中某串的前缀
    50 } //比如911为窜已存储,输入9133判断911是不是他的前窜 //当911到达第二个1的时候,p->next[id](2)=NULL
    51 
    52 int dealTrie(Trie *T)//删除树
    53 {
    54     int i;
    55     if(T==NULL) return 0;
    56     for (i=0; i<MAX; i++)
    57     {
    58         if(T->next[i]!=NULL) dealTrie(T->next[i]);
    59     }
    60     free(T);
    61     return 0;
    62 }
    63 int main()
    64 {
    65     int T;
    66     char str[100];
    67     scanf("%d",&T);
    68     while(T--)
    69     {
    70         int n,i;
    71         int flag=0;
    72         root=(Trie *)malloc(sizeof(Trie));//刚开始需要建立结点
    73         for (i=0; i<MAX; i++) root->next[i]=NULL;
    74         scanf("%d",&n);
    75         scanf("%s",str);
    76         creatTrie(str);
    77         for (i=1; i<n; i++)
    78         {
    79             scanf("%s",str);
    80             if(flag) continue;
    81             if(findTrie(str)==-1) flag=1;
    82             else creatTrie(str);
    83         }
    84         if(flag) printf("NO\n");
    85         else printf("YES\n");
    86         dealTrie(root);
    87     }
    88 }
  • 相关阅读:
    基于http实现网络yum源搭建
    基于长轮询简易版聊天室
    放大镜案例
    弹出登录框
    拖拽案例
    js入门之DOM动态创建数据
    heoi2020游记
    省选模拟6&7
    省选模拟5
    后缀自动机总结
  • 原文地址:https://www.cnblogs.com/zsboy/p/2879587.html
Copyright © 2011-2022 走看看