给定一个数组,我希望能够定义它的元素之间的某种关系,以便每个元素"指向"给定数量的元素,这样任何元素都不应该与数组的任何其他给定元素共享多个目标元素。
我很确定这可以通过图论的一些解决方案轻松完成,但我很尴尬地不知道任何图论,因此我不知道我在寻找什么。我能说的最好的是描述元素之间链接的图是规则的和有针对性的。
XY:我实际拥有/想要的是二维网格(我不认为维度与数学有关但对可视化非常有帮助),其中每个单元格指向 16(对此灵活)其他细胞重复最少。网格是一种纹理,所以它在256 * 256到4096 * 4096大小范围内的任何地方,这有望对算法没有显着影响。
一旦可视化为2D纹理,就会有一个明显的直观的"基于图像掩码的解决方案,但它完全是非正式的,并且依赖于实现细节(为了说明的目的使用较少的目标):
对指向的单元格使用常规模式是不合适的:
下一个单元格将与原始单元格(红色,x)共享七个目标。保证重复。
一个不规则的圆圈"直觉上的样式安排似乎应该有效:
如果组中没有一对单元格(指向和原点)与组中任何其他单元格的位置具有相同的位置差异,那么原点在网格上的任何给定移动似乎都不应该是#39 ; t导致多个指向的单元格与原始位置中突出显示的任何单元格重叠,并且任何指向(蓝色)单元格都不应直接指向原点(红色,x)(这样会很好)如果他们没有太快回路,那么。)
("假设包裹在"纹理的边缘)
但这完全是非正式和直观的。我没有任何证据证明这一点,也不知道如何证明这一点。是否有一种从图论中得知的算法可以产生这样的结果,而没有涉及图像掩模的虚假手法?尤其是因为直观的解决方案,即使假设它有效,也无法保证目标细胞是否能够快速循环回到原点,以及是否整个网格(或大部分网格,我不是&#39) ;记住一些未使用的单元格)形成一个连接图,这是绝对必要的。
或者,如果"打破了圈子"模型实际上是有效的,如何将其形式化为一个对序列进行操作的抽象算法(我猜它实际上只是一个整数序列),而不是依赖于掩码图像,这完全被混淆了实施细节? (事实上我想将应用于纹理应该是无关紧要的)
答案 0 :(得分:2)
您要做的事情的数学描述是在 Z / w×上建立一个(强烈?)连接的高 - girth Cayley graph Z / h(其中w是纹理的宽度,h是高度),因此没有两个顶点共有多个外邻居。
实际上,每个顶点(即像素)指向固定偏移列表处的像素。如果(0,0)处的顶点(通过Cayley图的顶点传递性的wlog)和(x,y)处的顶点具有共同的两个外邻居,则存在偏移(dx1,dy1),(dx2, dy2),(dx3,dy3),(dx4,dy4)使得(dx1,dy1)=(x + dx2,y + dy2)和(dx3,dy3)=(x + dx4,y + dy4),和( dx1,dy1)≠(dx3,dy3)(等效地,(dx2,dy2)≠(dx4,dy4))。这种情况可以通过编程方式进行验证,对于近距离内的随机偏移组,找到合适的集合并不需要很长时间。这是一些用于生成和测试它们的Python。
from random import randrange
# random pattern of offsets within the square [-k, k] x [-k, k]
def pattern(k, n):
return [(randrange(-k, k + 1), randrange(-k, k + 1)) for i in range(n)]
def valid(pat):
s = set()
for (x1, y1) in pat:
for (x2, y2) in pat:
if ((x1, y1) != (x2, y2)):
(dx, dy) = (x2 - x1, y2 - y1)
if (dx, dy) in s:
return False
s.add((dx, dy))
return True
if __name__ == '__main__':
while True:
pat = pattern(10, 16)
if valid(pat):
break
print(pat)
此代码不验证强连接。我猜想随机偏移集很可能满足强连接性。您可能希望编写更多代码来检查短周期,这可以通过广度优先搜索找到。
上面的代码给出了像
这样的偏移列表[(3, -4), (-8, -9), (2, 7), (-9, 3), (-4, 7), (-2, -7), (-6, 3), (-7, -2), (9, -10), (8, -2), (-6, -3), (2, -8), (-6, 6), (-9, -7), (-7, 10), (3, 10)]
(不知道那个是否有用)。要找出哪些顶点(x,y)指向,通过上面的列表迭代(dx,dy)并产生邻居((x + dx)&(w-1),(y + dy)&(h - 1)),假设w和h是2的幂,我们是两个补码。