Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 非常大的排列列表_Algorithm_Permutation - Fatal编程技术网

Algorithm 非常大的排列列表

Algorithm 非常大的排列列表,algorithm,permutation,Algorithm,Permutation,我的问题不是具体的语言。我在让循环处理排列时遇到问题。我正在尝试编写代码以显示26^x的所有值,其中x是字符串的长度。不会提供任何输入字符串,因此如果x=1,它将显示a到z,如果x=2itll显示aa到zz。az被视为与za不同 更具体地说,我想对更长的字符串运行此操作,长度为100+个字符,以查看给定长度的字符串中有多少包含单词而不是随机字母。根据对该问题的评论,尝试枚举所有可能的100个字符字符串有些不切实际 我建议使用另一种策略,生成给定长度的随机字符串,而不是以结构化方式枚举。比如: c

我的问题不是具体的语言。我在让循环处理排列时遇到问题。我正在尝试编写代码以显示
26^x
的所有值,其中
x
是字符串的长度。不会提供任何输入字符串,因此如果
x=1
,它将显示a到z,如果
x=2
itll显示aa到zz。az被视为与za不同


更具体地说,我想对更长的字符串运行此操作,长度为100+个字符,以查看给定长度的字符串中有多少包含单词而不是随机字母。

根据对该问题的评论,尝试枚举所有可能的100个字符字符串有些不切实际

我建议使用另一种策略,生成给定长度的随机字符串,而不是以结构化方式枚举。比如:

count = 0
for i from 0 to simulation_length:
    random_string = ''
    for j from 0 to string_length:
        random_string += random_char()
    // containsWord(string) checks if the random string contains a word
    // this is tricky in and of itself
    if (containsWord(random_string)) count++
...
只要模拟长度足够,随机采样将为您提供整个空间中行为的表示

26^x,其中x是字符串的长度 ... 我想运行更长的字符串,长度超过100个字符

你应该忘掉它

让我们从正确的角度来看问题。英语字母表中有26个字母,所以其中包含100个字符的字符串的总数是

3142930641582938830174357788501626427282669988762475256374173175398995908420104023465432599069702289330964075081611719197835869803511992549376
那是十进制数。以每毫秒1个字符串的速度,需要9.9*10^130年才能全部打印出来。这是宇宙存在时间的7.3*10^120倍


获取单词列表或将字典加载到内存中,然后使用它。

这取决于您对“单词”的定义。如果“a”是一个单词,那么很容易得到100个字符序列中单词的概率下限(大约1-1/e^4)。同样,你可以考虑2个字母的单词和3个字母的单词,并细化概率。在4或5个字母之后,这种概率变得非常准确,因为很少有较长的单词,而且它们随机出现的情况非常罕见。

时间复杂度和单词数为n!,对于100个字符,是9*10^157。任何算法都需要很长的时间才能使单词更少地处理它们。(据我所知)你可以计算出你的程序将产生的长度的单词数。使用字典库计算给定长度的单词数。现在,您可以看到带有随机字母的单词数。@JesusRamos您可以将一枚公平的硬币掷1000001次,并模拟它需要2^1000001步,但几乎不需要时间来预测“Heads”是赢还是输!它可以与迭代器一起使用,而无需生成整个排列列表,但一次只能生成一个排列列表,以及一个用随机数调用它的接口。@ElKamina我知道,但在这种情况下,他可能想将输出与英语单词列表进行比较(即使使用哈希,也可能没有那么快)您可以更直接地进行此操作,方法是取每种长度
n
的单词总数除以
n
,它将是长度为
n
的字母字符串中的单词部分。我认为OP要求将单词作为一个子集来包含,但这更难。是的,这也是我的解释(因此我的回答没有太多意义),但代码并没有真正正确地反映它。正在编辑中…我明白这其中的很多。我计划对前两个字符进行随机手动检查。如果无法开始一个单词,它将放弃该路径。我可能把问题的措辞弄错了,因为它更多的是从两个字符开始,检查一个单词是否可能,如果可能,添加另一个字符并重复,直到其中一个单词不可能或字符串长度已经达到。如果不可能,请移动到该位置的下一个字母。通过为前两个字符设置一些简单规则,可以消除大量的搜索/处理。如果q是第一个,那么第二个只能是元音。其他一些字母也是如此。26^2可能的两个字母组合,例如,q只有5个有效组合,其中它是第一个字母。虽然设置这么多规则仍然不是件有趣的事,但它确实解决了很多问题。此外,由于我正在考虑在给定位置具有特定单词的字符串,因此可以将其分为单词前后的两部分。我们现在想看到的是:大小为50、51、52。。。可以从以下单词的词典构建:“2:183,3:815,4:3181,5:6151,6:9317,7:11962,8:11979,9:10400,10:8065,…”?取{2..20}中n的
值;执行echo-ne“$n\t”;egrep-v“*'s”/usr/share/dict/american english | egrep-c“^.{$n}$”;完成
在给定的字符串长度中指定多个单词。如果用户输入8,它可能返回“itisadog”或“wesaidno”。从这个角度看,拥有一本字典,并寻找所有单词的长度加起来似乎是正确的better@RickieMarsh当前位置但你不希望它们有意义吗?那么
nosaidwe
nonoweno
也适合吗?