轻松应用字典树

字典树(Trie),也叫单词查找树或键树,是一种树形结构,属于哈希树的变种。它是一种针对字符串进行操作的数据结构,典型应用是用于统计和排序大量的字符串,如在搜索引擎系统中用于文本词频统计。其主要思想是利用字符串的公共前缀来节约存储空间。字典树在插入和查询字符串的操作上具有较高的效率。

/*-------------字典树查询单词---------------*/#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>#define ALPHABET_SIZE 26/* 定义节点 */
typedef struct TrieNode
{struct TrieNode *children[ALPHABET_SIZE];char character;bool isEndOfWord;} TrieNode;/* 创建新的节点 */
TrieNode *createTrieNode()
{TrieNode *node;node = malloc(sizeof(TrieNode));node->isEndOfWord = false;int i = 0;while (i < ALPHABET_SIZE){node->children[i] = NULL;i++;}return node;
}/* 插入新词到字典树中 */
void insert(TrieNode *root, char *word)
{if ((strlen(word) - 1) != 0){char character = *word;if (root->children[character - 97] == NULL){TrieNode *node = NULL;node = createTrieNode();node->character = character;root->children[character - 97] = node;}word++;insert(root->children[character - 97], word);}else{root->isEndOfWord = true;}return;
}/* 从字典树中搜索单词 */
TrieNode *search(TrieNode *root, char *word)
{TrieNode *temp;while (*word != '\0'){char character = *word;if (root->children[character - 97] != NULL){temp = root->children[character - 97];word++;root = temp;}else{printf("No possible words!!\n");return NULL;}}return root;
}/* 打印单词 */
void printArray(char chars[], int len)
{int i;for (i = 0; i < len; i++){printf("%c", chars[i]);}printf("\n");
}/* 返回所有的相关单词 */
void printPathsRecur(TrieNode *node, char prefix[], int filledLen)
{if (node == NULL)return;prefix[filledLen] = node->character;filledLen++;if (node->isEndOfWord){printArray(prefix, filledLen);}int i;for (i = 0; i < ALPHABET_SIZE; i++){printPathsRecur(node->children[i], prefix, filledLen);}
}/* 遍历字典树查询到符合条件的单词 */
void traverse(char prefix[], TrieNode *root)
{TrieNode *temp = NULL;temp = search(root, prefix);int j = 0;while (prefix[j] != '\0'){j++;}printPathsRecur(temp, prefix, j - 1);
}#define NUMBER_OF_WORDS (354935)
#define INPUT_WORD_SIZE (100)/* 用户输入要查询的词 */
char *receiveInput(char *s)
{scanf("%99s", s);return s;
}int main()
{/* 读取字典文件 */int word_count = 0;char *words[NUMBER_OF_WORDS];FILE *fp = fopen("dictionary.txt", "r");if (fp == 0){fprintf(stderr, "Error while opening dictionary file");exit(1);}words[word_count] = malloc(INPUT_WORD_SIZE);while (fgets(words[word_count], INPUT_WORD_SIZE, fp)){word_count++;words[word_count] = malloc(INPUT_WORD_SIZE);}/* 将单词放入字典树 */TrieNode *root = NULL;root = createTrieNode();int i;for (i = 0; i < NUMBER_OF_WORDS; i++){insert(root, words[i]);}while (1){printf("Enter keyword: ");char str[100];receiveInput(str);printf("\n==========================================================\n");printf("\n********************* Possible Words ********************\n");/* 从字典树中找到单词 */traverse(str, root);printf("\n==========================================================\n");}
}

查询结果示例:

Enter keyword: cc

==========================================================

********************* Possible Words ********************
cc
ccesser
cchaddoorck
ccid
ccitt
cckw
ccm
ccw
ccws

==========================================================
Enter keyword: 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/216904.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ip地址怎么转化为十进制

​IP地址是在计算机网络中广泛使用的一种标识符&#xff0c;它用于唯一地标识网络上的设备。在网络通信过程中&#xff0c;IP地址扮演着非常重要的角色。但是&#xff0c;对于一些非专业人士来说&#xff0c;IP地址可能是一个陌生的概念。为了更好地理解IP地址&#xff0c;本文…

12.字符串拼接【2023.12.4】

1.问题描述 我们在编程过程中经常会遇到把不同字符串拼接在一起的情况&#xff0c;从而更直观地展示给用户我们所要表达的信息。本题将给出两个字符串&#xff0c;请依次将这两个字符串拼接在一起。 2.解决思路 用字符串拼接符 进行连接两个字符串 3.代码实现 str1input(…

OpenStack的TaskFlow

OpenStack TaskFlow 是一个用于处理异步任务和流程的库。它旨在帮助开发者更容易地管理和组织复杂的异步任务。以下是对 OpenStack TaskFlow 机制的详细解释&#xff1a; 任务 (Task): 任务是 TaskFlow 的基本单元&#xff0c;代表着一个工作单元&#xff0c;可以是同步或异步…

XSS漏洞 深度解析 XSS_labs靶场

XSS漏洞 深度解析 XSS_labs靶场 0x01 简介 XSS原名为Cross-site Sciprting(跨站脚本攻击)&#xff0c;因简写与层叠样式表(Cascading style sheets)重名&#xff0c;为了区分所以取名为XSS。 这个漏洞主要存在于HTML页面中进行动态渲染输出的参数中&#xff0c;利用了脚本语…

Apollo配置发布原理解析

&#x1f4eb;作者简介&#xff1a;小明java问道之路&#xff0c;2022年度博客之星全国TOP3&#xff0c;专注于后端、中间件、计算机底层、架构设计演进与稳定性建设优化&#xff0c;文章内容兼具广度、深度、大厂技术方案&#xff0c;对待技术喜欢推理加验证&#xff0c;就职于…

P1单片机定时器配置及定时器中断——C51(超详细)

目录 1. 简介 1.1 概念解读 1.2 定时器怎么定时 1.什么是晶振 2.什么是时钟周期 3.什么是机器周期 4.加1经过了多少时间 1.3 定时器编程 1.如何算出10ms定时器的初值(TL0 TH0) 2.关于TCON ,怎么知道爆表 3.怎么开始计时(TR0) 4.定时器使用是有很多种模式的&#xf…

深入了解基础故障编排:提升系统故障应对能力的关键

在当今高度数字化的世界中&#xff0c;系统的稳定性和可用性对于业务的成功至关重要。然而&#xff0c;在复杂的软件和硬件环境中&#xff0c;故障不可避免地会发生。为了更有效地应对这些故障&#xff0c;基础故障编排成为一项关键的技术。本文将探讨基础故障编排的概念及作用…

「PPT 下载」Google DevFest Keynote | 复杂的海外网络环境下,如何提升连接质量

&#xff08;全网都在找的《社交泛娱乐出海作战地图》&#xff0c;点击获取&#x1f446;&#xff09; 12 月 10 日&#xff0c;“Google DevFest 2023 上海站”大会如期在上海市东方万国宴会中心举办。延续过往的技术交流碰撞、前沿技术学习基调传统&#xff0c;本届大会聚焦行…

【代码随想录】算法训练计划49

dp 1、121. 买卖股票的最佳时机 题目&#xff1a; 输入&#xff1a;[7,1,5,3,6,4] 输出&#xff1a;5 解释&#xff1a;在第 2 天&#xff08;股票价格 1&#xff09;的时候买入&#xff0c;在第 5 天&#xff08;股票价格 6&#xff09;的时候卖出&#xff0c;最大利润 6…

基于导数Zernike多项式拟合技术的干涉测量二维相位展开算法(原文翻译)

Zixin Zhao1&#xff0c;Hong Zhao1、Lu Zhang 1&#xff0c;Fen Gao2&#xff0c;Yuwei Qin3&#xff0c;Hubing Du 摘要: 我们提出了一种适用于一般干涉测量应用的相位展开方法。所提出的方法依赖于导数泽尼克多项式拟合&#xff08;DZPF&#xff09;技术&#xff0c;其中相…

淡化了技术指标 还能做现货黄金交易?

技术指标是分析和预测现货黄金走势的其中一种方法&#xff0c;普通投资者多数依赖技术指标为自己的交易做判断。然而&#xff0c;近几年有一种观点认为&#xff0c;我们应该淡化技术指标&#xff0c;少使用或者不用技术分析来服务我们的交易。这个观点引起了不少投资者的思考&a…

现代密码学复习

密码学总结 目录 密码学总结 第一章——只因础模型与概念 1.1 密码学五元组&#xff08;结合&#x1f40f;皮卷&#xff09; 1.2 Dolev-Yao威胁模型 1.3 攻击类型 1.4 柯克霍夫原则&#xff08;Kerckhoffss principle&#xff09; 1.5 对称、非对称加密 1.6 密码的目标…

优雅玩转实验室服务器(二)传输文件

使用服务器最重要的肯定是传输文件了&#xff0c;我们不仅需要本地的一些资源上传到服务器&#xff0c;好进行实验&#xff0c;也需要将服务器计算得到的实验结果传输到本地&#xff0c;来进行预览或者报告撰写。 首先&#xff0c;由于涉及到服务器操作&#xff0c;我强烈推荐…

【FPGA】Verilog:BCD 加法器的实现 | BCD 运算 | Single-level 16 bit 超前进位加法器 | 2-level 16-bit 超前进位加法器

0x00 BCD 运算 在 BCD 中,使用4位值作为操作数,但由于只表示 0 到 9 的数字,因此只使用 0000 到 1001 的二进制数,而不使用 1010 到 1111 的二进制数(dont care)。 因此,不能使用常规的 2complement 运算来计算,需要额外的处理:如果 4 位二进制数的运算结果在 1010 …

C++共享和保护——(1)作用域

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 人生就像骑单车&#xff0c;要想平衡就…

vue项目中 CDN 是vue本身的依赖可以按需加载还是项目中所有的第三方库都可以按需加载?

这是我看到CDN简介时产生的问题 相信很多小伙伴会有 和我一样的疑问 在这里 我也统一回答一下 CDN&#xff08;内容分发网络&#xff09;是一种通过将数据分发到全球各个节点&#xff0c;以提供快速、可靠的内容传输的技术。在Vue项目中&#xff0c;CDN可以用于按需加载Vue本…

HTML行内元素与块级元素的区别

目录 行内元素&#x1f338;常见的行内元素&#x1f338;行内元素&#xff08;内联元素&#xff09;的特性 块级元素&#x1f338;常见的块级元素&#x1f338;块级元素的特性 相互转换(display)&#x1f338;行内块状元素的特性 行内元素 &#x1f338;常见的行内元素 <s…

MicroSD 卡 使用读卡器 读取速度测试

设备 - - 电脑为m.2固态硬盘 usb口为USB3.2 gen2接口(即支持1GB/s的接口) cpu: amd3600 测试方案1 直接MicroSD卡放入读卡器测试 38MB/s 从sd卡复制到本地C盘 测试方案2 MicroSD卡使用闪迪的SD卡套套上之后一起插入读卡器 76MB/s 从sd卡复制到本地C盘

HCIA-H12-811题目解析(10)

1、【单选题】DHCP客户端在租期到达哪个比例时第一次发送续租报文&#xff1f; 2、【单选题】在WLAN中用于标识无线网络&#xff0c; 区分不同的无线网络的是&#xff1f; 3、【单选题】我们在笔记本电脑上搜索可接入无线网络时&#xff0c;显示出来的网络名称实际是 4、【单…

[go 面试] 雪花算法与分布式ID生成

关注公众号【爱发白日梦的后端】分享技术干货、读书笔记、开源项目、实战经验、高效开发工具等&#xff0c;您的关注将是我的更新动力&#xff01; 生成全局唯一ID的雪花算法原理 雪花算法是一种用于生成全局唯一ID的算法&#xff0c;最初由Twitter开发&#xff0c;用于解决分…