我正在尝试编写一个 shell 脚本来生成少于 20 个字符的英语中所有可能的单词。我怀疑除了暴力破解之外,还有什么真正有效的方法可以做到这一点。显然,这会产生很多乱码,但通过整个集合,如果范围甚至可以在相当长的时间内计算出来,我希望探索人类语言的各个方面。
另外,如果有人知道如何计算或告诉我空间是什么,我很想知道。我想这是基本的组合或排列,但我不知道哪个是哪个。 26 个字母。 20 或 25 长度。我确信 25 提供了足够的复杂性来想出一些好词,但这必然会显着增加计算量。毫无疑问,该系列将是aaaaaaadfsf 和bungology。
答案1
实际上有一个名为 的文件/usr/share/words
,其中包含所有英文单词。
我可能会使用该文件来查找所有英语单词并使单词达到特定长度,您可以这样做,
awk 'length <=20' /usr/share/words | wc -l
我在该文件中得到了 479396 个单词。
答案2
如果你想要 20 个字符的单词,那么有 26 个字母
26^20 = 19928148895209409152340197376
的可能性。现在的计算机速度很快,但是它们足够快吗?祝你好运 ;)
答案3
由于您正在查找小于 的单词20 characters
,因此这包括1, 2, 3 .. or 19 characters
长度较长的单词(不确定英语中是否存在包含 19 个字符的单词)。那么可能性的总数是 26 19 + 26 18 + 26 17 .. + 26 1。
解决这个问题的强力方法是创建一个包含英语语言的所有 26 个字母表的列表。然后在循环内,使用字母表数组中的 26 个字符for i = 0; i < 20; i++
创建所有可能的长度单词。i
递归是你的朋友。一旦你有了一个长度为 的单词i
,你就可以将它传递给任何filtering rules
用于定义英语单词的单词,例如,如 slm 提到的,没有元音的单词不能存在。
注意:编写所谓的filtering rules
并不是一项简单的任务。例如,检查该单词是否包含任何 of 是相当容易的aieou
,但是通过此检查并不意味着您已经找到了一个单词......距离那里还有很长的路要走。
这种暴力方法需要多长时间?
吉米发布了这一消息26^20 = 19928148895209409152340197376 ~ 2e28
。现在假设您的计算机有一个quad core 1.5 GHz processor
并且您的程序能够利用每个核心100%
。这会1.5e9 x 4 = 6e9
在一秒钟内给你循环。每个排列本身都需要multiple CPU cycles
考虑26 characters
每个排列等。然而,与 相比,这个数字是微不足道的,# of permutations
所以我们可以说每个排列需要6 instructions
(并且每个指令需要1 CPU cycle
)以使数学简单。最后,你得到了(6 instructions/permutation x 2e28 permutations)/(6e9 instructions/second) = (2e19 seconds) ~ 6.35e11 years
。