在非确定性图灵机中,每个分支都会同时执行两种可能性,并且只有在完成后你才会“选择”哪一个是需要用于解决方案的(如果存在解决方案)。
例如,让我们看看“子集和问题”,其中 S = {a,b,c... }
。非确定性图灵机有一个线性解决方案:
for each element:
"guess" if it is in the subset
check if the subset has the specified sum
生成的树将类似于以下内容:
start
with a without a
/ \ / \
/ \ / \
/ \ / \
with b without b with b without b
/ \ / \ / \ / \
with c without c with c without c with c without c with c without c
只需要树中的一次计算是正确的,算法就会返回"true"。只有没有这样的计算时,它才会返回"false"。
非确定性图灵机的概念纯粹是理论上的——并不存在非确定性图灵机。
Bonus:
请注意,所有可以通过非确定性图灵机实现的操作——也可以通过确定性图灵机实现(反之亦然)——例如,停机问题 在两者中均无法决定。然而,在非确定性图灵机上,NPC问题可以在多项式时间内解决,我们不知道(并且我们认为不能)如何在确定性图灵机上以多项式时间解决。