我正在努力提高我的伪分支和速度。约束算法我认为特里结构可能很合适,但我被卡住了。
问题(我可以简化和隔离):
我有9个节点& 3辆车。每辆车必须访问3个独特的节点。所以,我创造了每一个可能的旅行(9选择3 = 84)&把它粘在一个数组中。现在,我想找到每一个组合。
例如,旅程1可以是111000000
。行程2为000110001
,行程3为000001110
。 (84 ^ 3 = 592704组合)。
为了确定它们是否匹配,我只是按位&
并接受行程组合,如果值为0。
我不能使用嵌套循环,因为车辆的数量可能会发生变化,因此我会跟踪一个计时器的组合,这个计数器像里程表一样深度上升(例如0,0,82
,0,0,83
, 0,1,0
)。
我通过保持以下数字大于刚增加的数字来减少组合(例如11,83,83
转到12,13,14
,因为第二列中小于12
的任何数字都是重复的例如12,1,1
是1,1,12
}的副本。
我还在每次更改时执行按位AND检查(例如,如果(val[12] & val[13]) > 0
不打扰检查第3列中的71种可能性,因为12和13使路由无效。这会将组合减少到24720。
由于我正在做深度优先,它真的是节省空间(没有队列可以保存),但计算成本很高。我想要做的是使用宽度优先方法来创建子集并最小化搜索空间。例如,假设计数器位于11,19,20
。目前,在将第19列增加到20之前,它将检查第3列中的20-83。我想在继续之前计算第2列中19-83的AND。在这样做的时候,我会知道第一列中不适用于11
的所有值,并且可以将该子数组用于第3列(例如,如果(val[11] & val[45]) > 0
,则不要打扰检查{ {1}},而是使用从第3列中排除45的数组。
我的想法是创建一个trie,其中每个键都是AND操作的结果,使用11 & 19 & 45
键作为子数组。
例如:
end
我的问题是我不能为我的生活弄清楚如何迭代我的数据来增长trie。或者可能有更好的方法?任何建议或代码片段都会很棒,感谢您阅读文本墙。