zoukankan      html  css  js  c++  java
  • 字典树的应用

    又称单词查找树,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
  • 相关阅读:
    使用tcmalloc编译启动时宕机
    使用tcmalloc编译出现undefined reference to `sem_init'
    使用AddressSanitizer做内存分析(一)——入门篇
    VIM-美化你的标签栏
    Entity Framework Code First (六)存储过程
    Entity Framework Code First (五)Fluent API
    Entity Framework Code First (四)Fluent API
    Entity Framework Code First (三)Data Annotations
    Entity Framework Code First (二)Custom Conventions
    Entity Framework Code First (一)Conventions
  • 原文地址:https://www.cnblogs.com/zeze/p/Trie.html
Copyright © 2011-2022 走看看