解决跳数迷宫


18

我8岁的孩子已经厌倦了创建常规迷宫的工作,并开始创建如下所示的变体:

料斗样品

这个想法是从x开始并通过常规规则到达o。另外,您可以从任何整数跳到任何其他整数b,但是您必须支付| a b | 美元的特权。目标是以最低的成本解决迷宫问题。在上面的示例中,我们可以以成本5通过x-14-18-27-28-o从x转到o,但仅花费x-13-11-9-8-29-28-o便宜4。ab|ab|

所以这是我的问题:解决该问题的最佳解决方案(就渐近运行时间而言)是什么?您可以对输入格式做出任何合理的假设。

注意:我在这里使用“ puzzles”标签是因为我想到的是答案,但是我不确定它是否是最佳选择,并且想看看是否有人可以改善我的解决方案。(这里n是迷宫中的整数数。)O(n2)n


7
为您的孩子创造此类创意和数学难题的道具!
2011年

2
@bbejot您应该看到他问我的一些内容...有时我无法回答他的问题。例如,math.stackexchange.com
questions /

1
我不确定您的费用计算是否正确。X-14-18-27-28 -邻应该花费和x 13-11-9-8-29-28邻应该花费2 + 2 + 1 + 21 + 1 = 274+9+1=142+2+1+21+1=27
戴夫·克拉克

1
@Dave并非所有转换都是跳跃。我们可以写“ ab”表示跳转(代价为),写“ a-> b”表示在图中从a行走到b(代价为0),只有在以下情况下才允许它们可以到达而不会在迷宫中破墙。在这种表示法中,我们有x-> 14-18-> 27-28-> o,成本为5,x-> 13-11-> 9-8-> 29-28-> o。我稀有的Fixee并没有引入这种表示法,因为它是多余的:没有理由跳两次,因此在迷宫中跳来跳去会交替出现。|ab|0
Artem Kaznatcheev

2
这是一个很好的作业问题!
杰夫·杰西斯2011年

Answers:


15

您可以使用Dijkstra算法的变体在时间内解决此问题。当我们访问新节点时,我们可以不执行所有距离更新而摆脱困境。如果我们访问一个节点Ÿ,我们只需要更新一切适宜步行的距离,从Ÿ为0,并更新距离两个节点Ÿ -Ÿ +与最接近的值Ÿ小于和大于ÿ具有不被挑选了。O(nlogn)yyyy+yy

这些更新足以使堆返回最小的元素,因为您跳转到的任何最近的节点在数值上必须刚好在已访问节点的上方或下方。

每个节点最多一次更新为0(如果我们从队列中弹出所有零距离节点以避免二次行为),并且每次添加一个节点,我们只会进行O(1)次其他更新。寻找价值Ÿ +可以在线性时间内完成,如果我们还保持一个有序的所有节点的双向链表,排序由它们的整数值。构建此双向链接列表需要O n log n 时间,最后O n 更新到堆并从其弹出会花费O n log n 时间,整个运行时间为O (nyy+O(nlogn)O(n)O(nlogn)O(nlogn)


使用专门用于整数的排序和优先级队列,可以对此进行一些改进,但是您不能做得比整数排序更好,如以下减少所示:如果我们有一个整数值列表,将x设置为最小值的两倍,将o设置为最大值的两倍。用的值来创建区域2 X 2 X + 1对于彼此X 。最佳解决方案按照x i排序的顺序遍历每个区域,从而产生对的排序。x1,,xnxo2xi2xi+1xixi值。xi
戴夫

戴夫是正确的,这可以减少到通过仅更新ÿ +ÿ - 。同样,无需将区域中的每个节点连接到该区域中的每个其他节点,它们只需连接到该区域中的1个或2个其他节点(建立路径)即可。因此,每个节点最多只有4个边缘。然后,可以应用Dijkstra的算法(具有最小优先级队列)来授予O n l g n 时间。O(nlgn)y+yO(nlgn)
2011年

@bbejot:但是,如果是这样,Thorup的积分优先级队列是否可以在无向情况下使用一些额外的存储技术来提高运行时间到甚至到O n O(nloglogn)O(n)
张显之2011年

4

我觉得可能是最好的选择。O(n2)

用特殊的起始节点(x)和结束节点(0)将其转换为最短路径问题似乎很自然。每个数字还将有一个其他节点。x和0都具有在迷宫中可到达的所有数字节点的权重为0的边。所有数字节点的权重为0(如果数字可访问迷宫)或数字之间的差(如果不可访问迷宫)。

此图中最短的路径不能在小于的情况下求解,因为该图具有大约n 2个边,并且在最坏的情况下,每个情况必须查看一次。因此,最短路径的Dijkstra'a算法需要O n 2时间,并且是最坏情况下的最优算法。O(n2)n2O(n2)


这是我想到的答案;当然,您必须使用带有Dijkstra算法的适当数据结构来获得运行时间。使用典型的二进制堆将产生O n 2 lg n O(n2)O(n2lgn)
Fixee 2011年

1
我今天早上在考虑这个问题,可以加快一点。而不是为迷宫中的每个数字使用一个节点,而是为迷宫的每个区域使用一个节点。那么,节点之间的成本是从一个区域跳转到下一个区域的最低成本。起始节点是具有x的区域,结束节点是具有0的区域。如果存在区域,则可以使用我们一直在讨论的方法在O r 2时间内解决。rO(r2)
2011年

您还需要时间来创建图形,因此总运行时间应为O r 2 + n log n 。即使只有两个区域,您也需要找到两组数字之间最接近的对,并且在代数计算树模型中,该问题的下限为Ω n log n 。(位技巧可能会减少或消除对数因子。)O(nlogn)O(r2+nlogn)Ω(nlogn)
Jeffε2011年

基于边缘数量的下界不适用,因为边缘不是输入的一部分-这是隐含的。您无需查看所有这些内容,因为您可以计算出相关的内容。Ω(n2)
戴夫
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.