字典树小结

字典树:

字典树 即Tire树,以一个空的头结点分若干的分支,来存放数据,虽浪费了大量内存,但是查找速度非常快。

匹配 时间复杂度 O(n) n = strlen(a);

字典树分 3步,建树、插入、查找

当然有时候,建树的选择是很重要的一点,尽量本着少往字典树上添加节点的原则,容易爆!!!

列入下面这题,用m建树,n来查找,即可AC,如果用n来建树,就会爆内存,所以建树的选择是很重要的一点

给定n个字符串,m个字符串,判断n中有多少个 是与m不一样的字符串。

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm>
const int N = 20010;
using namespace std;

struct node{
    int flag;//标记作用
    node *next[26];
};
int n,m;
struct node *Creat()  //建树
{
    node *p = new node;
    for(int i = 0;i<26;i++)
    {
        p->next[i] = NULL;
    }
    p->flag = 0;
    return p;
}

void INsert(node *root,char *b) //插入
{
    int num;
    int len = strlen(b);
    node *p = root;
    for(int i = 0;i<len;i++)
    {
        if(b[i]>='A' && b[i]<='Z')
            num = b[i]-'A';
        else
            num = b[i]-'a';
       if(p->next[num]==NULL)//如果为空,在当前节点的基础上在建树
       {
           p->next[num] = Creat();
       }
        p = p->next[num]; //指针移动到下一个节点
    }
    p->flag = 1;  //插入完成标记为1
}

int Search(node *root,char *b)  //查找
{
    node *p = root;
    int num;
    int len = strlen(b);
    for(int i = 0;i<len;i++)
    {
        if(b[i]>='A' && b[i]<='Z')
            num = b[i] - 'A';
        else
            num = b[i]-'a';
        if(p->next[num]==NULL) //不存在
            return 0;
            p = p->next[num];
    }
    if(p->flag==1) //找到
    {
        p->flag = 0;//预防重复查找
         return 1;
    }

    return 0;
}
void FREE(struct node*root)
{
    for(int i = 0;i<n;i++)
    {
        if(root->next[i]!=NULL)
        {
            FREE(root->next[i]);
        }
    }
    free(root);

}
int main()
{
    char a[N][50],s[50];
    node *p;
   while(scanf("%d",&n),n)
   {
       scanf("%d",&m);
       p = Creat();

       for(int i = 0;i<n;i++)
       {
           scanf("%s",a[i]);
       }

       for(int i = 0;i<m;i++)
       {
           scanf("%s",s);
           INsert(p,s);
       }
       int sum = 0;
       for(int i = 0;i<n;i++)
       {
           sum += Search(p,a[i]);
       }
       printf("%d\n",n-sum);
       FREE(p);
   }
    return 0;
}

字典树小结,布布扣,bubuko.com

时间: 2024-10-21 00:46:09

字典树小结的相关文章

剑指Offer——Trie树(字典树)

剑指Offer--Trie树(字典树) Trie树 Trie树,即字典树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种.典型应用是统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计.它的优点是:最大限度地减少无谓的字符串比较,查询效率比哈希表高. Trie的核心思想是空间换时间.利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的. Trie树也有它的缺点,Trie树的内存消耗非常大.当然,或许用左儿子右兄弟的方法建树的话,可能会好点.可见,优

【数据结构】第9章 查找! (二叉搜索树BST AVL树 B-(+)树 字典树 HASH表)

难产的笔记...本来打算用1天 结果前前后后拖了5天 §9.1 静态查找表 9.1.1 顺序表的查找 各种扫 自己脑补吧 复杂度O(n) 9.1.2 有序表的查找 若表是单调的,则可以利用二分查找.复杂度O(logn) 9.1.3 静态树表的查找 见 http://blog.csdn.net/area_52/article/details/43795837 9.1.4 索引顺序表的查找 建立索引表查找 §9.2 动态查找表 动态查找表的特点是,表结构本身是在查找过程中动态生成的,即对于给定值ke

hdu 1251 统计难题(字典树)

Problem Description Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀). Input 输入数据的第一部分是一张单词表,每行一个单词,单词的长度不超过10,它们代表的是老师交给Ignatius统计的单词,一个空行代表单词表的结束.第二部分是一连串的提问,每行一个提问,每个提问都是一个字符串. 注意:本题只有一组测试数据,处理到文件结束. Output 对于每个提

51nod round3# 序列分解(折半枚举+字典树)

小刀和大刀是双胞胎兄弟.今天他们玩一个有意思的游戏. 大刀给小刀准备了一个长度为n的整数序列.小刀试着把这个序列分解成两个长度为n/2的子序列. 这两个子序列必须满足以下两个条件: 1.他们不能相互重叠. 2.他们要完全一样. 如果小刀可以分解成功,大刀会给小刀一些糖果. 然而这个问题对于小刀来说太难了.他想请你来帮忙. Input 第一行给出一个T,表示T组数据.(1<=T<=5) 接下来每一组数据,输入共2行. 第一行包含一个整数n (2<=n<=40且为偶数). 第二行给出n

白话算法与数据结构之【字典树】

1. 什么是trie树 1.Trie树 (特例结构树) Trie树,又称单词查找树.字典树,是一种树形结构,是一种哈希树的变种,是一种用于快速检索的多叉树结构.典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计.它的优点是:最大限度地减少无谓的字符串比较,查询效率比哈希表高.      Trie的核心思想是空间换时间.利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的. Trie树也有它的缺点,Trie树的内存消耗非常大.当然,或许用左儿子

[算法系列之二十]字典树(Trie)

一 概述 又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种.典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计. 二 优点 利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希表高. 三 性质 (1)根节点不包含字符,除根节点外每一个节点都只包含一个字符: (2)从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串: (3)每个节点的所有子节点包含的字符都不相同. 单词列表为"apps&

poj 3764 The xor-longest Path(字典树)

题目链接:poj 3764 The xor-longest Path 题目大意:给定一棵树,每条边上有一个权值,找出一条路径,使得路径上权值的亦或和最大. 解题思路:dfs一遍,预处理出每个节点到根节点路径的亦或和rec,那么任意路径均可以表示rec[a] ^ rec[b],所以问题 就转换成在一些数中选出两个数亦或和最大,那么就建立字典树查询即可. #include <cstdio> #include <cstring> #include <algorithm> us

字典树

字典树(Trie)是一种很特别的树状信息检索数据结构,如同其名,它的构成就像一本字典,可以让你快速的进行字符插入.字符串搜索等. Trie 一词来自 retrieval,发音为 /tri:/ "tree",也有人读为 /tra?/ "try". 字典树设计的核心思想是空间换时间,所以数据结构本身比较消耗空间.但它利用了字符串的共同前缀(Common Prefix)作为存储依据,以此来节省存储空间,并加速搜索时间.Trie 的字符串搜索时间复杂度为 O(m),m 为最

字典树的简单实现

Trie树,又称为字典树,是一种树形结构,是一种哈希树的变种,是一种用于快速检索的多叉树数据结构. 用于保存大量的字符串.它的优点是:利用字符串的公共前缀来节约存储空间. Trie的核心思想是空间换时间.利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的. 它有3个基本性质: 1.根节点不包含字符,除根节点外每一个节点都只包含一个字符. 2.从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串. 3.每个节点的所有子节点包含的字符都不相同. 搜索字典项目的方法为: (1)