自动图是描述其字母的句子。例如,来自维基百科:
这句话使用两个a,两个c,两个,二十八个e, 五个,三个,八个小时,十一个,三个小时,两个小时, 十三个,九个,两个p,五个r,二十五个s, 二十三个t,六个v,十个w,两个x,五个y和一个z。
这些句子非常难以手工创建,因此计算机最适合完成任务,但如何才能有效地完成? 使用给定的初始字符串查找自动图的有效算法是什么?链接自动图怎么样,前一句话描述了下一个句子的内容?虽然this线程是关于同一主题的,但它只是要求存在,而且所描述的所有算法都太慢了在实践中。
一种天真的方法是搜索可能的数字组合,例如0到40,以寻找可能的解决方案。然而,有40 ^ 26种可能性,这将花费不可能长的时间。
我们可以通过对字母组合进行一些初步猜测,然后只搜索偏离我们猜测偏差3的自动图,以错过解决方案的可能费用来改进我们的搜索。这仍然需要6 ^ 26次。即使每秒进行一百万次检查,也需要超过500万年才能完成。
进一步的改进来自于识别a,b,c,d,j,k,m,p,q和z从不出现在任何数字中,因此这十个字母的计数由初始字符串固定。我们现在只有3万亿个组合 - 仍然不是很好。
从最初的猜测开始可能会更好......
......但这有其公平的限制。尽管这项任务看似毫无结果,但其他人却取得了成功。实际上,http://autograms.net/甚至还有一系列二十五个链接的自动图。怎么样?
答案 0 :(得分:0)
执行此操作的有效方法是将短语替换为描述前一个短语的短语,直到它们相同,即短语是自动图。 但它可能在很多情况下都不起作用。
答案 1 :(得分:0)
我会将其视为整数约束编程问题。定义你的句子结构,如下所示:
<块引用>这句话有 [countA] 'a'[s], [countB] 'b'[s], ... 和 [countZ] 'z'[s]。
我已经包含了所有 26 个字母,但如果例如countB
为零,如您在维基百科中的示例,那么我们可以完全从句子中省略该字母(及其计数);或者,例如,您可以将其设为“零 'b's”。
现在我们可以计算实际使用的字母数量,并写一些限制条件:
countA > 0
(必须),并且不会出现在任何数量的单词中。countB > 0
,它只会出现一次。countE > 0
(它必须),并且:
count
变量等于 1(“一”)、5(“五”)、8(“八”)、9(“九”)、10(“十”)、... ..count
变量等于 3(“三”)、7(“七”)、12(“十二”)、...count
变量等于 11(“十一”)三次,...这些约束有点复杂,但可以使用像 Z3 这样的约束编程框架来制定它们。一些约束可以直接手动简化(例如,countA
必须等于 3,countB
必须等于 0 或 1),但实际上没有必要这样做,因为一个好的约束求解器会这样做无论如何它会自动。