解决问题的简单方法确实是预先计算好的地图[坏词] – > [建议].

问题在于,虽然删除一个字母会产生很少的“坏词”,但对于添加或替换,你有很多候选人.

所以我建议另一个解决方案;)

解决方案以增量步骤描述​​,通常搜索速度应该在每个想法中不断改进,并且我尝试首先使用更简单的想法(在实现方面)来组织它们.每当您对结果感到满意时,请随时停下来.

0.初步

>实施Levenshtein距离算法

>将字典存储在排序的序列中(例如std :: set,尽管排序的std :: deque或std :: vector会更好地表现性能)

关键点:

> Levenshtein距离计算使用数组,在每一步中,下一行仅使用前一行计算

>行中的最小距离始终优于(或等于)前一行中的最小值

后一个属性允许短路实现:如果您想将自己限制为2个错误(阈值),那么只要当前行的最小值优于2,您就可以放弃计算.一个简单的策略是将阈值1作为距离返回.

1.第一个暂定

让我们开始吧.

我们将实现一个线性扫描:对于每个单词,我们计算距离(短路),并列出那些到目前为止达到较小距离的单词.

它对小词典非常有效.

2.改进数据结构

levenshtein距离至少等于长度的差异.

通过使用夫妻(长度,单词)而不仅仅是单词作为键,您可以将搜索限制在长度范围[长度 – 编辑,长度编辑]并大大减少搜索空间.

3.前缀和修剪

为了改进这一点,我们可以说,当我们逐行构建距离矩阵时,一个世界被完全扫描(我们寻找的那个)但另一个(指示物)不是:我们每行只使用一个字母.

这个非常重要的属性意味着对于共享相同初始序列(前缀)的两个指示对象,则矩阵的第一行将是相同的.

请记住,我要求您存储字典排序?这意味着共享相同前缀的单词是相邻的.

假设你正在检查你的单词与卡通和在车上你意识到它不起作用(距离已经太长),那么任何以汽车开头的单词也不起作用,你可以跳过单词,只要他们从汽车开始.

跳过本身可以线性地或通过搜索完成(找到比汽车具有更高前缀的第一个单词):

>如果前缀很长(几个要跳过的单词),线性效果最佳

>二分搜索最适合短前缀(许多单词要跳过)

多长时间取决于你的字典,你必须衡量.我会继续二进制搜索.

注意:长度分区对前缀分区起作用,但它会修剪更多的搜索空间

4.前缀和重复使用

现在,我们还将尝试尽可能多地重复使用计算(而不仅仅是“它不起作用”的结果)

假设你有两个词:

>卡通

>洗车

您首先逐行计算矩阵,用于卡通.然后在阅读洗车时,你需要确定公共前缀的长度(这里是汽车),你可以保留矩阵的前4行(对应于void,c,a,r).

因此,当开始计算洗车时,你实际上开始迭代w.

要做到这一点,只需使用在搜索开始时直接分配的数组,并使其足够大以容纳更大的引用(您应该知道字典中最大的长度).

5.使用“更好”的数据结构

为了更轻松地使用前缀,您可以使用Trie或Patricia树来存储字典.然而,它不是STL数据结构,您需要对其进行扩充以在每个子树中存储存储的字长度范围,因此您必须自己实现.它并不像看起来那么容易,因为存在可能会破坏地方的内存爆炸问题.

这是最后的选择.实施成本很高.

c语言英文拼写检查器,c – 简单的拼写检查算法相关推荐

  1. 拼写检查 java_一个简单的拼写检查器

    记得以前就看过这篇文章:How to write a spelling corrector,文章将贝叶斯原理运用于拼写检查,二十几行简单的Python的代码就实现了一个拼写检查器. 原作者python ...

  2. java 拼写检查器,怎样写一个拼写检查器(java版)

    下面是拼写检查器很好的文章,本文参照该文,将实现java版 整个拼写检查器的基础就是贝叶斯概率模型 我简单的介绍一下它的工作原理. 给定一个单词, 我们的任务是选择和它最相似的拼写正确的单词. (如果 ...

  3. C语言自制文件分割器(简单)

    记得初中的时候用MP3看电子书,MP3支持的文本文档格式不能超过1M,否则打不开,然后在网上下了一个文件分割器,感觉真的很强大啊(别吐槽,当时真的很白). 等自己学了C语言后,便想自己弄一个文件分割器 ...

  4. 介绍 Java 平台的 Jazzy:一种新的拼写检查器 API

    计算机擅长执行快速搜索操作,可以根据给定的搜索词,对大量存储的信息快速进行搜索.但是,拼写检查应用程序所要求的搜索能力,不仅仅是正确的字符串匹配.在这篇文章中,我将介绍搜索算法的一些历史,包括语音匹配 ...

  5. Jazzy--一种新的拼写检查器API(Java平台)

    计算机擅长执行快速搜索操作,可以根据给定的搜索词,对大量存储的信息快速进行搜索.但是,拼写检查应用程序所要求的搜索能力,不仅仅是正确的字符串匹配. 在这篇文章中,我将介绍搜索算法的一些历史,包括语音匹 ...

  6. Visual Studio 17.5 拼写检查器预览版现已推出,来说说你的看法吧

    写在前面: Visual Studio17.5版本已添加拼写检查器功能,Visual Studio 中的许多功能旨在帮助你编写所需的代码.Visual Studio帮助你确保代码的编译,甚至可以帮助代 ...

  7. matlab清除所有数据,清除仿真数据检查器中的所有数据

    将数据记录到仿真数据检查器 此示例将模型 slexAircraftExample 的仿真数据记录到仿真数据检查器.该模型未配置为记录数据.加载该模型,并标记 Stick.alpha, rad 和 q, ...

  8. OpenCV使用神经网络检测颜色检查器

    OpenCV使用神经网络检测颜色检查器 使用神经网络检测颜色检查器 建造Building 示例的源代码 解释 设置标题和名称空间 创建检测器对象 加载模型 (可选)将dnn后端设置为CUDA 运行检测 ...

  9. OpenCV使用基本算法检测颜色检查器

    OpenCV使用基本算法检测颜色检查器 使用基本算法检测颜色检查器 简介 建造Building 示例的源代码 解释 设置标题和名称空间 创建检测器对象 运行检测器 获取ColorCheckers列表 ...

  10. MySQL Shell系列——升级检查器

    MySQL Shell提供了一套工具集,用户可以利用这套工具集完成不同的MySQL 任务.在这一篇文章里,将为读者介绍升级检查器. 用户可以使用升级检查器来检查MySQL 5.7服务器实例,以及MyS ...

最新文章

  1. LPMS_IMU在TX2上使用
  2. Latex 中连加符号的上下界问题总结
  3. JavaScript的Generator理解使用
  4. mysqli与pdo防sql注入源码
  5. docker-compose部署Minio
  6. 循环变量到底应该使用int还是unsigned int?
  7. linux 查看libevent 安装目录,Linux系统centos6.7上安装libevent
  8. HTML和XHTML解析(HTMLParser、BeautifulSoup)
  9. [Java][Android][Process] Process 创建+控制+分析 经验浅谈
  10. python中jieba库安装中出现pip库需要更新怎么办_python安装jieba库
  11. spurious wakeup -- 多线程之虚假唤醒
  12. Excel中28个基本图
  13. 计算机视觉之图像分类
  14. arduino自制cnc绘图仪_Arduino + 光驱改造数控绘图机
  15. java 16进制与汉字_汉字转16进制方法
  16. 51系列单片机指令快速记忆法
  17. Happy Hours, Happy Days
  18. 解决animate.css在谷歌浏览器下无效
  19. Hibernate Envers
  20. ps如何实现阳光照射效果

热门文章

  1. plot画图颜色设置
  2. 蓝奏云自定义域名链接替换网站源码
  3. 天下3各服务器最新互转查询,转服必看 大荒最新服务器火爆度排行榜
  4. 【进制转换】如何使用C++将2进制转换为16进制?
  5. MHL技术剖析,比HDMI更强【转】
  6. html日志网页,以HTML为表现的日志记录组件
  7. java fact函数_Fact 定义一个类Fact表示无符号有理数(分数) 联合开发网 - pudn.com...
  8. 小米路由器 mini 有线中继设置教程
  9. 完美安装运行Xcelsius 2008 SP3解决方案
  10. Python中的六种基本数据类型