【发布时间】:2013-08-02 17:41:35
【问题描述】:
截至目前,我决定拿一本字典并遍历整个内容。每次看到换行符时,我都会创建一个包含从该换行符到下一个换行符的字符串,然后执行 string.find() 以查看该英文单词是否在其中。这需要很长时间,每个单词大约需要每秒 1/2-1/4 秒来验证。
它运行良好,但我需要每秒检查数千个单词。我可以运行几个窗口,这不会影响速度(多线程),但它仍然只能每秒检查 10 个。 (我需要数千)
我目前正在编写代码来预编译一个包含英语中每个单词的大型数组,这应该会加快速度,但仍然没有达到我想要的速度。 必须有更好的方法来做到这一点。
我正在检查的字符串如下所示:
"hithisisastringthatmustbechecked"
但其中大部分都包含完整的垃圾,只是随机字母。
我无法检查不可能的字母组合,因为在 'thatmust' 之间,该字符串会因为 'tm' 而被丢弃。
【问题讨论】:
-
单词不能用空格分隔吗?您必须验证所有字母都构成单词,还是至少检测到一个英文单词就足够了?您是否按使用频率对单词进行排序并从最常用的单词开始?
-
您实际上想要完成什么?字符串中是否有空格?你需要这个完全准确还是概率猜测好?垃圾线是随机字符还是什么?
-
我会首先生成一个经常引用的非单词的缓存——可能是 4-6 个字符的前缀,这些字符永远不会有效。有几种方法可以做到这一点。
-
我可以看到一些方法来做到这一点,但我认为神奇的调味汁将在字典数据结构中。也许将字典存储为一棵树,每个节点都是一个字母,所以所有到叶子的路径都会产生一个完整的单词。 (所以 h-a-t
-
例如,假设“stbe”不是任何有效单词的开头。当你在上面的字符串中找到“stbe”时,你会检查你的缓存,发现它是无效的,然后快速继续。
标签: c++ string linguistics