自动图算法

时间:2015-11-17 22:06:13

标签: algorithm performance

自动图是描述其字母的句子。例如,来自维基百科:

  

这句话使用两个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万亿个组合 - 仍然不是很好。

从最初的猜测开始可能会更好......

  1. 创建一个新的“自动图”,描述上一个自动图的字母数
  2. 检查我们是否重复了自动记录。如果我们有,并且循环长度为1,那么我们就完成了。否则,稍微修改猜测并转到步骤1.
  3. ......但这有其公平的限制。尽管这项任务看似毫无结果,但其他人却取得了成功。实际上,http://autograms.net/甚至还有一系列二十五个链接的自动图。怎么样?

2 个答案:

答案 0 :(得分:0)

执行此操作的有效方法是将短语替换为描述前一个短语的短语,直到它们相同,即短语是自动图。 但它可能在很多情况下都不起作用。

答案 1 :(得分:0)

我会将其视为整数约束编程问题。定义你的句子结构,如下所示:

<块引用>

这句话有 [countA] 'a'[s], [countB] 'b'[s], ... 和 [countZ] 'z'[s]。

我已经包含了所有 26 个字母,但如果例如countB 为零,如您在维基百科中的示例,那么我们可以完全从句子中省略该字母(及其计数);或者,例如,您可以将其设为“零 'b's”。

现在我们可以计算实际使用的字母数量,并写一些限制条件:

  • 字母“a”在结构中出现两次(“has”、“and”),一次 if countA > 0(必须),并且不会出现在任何数量的单词中。
  • 字母“b”不会出现在任何数字单词中,因此如果 countB > 0,它只会出现一次。
  • ...
  • 字母 'e' 在结构中出现 3 次(“句子”),一次 if countE > 0(它必须),并且:
    • 对于每个 count 变量等于 1(“一”)、5(“五”)、8(“八”)、9(“九”)、10(“十”)、... ..
    • 每个 count 变量等于 3(“三”)、7(“七”)、12(“十二”)、...
    • 每个 count 变量等于 11(“十一”)三次,...
    • ...
  • ...

这些约束有点复杂,但可以使用像 Z3 这样的约束编程框架来制定它们。一些约束可以直接手动简化(例如,countA 必须等于 3,countB 必须等于 0 或 1),但实际上没有必要这样做,因为一个好的约束求解器会这样做无论如何它会自动。