当前位置: 首页 > news >正文

【C/C++】用状态机和字典树统计单词:从“能数”到“数得清楚”

目录

  • 用状态机和字典树统计单词:从“能数”到“数得清楚”

用状态机和字典树统计单词:从“能数”到“数得清楚”

学习代码:count/count.ccount/count_every_word.c

这个练习看起来只是统计文本单词数量,但真正训练的是“状态机思维”。如果只是遇到字母就加一,很快会出错,因为一个单词包含多个字母,连续字母不能重复计数。正确的想法是:遍历每个字符时,先判断自己当前处在什么状态,再根据输入字符决定是否切换状态。

count.c里,我把状态拆成三个:

#defineOUT0#defineDASH1#defineIN2

核心逻辑是从OUT读到字母时,说明一个新单词开始,所以计数加一;如果已经在IN状态,再读到字母就不重复加。代码片段如下:

if(isalpha((unsignedchar)c)){if(status==OUT)words++;status=IN;}elseif(c=='-'&&status==IN){status=DASH;}elseif(c=='\n'&&status==DASH){status=IN;}else{status=OUT;}

这里我觉得最有价值的是DASH状态。英文文本里可能出现word-\nword这种换行断词,如果简单把横杠和换行都当成分隔符,就会把一个词误判成两个词。新增DASH状态后,程序能表达“我刚刚在单词中遇到了横杠,下一步要看是不是换行”的中间态。这个中间态就是状态机比简单 if 判断更清晰的地方。

count_every_word.c中,需求从统计总数升级到统计每个单词出现次数,于是引入字典树:

typedefstructTrieNode_s{structTrieNode_s*nodes[26];intcounts;}TrieNode;

每读到一个字母,就沿着nodes[c - 'a']往下走;单词结束时,在当前节点counts++。字典树的好处是前缀可以复用,比如appapple前三个节点共用,查询和插入的复杂度主要取决于单词长度。

我的体会是,文本处理不能只盯着“字符”,还要盯着“上下文”。状态机负责识别单词边界,字典树负责保存统计结果,一个解决解析问题,一个解决存储问题。把这两个工具组合起来,代码就从零散判断变成了有结构的程序。

学习链接: https://github.com/0voice

http://www.jsqmd.com/news/1083859/

相关文章:

  • 怎样高效使用res-downloader:视频资源下载实战操作全面解析
  • 通用企业官网系统 — PRD与系统架构方案提示词
  • 酒店智能客控对OTA评分的影响实测
  • 降AI率软件红黑榜:亲测3款热门工具,揭露降AI真实效果与隐藏坑点,文末附方法
  • 大规模系统可靠性量化:基于参考状态与矩阵运算的高效分析方法
  • ETS2LA:欧洲卡车模拟2自动驾驶终极指南 - 重新定义卡车驾驶体验
  • 如何零代码实现抖音直播间数据实时监控?DouyinLiveWebFetcher终极指南
  • Cesium 计算方位角教程
  • 判断力:钱学森说的“性智”,今天终于可以工程化了
  • CVE-2024-50967漏洞复现:DATAGerry接口未授权访问与敏感信息泄露
  • 技术问答自动整理:用 OpenClaw 爬取并整理 Stack Overflow/CSDN 优质问答
  • 市面上专业的CD3E膜蛋白供应商口碑
  • 3分钟解放你的QQ音乐:macOS专属格式转换全攻略
  • 5分钟上手!在IDEA中打造你的专属阅读空间:Thief-Book插件完全指南
  • 如何诊断和修复Steam Achievement Manager成就数据加载异常问题
  • ALVR:开源无线VR串流方案,彻底解放你的虚拟现实体验
  • 工业机器人五大核心趋势:重构智能制造新生态
  • Hermes Agent 从入门到企业实战-09:Hermes-Agent工具集与MCP-Server配置实战
  • 内景 文化展馆博物馆模型
  • 2026精密高速模具机新机选型:高端台系工艺如何重塑国产增压器标杆
  • Cesium 计算新坐标教程
  • UvSquares:Blender UV编辑的终极网格重塑插件指南
  • 雷达信号通信过程仿真MATLAB 实现
  • 4G与Lora结合的远程光照监测系统设计与优化
  • 深入理解 Musl libc 线程等待机制:从 pthread_join 到超时控制
  • 2026年国内GEO培训深度复盘,信源基建教学:为什么普通学员做不出权威权重
  • 数据中心固态变压器:算力时代供电架构的范式迁移
  • 微信小程序逆向工程终极指南:5步快速掌握wxapkg文件完整解包技术
  • Claude Code /powerup 教程
  • 微分不是微小差值近似,是剥离宏观螺旋、单独提取无穷小微观生长单元的原生尺度-《全域数学vs传统数学:人类文明进阶200讲》第52讲 高中通俗版逐字稿