`

Trie数据结构

 
阅读更多

/**********************************************************
数据结构:
Trie树,又称单词查找树或字典树,是一种树形结构,是一种哈希树的变种;

基本原理:
Trie树的核心思想是空间换时间,利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的;

应用:
用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计;

优点:
最大限度地减少无谓的字符串比较,查询效率比哈希表高;

基本特性:
(1)根节点不包含字符,除根节点外每一个节点都只包含一个字符;
(2)从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串;
(3)每个节点的所有子节点包含的字符都不相同;

***********************************************************/
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<climits>
#include<algorithm>
using namespace std;

const int MAX=26;

struct Trie //Trie结点声明
{
    bool isStr;//标记该结点处是否构成一个串
    Trie *next[MAX];//一个指针数组,存放着指向各个儿子节点的指针
};

void insert(Trie *root,const char *s) //将单词s插入到字典树中
{
    if(root==NULL||*s=='\0')
        return;
    Trie *p=root;
    while(*s)
    {
        if(p->next[*s-'a']==NULL)//如果不存在存储该字符的节点,则建立结点
        {
            Trie *temp=new Trie;
            for(int i=0; i<MAX; i++)
            {
                temp->next[i]=NULL;
            }
            temp->isStr=false;
            p->next[*s-'a']=temp;
            p=p->next[*s-'a'];
        }
        else
        {
            p=p->next[*s-'a'];
        }
        s++;//让指针s指向下一个字符
    }
    p->isStr=true;//单词结束的地方标记此处可以构成一个串
}

int search(Trie *root,const char *s)//查找某个单词s是否已经存在
{
    Trie *p=root;
    while(p&&*s)
    {
        p=p->next[*s-'a'];
        s++;
    }
    return (p&&p->isStr);  //在单词结束处的标记为true时,单词才存在
}

void del(Trie *root)//释放整个字典树占的堆区空间
{
    for(int i=0; i<MAX; i++)
    {
        if(root->next[i]!=NULL)
        {
            del(root->next[i]);
        }
    }
    delete root;
}

int main()
{
    //freopen("C:\\Users\\Administrator\\Desktop\\kd.txt","r",stdin);
    char s[100];
    Trie * root = new Trie;
    for(int i=0; i<MAX; i++)
    {
        root->next[i]=NULL;
    }
    root->isStr=false;
    int n,m; //n为建立Trie树输入的单词数,m为要查找的单词数
    scanf("%d",&n);
    getchar();
    for(int i=0; i<n; i++) //先建立字典树
    {
        scanf("%s",s);
        insert(root,s);
    }
    while(~scanf("%d",&m))
    {
        if(!m)
            break;
        for(int i=0; i<m; i++) //查找
        {
            scanf("%s",s);
            if(search(root,s))
                printf("YES\n");
            else
                printf("NO\n");
        }
        printf("\n");
    }
    del(root); //释放空间很重要
    return 0;
}

分享到:
评论

相关推荐

    BoostGSOC项目的trie数据结构实现.zip

    Trie数据结构,也被称为前缀树或字典树,是一种用于高效存储和检索字符串的数据结构。在Boost.GSOC项目中,trie数据结构的实现是为了优化字符串处理操作,特别是在大规模文本数据集上的应用。Boost库是一个著名的C++...

    trie:Trie数据结构的Java实现

    Prefix Trie数据结构的Java实现。 介绍 尝试是类似于基于有序树的数据结构的地图,可快速搜索O(k)的顺序,其中k是键的长度。 阅读有关trie的更多信息。 动机 它最初是为在我的Android应用程序T9 App Launcher中使用...

    LevenshteinTrie:允许模糊字符串匹配的 Trie 数据结构

    允许模糊字符串匹配的 Trie 数据结构 这是 Steve Hanov 在他的编写的 Python 程序的 Go 版本 这已经完成了,但没有测试。 ###这个怎么运作 这是一个基本的 。 您可以搜索作为字符串后缀的所有单词。 您还可以...

    string-trie-java:Java实现的Trie数据结构来存储字符串

    该项目包含一个Java类(StringTrie),该类实现了用于存储字符串的trie数据结构,以及一个用于操纵StringTrie对象的基于菜单的控制台应用程序。 描述 StringTrie支持包含英文字母(A-Za-z),撇号('),连字符/破...

    Extensible Compressed Trie:用C ++编写的可扩展且压缩的trie数据结构。-开源

    标题中的“Extensible Compressed Trie”指的是一个用C++实现的可扩展且压缩的Trie数据结构。Trie,又称前缀树或字典树,是一种用于存储键值对的数据结构,尤其适用于字符串查找操作。它通过将字符串的字符作为节点...

    autocomplete:使用trie数据结构的低级原始自动完成

    使用trie数据结构的低级原始自动完成 特征 该自动完成库具有手动插入单词,根据查询获取单词建议,用单词的字典数组填充数据结构以及删除不需要的单词的能力。 注意:默认情况下,库中不填充任何单词。 插入方式 ...

    rust_sequence_trie:符合人体工程学的trie数据结构

    `rust_sequence_trie`项目是一个用Rust编程语言实现的Trie数据结构库,其设计目标是提供一个符合人体工程学的接口,便于开发者在Rust环境中进行使用。 Trie数据结构的主要特点是将字符串按照字符顺序存储,形成一棵...

    library-trie:C ++ Trie数据结构实现

    **C++ Trie 数据结构实现详解** 在计算机科学中,Trie(发音为“try”,也称为前缀树或字典树)是一种特殊的树状数据结构,用于存储字符串。它的主要特点是能够快速查找以特定前缀开头的所有字符串。Trie 结构在...

    节点数字树:Trie数据结构

    数字树一个trie数据结构实现。 全面测试实用程序:可克隆和可序列化(到/来自json) 通过前缀搜索值安装npm install --save digital-tree2.0.0版几乎是一个完整的重写,并且大多数不向后兼容APIcreate()/ Ctor ...

    数据结构Trie及其应用.pdf

    数据结构Trie,又称前缀树或字典树,是一种用于快速检索字符串数据集的树形...总体而言,Trie数据结构在字符串处理和大数据分析领域中扮演着重要的角色,其在不同领域的应用都反映了其作为数据结构的多样性和强大功能。

    JTrie:自定义实现的Trie数据结构

    **JTrie: 自定义实现的Trie数据结构** 在计算机科学中,Trie(发音为“try”,又称前缀树或字典树)是一种用于存储键值对的数据结构,尤其适用于字符串类型的键。Trie的主要特点是它能快速查找具有公共前缀的键,...

    Trie:Java项目-使用动态Trie数据结构来组织具有公共前缀的单词的字典

    在这个Java项目中,我们利用动态Trie数据结构来构建一个字典,能够快速地查找和管理具有公共前缀的单词。 Trie数据结构的基本思想是将每个字符作为树的一个节点,根节点代表空字符串。从根节点开始,每个节点都指向...

    trie-0.1.1.tar

    Trie数据结构详解与应用 Trie,又称为前缀树或字典树,是一种用于存储字符串的树形数据结构。它的主要特点是通过关联字符来构建树的节点,从而实现快速的字符串查找、插入和删除操作。Trie在信息技术、搜索引擎优化...

    QTrie:Java中的trie数据结构

    QTrie是一种在Java中实现的Trie数据结构,也被称为前缀树或字典树。Trie是一种用于存储字符串的数据结构,它通过关联每个字符到一个节点来高效地执行前缀搜索。这种数据结构在处理大量字符串集合时,特别是在需要...

    Louds-Trie:在 D 和 Python 中实现 Trie 数据结构

    Louds-Trie 在 D 和 Python 中实现 Trie 数据结构。 ##Test D 实现 $cd d$dmd test.d bitarray.d lib/exception.d lib/random/random.d lib/random/string.d queue.d trie.d -unittest$./test##运行Python实现 $cd ...

    Trie-APIs-In-Java-With-Tests:与Trie数据结构相关的API集合,以Java实现并得到强大的测试支持

    带有测试的Java中的Trie API 与Trie数据结构相关的API集合,以Java实现,并经过严格的测试支持,以及一个示例问题,该问题通过通过(依赖项注入框架)向其中注入Trie服务来使用Trie。使用的框架/库- -Google的依赖...

    lighter-tree:轻量级JavaScript trie数据结构实现

    lighter-tree模块是轻量级的trie数据结构实现。 它可用于构建值的结构,并对所有非空值(包括不是树实例的叶子)执行预遍历。 安装 在您的项目目录中,安装并另存为依赖项: npm install --save lighter-tree 原料...

    HASH(Trie)-.rar_HashTree.h_TRIE_hash树_trie树_字典树

    哈希 Trie 树,也称为 HashTrie 或者是哈希化的 Trie 树,是一种结合了哈希表和 Trie 数据结构特点的数据结构。它在 Trie 树的基础上引入了哈希函数,提高了查找效率。Trie,又被称为前缀树或字典树,是一种用于存储...

    L2:一个BST,B树和trie数据结构库。-开源

    标题中的“L2”是一个数据结构库,特别提到了它包含对BST(二叉搜索树)、B树以及Trie数据结构的支持。这些是计算机科学中常见的数据组织方式,用于高效地存储和检索数据。 1. **二叉搜索树(BST)**:二叉搜索树是...

    libdatrie_0.1.2.orig.tar.gz_TRIE_double array_double array trie_

    "double array" 指的是“双数组”,这是实现Trie数据结构的一种特定方法。双数组Trie是一种高效的空间优化技术,它将字符映射到两个数组中,以减少内存占用并提高查询速度。 "double array trie" 是双数组Trie的...

Global site tag (gtag.js) - Google Analytics