多米诺骨牌匹配算法

时间:2011-03-28 10:20:01

标签: algorithm language-agnostic matching

给定一些输入,包括左右符号,输出链连接输入。

想象一下输入是多米诺骨牌,你不能水平翻转并需要将它们链接在一起。创建大型循环链(忽略,如果你不能用真正的多米诺骨牌实际做到这一点)比小型循环链更受欢迎,小型循环链优先于起点和终点不匹配的链。

我们正在寻找具有更多循环链(无论多少或链长)的输出。例如,3个圆形链的输出优于1个大链和剩余的单个多米诺骨牌。

有人能指出我正确的方向吗?这属于哪一组问题,是否存在解决此问题的现有算法?

示例(输出可能不正确!):

in[0]=(A,B)
in[1]=(B,C)
in[2]=(C,A)
out[0]=(0,1,2)

in[0]=(A,B)
in[1]=(B,A)
in[2]=(C,D)
in[3]=(D,C)
out[0]=(0,1)
out[1]=(2,3)

in[0]=(A,B)
in[1]=(B,A)
in[2]=(C,D)
in[3]=(E,F)
out[0]=(0,1)
out[1]=(2)
out[2]=(3)

in[0]=(A,B)
in[1]=(B,A)
in[2]=(C,D)
in[3]=(D,E)
out[0]=(0,1)
out[1]=(2,3)

in[0]=(A,B)
in[1]=(B,C)
in[2]=(C,D)
out[0]=(0,1,2)

4 个答案:

答案 0 :(得分:4)

无法水平翻转的多米诺骨牌==有向图。

将多米诺骨牌一个接一个地称为“路径”,如果它是一个封闭的路径,它就是一个电路。

包含图的所有顶点的电路是哈密顿电路。

图论理论中的问题是:如何将图分割(分解)为具有哈密顿电路的最小数量的子图。 (a.k.a.哈密顿图)

答案 1 :(得分:1)

现在的问题并没有明确说明 - 解决方案究竟是如何评级的?最重要的标准是什么?它是最长链的长度吗?创建长度为1的链是否会受到惩罚?

将这种结构可视化为图形通常很有帮助 - 例如,为每个图块指定一个顶点(V [i])。然后对于每个i,j如果可以将V [i]放在链中的V [j]的左边,则在顶点V [i],V [j]之间创建一条边(如果V [i]对应于(X) ,A)那么V [j]对应于某些X,Y,A的(A,Y)。

在这样的图形链中是路径,循环是闭合的(“圆形”)链,并且问题已经减少到找到图形的一些循环和/或路径覆盖。这种类型的问题反过来经常会减少到匹配或*流问题(max-flow,max-cost-max-flow,min-cost-max-flow或者你有什么)。

但是在你可以进一步减少之前,你必须建立一个准确的规则,根据哪个解决方案被确定为比另一个解决方案“更好”。

答案 2 :(得分:0)

很容易检查是否存在由所有多米诺骨牌组成的圆形链。首先,您需要制作以下有向图G:

  • G的节点是您示例中多米诺骨牌(A,B,C ..)上的符号,
  • 对于每个多米诺骨牌(A,B),你都有一个从A到B的有向边。

如果G中存在Eulerian cycle,则存在由所有多米诺骨牌组成的圆形链。为了检查G中是否存在欧拉循环,检查每个节点的天气是否均匀就足够了。

答案 3 :(得分:0)

我不确定这是不是真的如此,但从你的例子判断,你的问题看起来类似于将排列分解为不相交周期的产物的问题。对于置换P,每个瓦片(X,Y)可以看作P(X)= Y。如果这与您的假设一致,那么好的(或坏的)消息是这种分解是唯一的(直到循环次序)并且很容易找到。基本上,你从任何瓷砖开始,另一方面找到匹配的瓷砖并按照这个,直到找不到匹配。然后你移动到下一个未触动的点。如果这不是您想要的,那么t.dubrownik更常见的基于图形的解决方案就像是要走的路。