首页 > 编程语言 >数据结构与算法学习(06)查找(3)Trie树(C语言)——BUAA

数据结构与算法学习(06)查找(3)Trie树(C语言)——BUAA

时间:2024-05-26 12:30:09浏览次数:20  
标签:tmp 06 struct Trie BUAA trieNode words root children

文章目录

查找(3)——Trie树(C语言)

介绍

本文为查找第三部分,主要是整理了本人上课时讲的内容,并给出了C语言代码实现

结构实现

  1. 键值由固定的字符序列组成(如数字或字母),如Huffman码、英文单词;
  2. 对应结点的分层标记;
  3. 遍历一条路径便可以得到一个具体的单词

典型应用(字典树)

英文单词仅由26个字母组成(不考虑大小写)

对应字典树每个内部结点都有26个子结点

树的高度为最长单词长度

在这里插入图片描述

代码实现

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

struct trieNode
{
    int isWord;                    // 用于判断是否是一个完整的单词,预防前缀的情况
    struct trieNode *children[26]; // 一般小写英文字母有26个
};

// trie 节点内存分配函数
struct trieNode *trieMalloc()
{
    struct trieNode *ret = (struct trieNode *)malloc(sizeof(struct trieNode));
    ret->isWord = 0;
    for (int i = 0; i < 26; i++)
    {
        ret->children[i] = NULL;
    }
    return ret;
}

// trie 树构造函数
void wordTree(struct trieNode *root, char *words)
{
    struct trieNode *tmp = root;
    while (*words != '\0')
    {
        if (tmp->children[*words - 'a'] == NULL)
        {
            struct trieNode *ret = trieMalloc();
            tmp->children[*words - 'a'] = ret;
        }
        // 注意这两者的顺序
        tmp = tmp->children[*words - 'a'];
        words++;
    }
    tmp->isWord = 1; // 最后 isWord 置为1代表一个单词结束
}

// 查找单词函数
int findWord(struct trieNode *root, char *words)
{
    struct trieNode *tmp = root;
    while (*words != '\0')
    {
        if (tmp->children[*words - 'a'] != NULL)
        {
            tmp = tmp->children[*words - 'a'];
            words++;
        }
        else
        {
            return 0; // 一旦有等于 NULL 的情况,便表明没有查询到单词
        }
    }
    if (tmp->isWord == 1)
    {
        return 1;
    }
    else
    {
        return 0; // 如果此时 isWord 等于0代表查询的只是前缀,并非整个单词
    }
}

int main(void)
{
    char words[40];
    struct trieNode *root = NULL;
    FILE *fp = fopen("D:/C/project2024/keepwords.txt", "r");
    root = trieMalloc();
    while (fscanf(fp, "%s", words) != EOF)
    {
        wordTree(root, words);
    }

    printf("%d ", findWord(root, "auto"));
    return 0;
}

优势

访问速度要求很高的系统中,如拼写检查、词频统计中,trie 结构是一个非常好的选择。

并且,它不需要像哈希查询那样去设计一个合理的哈希函数来避免冲突,对于大数据的查询十分有效

标签:tmp,06,struct,Trie,BUAA,trieNode,words,root,children
From: https://blog.csdn.net/cjh_cr7/article/details/139160815

相关文章

  • C++U7-06-图的进阶存储
    上节课作业讲解:链接:https://pan.baidu.com/s/1A3Y5_12IgwYbmuep0Q2w6Q?pwd=0000提取码:0000  邻接表和链式前向星都是图论中用于表示图的常用数据结构,它们各自有特定的特点和用途。以下是对这两种数据结构的详细解释:邻接表定义与特点:邻接表是用来表示有限图的无序列表的......
  • hduoj 1506(笛卡尔树)
    Problem-1506(hdu.edu.cn)题意坐标轴给定一些矩形,紧密排在一起,每个矩形宽度固定为1,问形成的图案中最大可以组成的矩形面积。思路常规思路是可以用单调栈分别找两边的合法边界,这里使用笛卡尔树。笛卡尔树实现了堆的性质,并且对原数组建立的笛卡尔树进行中序遍历为原数组的顺......
  • Java读取word文件 No valid entries or contents found, this is not a valid OOXML (
    有个项目涉及到了操作word文档,当我把一份未加密word文档放在项目resources目录下进行临时开发,读取这个word时报错:Causedby:org.apache.poi.openxml4j.exceptions.NotOfficeXmlFileException:Novalidentriesorcontentsfound,thisisnotavalidOOXML(OfficeOpenXML......
  • ASE60P06-ASEMI场效应MOS管ASE60P06
    编辑:llASE60P06-ASEMI场效应MOS管ASE60P06型号:ASE60P06品牌:ASEMI封装:TO-220批号:2024+沟道:N沟道导通内阻RDS(ON)Max:19mΩ启动电压:2V-4V最大漏源电流(Id):60A漏源击穿电压(VRM):60V安装方式:直插式封装正向电压:1.3V特性:低压N沟道MOS管产品引线数量:3产品内部芯片个数:2产品内部......
  • 【论文速读】LLM-Augmented Retrieval:EnhancingRetrievalModels Through LanguageMod
    论文链接:https://arxiv.org/html/2404.05825v1文章标题:LLM-AugmentedRetrieval:EnhancingRetrievalModelsThroughLanguageModelsandDoc-LevelEmbedding这篇文章提出了一种与检索模型无关的框架框架,通过大型语言模型来丰富文档的嵌入,显著提高了现有检索模型的性......
  • 春秋CVE-2022-23906
    简介CMSMadeSimplev2.2.15被发现包含通过上传图片功能的远程命令执行(RCE)漏洞。此漏洞通过精心制作的图像文件被利用。正文1.进入靶场2.进入登录界面,弱口令admin/1234563.进入后台,文件上传点4.上传一句话木马图片5.复制图片,后缀改为php6.蚁剑连接7.得到flag......
  • Day3 | 203.移除链表元素 、707.设计链表 、 206.反转链表
    203.移除链表元素建议:本题最关键是要理解虚拟头结点的使用技巧,这个对链表题目很重要。题目链接/文章讲解/视频讲解::https://programmercarl.com/0203.移除链表元素.html思考设置一个虚拟的dummy节点,方便代码逻辑一致,不然要专门处理头节点。定义一个pre节点,作为cur节点的前驱......
  • CSP历年复赛题-P1061 [NOIP2006 普及组] Jam 的计数法
    原题链接:https://www.luogu.com.cn/problem/P1061题意解读:从编号s~t的字母从挑w个,组成一种特殊的数字,数字里字母都是升序的,给定初始数字,要计算后5个。解题思路:1、模拟法模拟样例:2105有效字母范围:b,c,d,e,f,g,h,i,j 初始值:bdfij要计算bdfij的下一个,采取如下步骤......
  • 代码随想录算法训练营第三十六天|860.柠檬水找零、406.根据身高重建队列、452. 用最少
    860.柠檬水找零文档讲解:代码随想录题目链接:.-力扣(LeetCode)注意看提示:bills[i] 不是 5 就是 10 或是 20 场景较为固定遇到了20,优先消耗10classSolution:deflemonadeChange(self,bills:List[int])->bool:total={5:0,10:0,20:0}......
  • [USACO06DEC] Wormholes G(spfa判断环)
    [USACO06DEC]WormholesG题目背景英文题面见此链接题目描述John在他的农场中闲逛时发现了许多虫洞。虫洞可以看作一条十分奇特的有向边,并可以使你返回到过去的一个时刻(相对你进入虫洞之前)。John的每个农场有m......