我至少有两位教授提到过回溯算法会使算法变得非确定性,但并没有过多解释这是为什么。我认为我理解了这是如何发生的,但我很难用语言表达清楚。能否有人简明扼要地解释一下这个原因?
我至少有两位教授提到过回溯算法会使算法变得非确定性,但并没有过多解释这是为什么。我认为我理解了这是如何发生的,但我很难用语言表达清楚。能否有人简明扼要地解释一下这个原因?
回溯(backtracking)并不是使算法变得非确定性的原因。
相反,通常需要回溯来处理一个非确定性算法,因为根据非确定性的定义,您在处理过程中无法知道应该选择哪条路径,而必须尝试多条路径。
我写了一个使用回溯算法的迷宫寻路程序,下面以此为例。
你在迷宫中行走。当你到达一个岔路口时,你会抛硬币来决定要走哪条路。如果你选择了一条死路,就返回到岔路口并选择另一条路。如果你都尝试过了,就返回到上一个岔路口。 这个算法是非确定性的,不是因为回溯,而是因为抛硬币。
现在改变算法:当你到达一个岔路口时,总是先尝试你还没有尝试过的最左边的路线。如果那条路通向死路,就返回到岔路口并再次尝试你还没有尝试过的最左边的路线。 这个算法是确定性的。没有涉及到任何机会,它是可预测的:在同一个迷宫中,你总是会按照相同的路线行走。
如果允许回溯,您将允许程序中的无限循环,这使其变得不确定,因为实际采取的路径可能始终包括一个以上的循环。
非确定性图灵机(NDTMs)可以在单个步骤中采用多个分支。另一方面,DTMs则遵循试错过程。
您可以将DTMs视为常规计算机。相比之下,量子计算机类似于NDTMs,并且可以更轻松地解决非确定性问题(例如,在破解密码学中应用)。因此,回溯对它们来说实际上是一个线性过程。
我喜欢迷宫的比喻。为了简单起见,我们可以将迷宫看作是一棵二叉树,其中只有一条出路。
现在你想尝试深度优先搜索来找到正确的出路。
非确定性计算机会在每个分支点上复制/克隆自己,并并行运行每个进一步的计算。就好像在迷宫中的人会在每个分支点上复制/克隆自己(就像电影《致命魔术》中的情节),并将他自己的一个副本发送到树的左子分支,将他自己的另一个副本发送到树的右子分支。
到达死胡同的计算机/人将会死亡(没有答案终止)。
只有一个计算机将存活下来(以答案终止),那就是走出迷宫的那个。
回溯和非确定性之间的区别如下:
在回溯的情况下,任何时候只有一个计算机处于活动状态,他使用传统的迷宫解决技巧,简单地用粉笔标记他的路径,当他到达死胡同时,他只需回溯到一个分支点,他还没有完全探索其子分支,就像深度优先搜索一样。
相比之下:
非确定性计算机可以在每个分支点克隆自己,并通过在子分支中运行并行搜索来检查出路。
因此,回溯算法在顺序/非并行/确定性计算机上模拟/仿真了非确定性计算机的克隆能力。