• 字典树的应用


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

    定义

    1 typedef struct trie
    2 {
    3     trie *next[26];
    4     int key;
    5 };
    6 
    7 trie root;

    字典树的建立插入

    void insert(char *str)
    {
        int len=strlen(str);
        trie *p=&root,*q;
        for(int i=0;i<len;i++)
        {
            int id=str[i]-'a';
            if(p->next[id]==NULL)
            {
                q=(trie *)malloc(sizeof(root));
                q->key=1;
                for(int j=0;j<26;j++)//制空下一结点所以字母表
                {
                    q->next[j]=NULL;
                }
                p->next[id]=q;
                p=p->next[id];
            }
            else
            {
                p=p->next[id];
            }
        }
        if(p->key!=-1)
        {
            count++;
            p->key=-1;
        }
        else
            p->key=-1;
    }

    数据结构有关单词的搜索

    ★数据输入
    输入第一行为一个正整数N ( N < =10000)。
    接下来N行,每行开头是一个数字1或者2。
    如果是1,后面会有一个单词,代表Winder在笔记本上记录下这个单词。每个单词仅
    由小写的英文字母组成,且长度不超过8。
    如果是2,则代表Winder想知道现在他已经背了几个不同的单词。
    ★数据输出
    对于每个询问,输出一行一个整数,表示Winder已经背的不同的单词个数。
    输入示例输出示例
    10
    1 winder
    2

    1 hello
    1 what
    1 holy
    1 hello
    2

    1 acm
    1 winder
    2

    输出:
    145

    1,建立字典树

    2,每个单词的最后一个结点位置标记为-1;如果插入单词到最后一个节点值key不为-1,为多一个生词count++;

    附代码:

     1 #include<stdio.h>
     2 #include<string.h>
     3 #include<stdlib.h>
     4 typedef struct trie
     5 {
     6     trie *next[26];
     7     int key;
     8 };
     9 
    10 trie root;
    11 
    12 int count=0;
    13 void insert(char *str)
    14 {
    15     int len=strlen(str);
    16     trie *p=&root,*q;
    17     for(int i=0;i<len;i++)
    18     {
    19         int id=str[i]-'a';
    20         if(p->next[id]==NULL)
    21         {
    22             q=(trie *)malloc(sizeof(root));
    23             q->key=1;
    24             for(int j=0;j<26;j++)
    25             {
    26                 q->next[j]=NULL;
    27             }
    28             p->next[id]=q;
    29             p=p->next[id];
    30         }
    31         else
    32         {
    33             p=p->next[id];
    34         }
    35     }
    36     if(p->key!=-1)
    37     {
    38         count++;
    39         p->key=-1;
    40     }
    41     else
    42         p->key=-1;
    43 }
    44 
    45 int main()
    46 {
    47     int n,x;
    48     char str[9];
    49     scanf("%d",&n);
    50     for(int j=0;j<26;j++)
    51         root.next[j]=NULL;
    52     for(int i=0;i<n;i++)
    53     {
    54         scanf("%d",&x);
    55         if(x==1)
    56         {
    57             scanf("%s",str);
    58             insert(str);
    59         }
    60         else if(x==2)
    61             printf("%d
    ",count);
    62     }
    63     return 0;
    64 }
    View Code
  • 相关阅读:
    C++面向对象笔记:继承、派生
    教你制作伪静态
    安装android环境别忘了加个环境变量sdk_home
    javascript获取asp.net后台代码的方法
    一天学会PHP(转)
    access数据库里面用sql语句随机调用一条数据
    【转】 android sdk setup时出现:HTTPS SSL error , Server:10.159.192.62
    AutoCode下载及具体使用方法
    讲故事谈.NET委托:一个C#睡前的故事
    使用activeskin控件制作VB和易语言的皮肤的视频教程
  • 原文地址:https://www.cnblogs.com/zeze/p/Trie.html
Copyright © 2020-2023  润新知