随机算法与不确定算法之间的区别和关系?


30

随机算法与不确定算法之间有什么区别和关系?

来自维基百科

随机算法是一种算法,其采用一程度的随机性作为其逻辑的一部分。该算法通常使用统一的随机位作为辅助输入来指导其行为,以期在所有随机位的可能选择的“平均情况”下获得良好的性能。形式上,算法的性能将是由随机位确定的随机变量;因此,运行时间或输出(或两者)都是随机变量。

确定性算法相反,非确定性算法是在不同的运行过程中表现出不同行为的算法。每次运行算法都有几种不同的行为方式。一个并行算法可因竞争条件不同在不同的运行执行。一个概率算法的行为取决于随机数发生器。解决非确定性多项式时间问题的算法可以在多项式时间或指数时间内运行,具体取决于其在执行过程中所做的选择。

随机算法和概率算法是同一概念吗?

如果是,则随机算法只是一种不确定性算法吗?


我认为,造成这种混乱的部分原因是,“非确定性”和“非确定性”听起来应该是同一件事,但它们并非如此:“确定性”意味着“非随机”和“非确定性”。因此,“随机”和“非确定性”都是算法“不确定性”的两种方式,但是“非确定性”具有特定的技术定义,而不仅仅是“确定性”的反义词。
2012年

Answers:


24

非确定性算法与概率算法有很大不同。

概率算法是使用抛硬币并“大部分时间”工作的算法。举例来说,快速排序的随机变量按预期(很有可能)在时间中工作,但是如果您不走运,则可能需要之多。概率算法很实用,例如在生成RSA密钥时(例如,用于测试您的秘密密钥的两个因素是素数)由计算机使用。不使用掷硬币的概率算法有时称为“确定性”。Θ n 2Θñ日志ñΘñ2

非确定性算法是“需要提示”但总是正确的算法:它们不能被错误的提示所欺骗。作为一个例子,这里是一个非确定性的算法因素的整数:猜的分解,并确认所有的因素都是素(有做一个“快速的理论”确定性算法)。该算法非常快,并且拒绝错误提示。大多数人认为随机算法无法快速分解整数。显然,这种计算模型是不现实的。ñññ

我们为什么要关心非确定性算法?存在一类称为NP的问题,它由具有有效非确定性算法的决策问题组成。大多数人认为,该类别中最困难的问题(即所谓的NP完全问题)没有有效的确定性(甚至随机化)算法;这就是P与NP问题。由于许多自然问题都是NP完全的,因此很有趣的是,在最坏的情况下(实际上,通常在实践中出现的情况实际上在合理的时间内可以解决)是否知道实际上它们是否不能有效解决。


谢谢!(1)我记得NP问题是可以通过多项式时间内的非确定性Turing机器上的算法解决的问题。那么,“非确定性图灵机上的算法”和“确定性图灵机上的非确定性算法”在某种意义上是否等效?(2)您认为概率算法和随机算法是同一概念吗?(3)您是否也认为维基百科说并发算法和概率算法是两种不确定性算法是错误的?
蒂姆(Tim)

1
我认为不确定性的证书形式不能用来澄清随机化的区别。
拉斐尔

(1)是的,两者相同。(2)这是同一概念的两个名称。(3)Wikipedia给出了其他类型算法的一些示例,尽管演示可能会误导他人。并行和概率算法不是不确定的。
Yuval Filmus,2012年

4
@ShelbyMooreIII在递归理论和理论计算机科学中,不确定性具有非常特殊的技术含义。
Yuval Filmus,2015年

1
Yuval,请标记您认为不具有建设性或过时的评论;然后我们将其删除。
拉斐尔

15

算法指定了一种方法,从给定输入到与输入具有特定关系的所需输出。我们说这种算法是确定性的,如果在任何时候都准确,明确地指定了该算法的下一步必须作为该方法的一部分执行,则可能取决于到目前为止的输入或部分数据,但是始终唯一标识。

非确定性意味着算法的某些部分被遗漏甚至未指定。例如,“ int i = 0到n之间的偶数”未指定。这意味着此时没有指定唯一行为。

为了使这种区分有用,您需要(确定性)算法的(通常)“正确性”概念,即非正式的说法是“该算法始终计算我想要的结果”。然后,考虑到不确定性算法的正确性意味着什么,变得很有趣,该算法必须考虑到未指定指令中可能的选择。

有两种方法可以确定非确定性的正确性。第一个很简单,也没有那么有趣,对于它而言,正确性意味着“对于允许我做出的所有选择序列,该算法始终会计算出我想要它计算的内容”。如果某些伪代码的作者懒得选择一个数字并说“选择0到n之间的任何偶数”,而当“选择0”使算法具有确定性时,有时会发生这种情况。本质上,通过将某些选择结果替换所有不确定性,可以使算法具有确定性。

这也是您第二段中提到的“不确定性”。这也是并行算法中的不确定性:在这些算法中,您不确定确切的执行是什么样子,但是您知道无论发生什么确切情况,它总能奏效(否则并行算法将是不正确的)。

对于不确定性算法的正确性,有趣的定义是“对于允许我进行的某些选择序列,该算法始终会计算我要计算的内容”。这意味着可能存在错误的选择,从某种意义上来说,这些选择会使算法产生错误的答案,甚至陷入无限循环。在示例“选择介于0和n之间的任何偶数”的示例中,也许4和16是正确的选择,但所有其他数字都是错误的,并且这些数字可能会根据输入,部分结果和到目前为止所做的选择而有所不同。

当用于计算机科学时,不确定性通常仅限于不确定性地选择0或1。但是,如果您不确定性地选择许多这样的位,则可以生成长的不确定性数或其他对象,以及做出不确定性的选择,因此这很难(如果有的话)限制了它的适用性-如果适用性受到限制,则不确定性起初太强大了。

非确定性是一种与基于证书的确定性算法(即检查给定实例的属性以及该属性的证书的算法)一样强大的工具。您可以简单地不确定地猜测一个方向的证书,并且可以给出包含针对另一方向的程序的0和1的不确定性猜测的所有“正确”答案的证书。

如果我们将运行时间投入其中,那么事情将变得更加有趣。在所有(正确的)选择中,不确定性算法的运行时间通常被认为是最短的。但是,其他选择可能会导致运行时间显着变差(可能比最小运行时间渐近变差,甚至任意变差),甚至无限循环。这就是为什么我们花最少的钱的原因:我们不在乎这些奇怪的情况。

现在我们来讨论随机算法。随机算法类似于非确定性算法,但不是在某些点“允许”在0到1之间进行选择,而是由必须做出选择时的随机抛硬币来确定该选择(每次运行可能有所不同) ,或者稍后在执行算法期间必须再次做出相同选择时)。这意味着结果是0或1的概率相等。正确性现在变成“算法几乎总是计算我想要计算的内容”或“算法总是计算我想要计算的内容”(只是确定性版本)。在第二种情况下,算法需要计算其答案的时间通常是“几乎总是快”,与确定性“总是快”相反。

PžPPñP


1
Ø|s|s

14

简而言之:非确定性意味着对如何继续进行计算具有多个同样有效的选择。随机化是指使用(随机)位的外部源指导计算。


为了理解不确定性,建议您使用有限自动机(FA)。对于确定性 FA(DFA),过渡函数是一个函数。给定当前状态和下一个输入符号,就可以唯一定义下一个状态。

一种b一种C

NFA
[ 来源 ]

一种一种b一种C一种

这里的关键点是,对于NFA ,接受定义为“如果接受运行,则接受”。即使没有实际的猜测,该存在标准也可以解释为“总是猜测正确”。

请注意,这里没有任何地方的概率。如果要将不确定性转换为编程语言,则在给定相同状态的情况下,可能会导致跳转到其他不同语句的语句。这样的事情不存在,除了可能在设计上使您头脑混乱的深奥编程语言中。


随机化是完全不同的。如果我们将其分解,则自动机/程序没有多种选择可以继续执行。绘制随机位后,将唯一定义下一条语句:

if ( rand() > 5 )
  do_stuff();
else
  do_other_stuff();

关于有限自动机,请考虑以下事项:

PFA
[ 来源 ]

{一种bC}1个0

Σ×ΠΠ


最后一点:我们可以看到不确定性是一个纯粹的理论概念,无法实现!那么为什么要使用它呢?

  1. 它通常允许使用较小的表示形式。您可能知道,对于NFA,最小的DFA呈指数地增加了¹。使用较小的只是简化自动机设计和技术证明的问题。

  2. 如果目标模型中允许不确定性,则模型之间的转换通常更直接。例如,考虑将正则表达式转换为DFA:通常(简单)的方法是将其转换为NFA并确定该表达式。我不知道直接的构造。

  3. 这可能是一个学术问题,但有趣的是,不确定性可以增加设备的功能。有限自动机和Turing机器不是这种情况,可以说是最受欢迎的机器模型设备,但是例如,确定性下推自动机,Büchi自动机和自上而下的树型自动机可以接受的语言要比非确定性同胞少得多。


  1. 有关示例,请参阅cstheory.SE上的此问题
  2. 分别参见此处此处此处(命题1.6.2)

因此,由于在编程中,我们不能在相同条件下制作多个“ if else”,这就是为什么有时将概率/权重并入条件的原因吗?
凯特

@kate我不知道那是什么意思。编程语言-哎呀,计算机!-本质上是确定性的。我们可以使用PRNG和随机输入(无论什么意思)来创建随机错觉。
拉斐尔

14

您应该意识到,不确定性在这里有两种不同的定义。

  1. 正如维基百科所定义的那样,几乎是“非确定性”,即,在相同输入上并非总是具有相同行为的任何算法。随机算法是“不确定性”算法的特例,因为它们符合我刚刚给出的定义。

  2. 计算的非确定性模型(如非确定性的图灵机)是计算的理论模型。它们可能具有多个可能的执行路径,并且如果其中任何一条路径接受,它们就会“接受”。您应该注意它们不是真实的。尽管可以使用随机的或确定性的算法来模拟它,但从物理上讲,没有办法运行不确定性的算法。

在CS中,不确定性通常表示(2),因此您给Wikipedia的定义(即(1))具有误导性。到目前为止给出的大多数答案都解释了(2),而不是(1)。


根据1),随机Quicksort是一种确定性算法;我不确定这是否有用。我猜想1)可以描述为“黑匣子”视图,而2)实际上是检查手头的算法/机器。可以说,CS大约是2)。我将观点1)分配给(模块化)软件工程。
拉斐尔

@Raphael,要点,我应该修正(1)说“在相同的输入上具有相同的行为”。同意将(2)胜过(1)。
usul 2014年

“行为”是模棱两可的,完全是黑盒子还是白盒子。:)
拉斐尔

当然可以,但是,我想我认为重要区别在于形式化,精确定义的不确定性图灵机(2)和模糊/模糊的“不确定性”(1),后者可能包括随机性(而NTM则没有)。所以,这就是我想说的话....
美国UL

运行非确定性算法没有什么“虚幻”的内容,它只意味着在运行时,需要做出选择,但结果不能由算法确定。1和2之间的唯一区别是,在1中您没有说过算法被认为是“成功”的,而在2中,算法必须是这样的,即始终在末尾说“是”或“否”一个运行并且您有一个决策问题,并且当且仅当它的任何一个可能的运行都回答“是”时,才将算法对该问题的答案定义为“是”。因此,2是1只是一个特例
reinierpost

1

由于我正在做一些相关的研究而重新审视这个问题,我和其他一些回答者之间的分歧可以被同化为一种我们都正确的整体理解。但是IMO所采用的计算机科学术语“有界的不确定性”是一种错误的矛盾(这是我之前的观点)。

他们的重点是区分有界和无界不确定性。[1]

非确定性图灵机(又名“国家技术手段”)具有有界,每个状态转变具有非确定性有限数量的可能性,即程序(又名“配置”)的数量是有限的。磁带保持无界,因此终止证明仍不确定。但是,对于任何暂停的给定输入,输出都是确定性的且受时间限制-即,对于任何输入,结果都是确定性的或不会终止。此外,NTM并行执行所有可能的配置,因此它们的执行速度比确定性图灵机(又名“ DTM”)上的NTM仿真要快。[2]

在NTM中,输入和结果之间实际上并没有任何不确定性的关系,因为对于任何输入或初始状态,结果始终是相同的,这很明显,因为它们可以由DTM进行模拟而没有任何附加的随机性。[2] 不确定不是确定性的对立面,因为不停止也是确定性的结果。对于给定的输入,确定性机器始终具有相同的结果,即使该结果不会停止。NTM的局部不确定性在执行算法的每个状态转换中。在提供输出状态之前,无法确定树的哪个路径可能终止。但是,不可确定性并非不确定性。因此,“有界不确定性”一词旨在描述状态机内的局部不确定性,而不是描述输入与结果的关系,因此,“有界”的概念。我仍然认为“边界不确定性”一词是矛盾的,可以更准确地描述为“并行状态转换”图灵机。

而对于任何给定的输入状态或初始状态,无限的不确定性(又称“不确定性”)具有无限数量的可能状态。无限制的不确定性不仅涉及程序的可能配置数量,而且还涉及一些不受限制的外部状态,该状态不是输入或初始状态的一部分,例如无限制的延迟。因此,对于相同的输入或初始条件,结果在重复执行时可能会有所不同;因此,投入与结果之间不是确定性关系。[3]

随机概率算法采用一些不确定性,即随机选择可能受配置数量限制的可能配置,但它们并没有像NTM那样执行所有可能的配置。因此,除非随机性是确定性的(例如PRNG),并且随机性的熵的初始状态被视为输入的一部分,否则它们不是确定性的。

[1] https://en.wikipedia.org/w/index.php?title=Unbounded_nondeterminism&oldid=710628370#Nondeterministic_automata

[2] https://en.wikipedia.org/w/index.php?title=Non-deterministic_Turing_machine&oldid=754212081#Equivalence_with_DTMs

[3] 翰威特,迈耶和席珀斯基:演员模型(您想知道的一切...)。跳至17:44分钟标记。


1
我不知道这如何回答问题。
adrianN '16

1
@adrianN答案列出了不确定性到底是什么的解释。然后说明随机算法如何关联。问题要求将两者联系起来。答对了。问题已回答。
谢尔比·摩尔三世

0

除了解释差异的所有答案之外,我还有一个示例,可以帮助您理解他们想要说的话。
考虑一个抛硬币,你要么得到一个^ h牛逼。如果抛硬币是随机的,它极有可能出的1000次掷硬币,500将是^ h,这是不太可能的是999出他们的将是^ h。但是,如果掷硬币是不确定的,我们不能说获得999 H的可能性就很小。


我认为您的文章只是一种评论,除了尝试解决随机算法与非确定性算法的主要问题外,还使我们回到了另一种不确定性问题上。
邪恶的

-6

随机(多项式时间,布尔结果)算法属于RP计算复杂度类,它是NP的子集,其中存在非确定性(多项式时间,布尔结果)算法,而P的超集存在于确定性(多项式时间,布尔结果)中算法驻留。

子集的复杂性一组问题减少到另一组。因此,RP⊆NP确实排除了随机算法的可能性,该算法也是不确定性的,因为从定义上说,超集包含子集。子集意味着每个RP算法(或任何RP完整算法)都可以简化为某些NP算法(或任何NP完整算法)。P是RP的子集,因为P中的每个问题都可以简化为RP中的问题,其中不受控制的熵为0。

切线地,这类似于如何通过模拟并行计算简化为P中的串行问题而将NC中的每个问题(并行计算)简化为P中的问题,但尚未证明相反的说法是正确的,即证明P中的每个问题都可以归结为NC中的问题,也不被证明不是真的,即无法证明P完全问题不能归结为NC中的问题。可能存在本质上是串行的问题,无法并行计算,但是要证明证明P≠NC似乎是不切实际的(由于切线问题,无法在此答案中进行讨论)。

更一般地(即,不限于布尔结果类型),随机算法与确定性算法的区别在于某些熵是从外部获取的。因为熵是有界的,所以随机算法与非确定性算法区别的,因此可以证明随机(而不是非确定性)算法总是会终止。

非确定性算法的不可预测性是由于无法枚举输入熵的所有可能排列(导致终止的不可预测性)所致。随机算法的不可预测性是由于无法控制所有的输入熵(尽管不确定的速度可以预测,但会导致不确定结果的不可预测性)。这些都不是关于问题的正确答案的不可预测性的陈述,而是不可预测性分别在终止和不确定结果的副渠道中体现。似乎许多读者将一个区域的不可预测性与正确结果的不可预测性相混淆,这是我从未写过的混淆(请参阅编辑历史记录)。

关键是要理解,非确定性总是(无论在任何科学上还是该术语的使用上)都是无法枚举普遍(即无界)熵的。而随机化是指访问可能无限制或无限制的另一种熵源(在程序中,除了但不受输入变量控制的熵)。

我在当前最流行的答案下面的另一个线程中添加了以下评论,该问题提出了类似的问题。

所有科学都使用统一的无确定性定义,统一定义为无穷大的熵。所有科学中无法预测的结果是由于无法接受算法(或系统)的所有可能输出的先验结果,因为它接受无界状态,即NP复杂度类。在其他科学中,指定一个特定的输入以观察它是否停止并注意结果是等幂的,这在其他科学中等同于在重复相同的状态变化时使其余的宇宙熵保持恒定。计算允许这种熵隔离,而自然科学则不允许。

添加一些最佳评论,以澄清我对随机和不确定性之间唯一显着区别的观点。

一旦你们都不再试图通过从操作的角度而不是从显着的熵的角度来描述它,就可以很清楚地看出这种区别。

@reinierpost每个人都在混淆随机性和不确定性之间的区别。这会使您的评论变得混乱。该算法响应输入(变量)熵及其源代码(不变)内部熵的相互作用。非确定性是无限熵。不变熵甚至可以在内部不受限制,例如扩展π的位数。随机化是某些熵未按定义与输入耦合(即可能来自系统调用/dev/random或模拟随机性,例如NFA或PRNG)。

非确定性有限自动机(NFA)的@Raphael正式定义是有限输入熵(数据:5元组)。因此,每个NFA都可以在确定性图灵机上运行,​​即不需要不确定性的图灵完整机。因此,NFA并非属于不确定性问题。NFA中的“非确定性”概念是,它的确定性(由于每个NFA都可以转换为DFA而已明确存在)没有明确扩展-与计算的非确定性不同

@Raphael在NFA中声称的“非确定性”确实是随机性,这是我对随机性和非确定性之间的区别的定义。我的定义是,随机性是程序或函数输入的某些不受控制,知识(或者在NFA的情况下不是期望的非显式扩展)的熵的地方。而真正的不确定性是在任何情况下都无法知道熵,因为它是无限的。这正是随机与不确定性区别开来的原因。因此,NFA应该是前者的一个例子,而不是您所声称的后者。

正如我已经解释过的,@ Raphael是NFA中的非确定性概念,将不确定性与有限熵结合在一起。因此,非确定性是不将确定性扩展为压缩或便利形式的局部概念,因此我们并不是说NFA是非确定性的,而是它们对于不愿计算确定性扩展的预言家而言具有随机性。但这全是海市rage楼,因为它要求确定性地扩展,因为熵不是无限的,即有限的。

字典是工具。学习使用它们。

随机形容词

统计。选择过程的特征或特征,其中一组的每个项目被选择的可能性相等。

是集合或集合的一个元素或与之有关,每个元素具有相同的出现概率

因此,随机化仅要求某些输入熵是等概率的,因此与我的定义一致,即某些输入熵不受函数调用者的控制。请注意,随机化不需要输入熵到终止就无法确定。

在计算机科学中,确定性算法是一种算法,在给定特定输入的情况下,它将始终产生相同的输出,而底层计算机始终通过相同的状态序列。

形式上,确定性算法会计算数学函数;函数在其域中的任何输入都具有唯一的值,而算法是将这个特定值作为输出产生的过程。

可以根据状态机来定义确定性算法:状态描述了机器在特定时间瞬间所做的事情。状态机以离散方式从一种状态传递到另一种状态。输入输入后,机器就处于初始状态或启动状态。如果机器是确定性的,则意味着从这一点开始,其当前状态将确定其下一个状态。它通过状态集的过程是预先确定的。请注意,机器可以是确定性的,并且永远不会停止或完成,因此无法提供结果。

因此,这告诉我们确定性算法必须完全由函数的输入状态决定,即,我们必须能够证明函数将终止(或不终止),并且不能确定。尽管Wikipedia进行了描述不确定性的混乱尝试,但Wikipedia上面定义的唯一与确定性相对的是算法,其输入状态(熵)定义不明确。输入状态无法定义的唯一方法是无状态输入(因此无法确定性地进行预先分析)。这正是非确定性Turing机器(以及许多用通用Turing完整语言(例如C,Java,Javascript,ML等)编写的现实世界程序)与确定性TM和编程语言(例如HTML,电子表格公式, Coq,Epigram,

在计算复杂性理论中,不确定性算法是一种在每个可能的步骤上都可以允许多个连续性的算法(想象一个人沿着森林中的一条小径行走,每走一步,他就必须选择自己希望的那条叉子采取)。这些算法无法为每种可能的计算路径提供解决方案。但是,可以保证为某个路径找到正确的解决方案(即,穿过森林的人只有选择“正确”路径的某种组合才可能找到自己的小屋)。这些选择可以解释为搜索过程中的猜测。

维基百科和其他人试图将随机性与不确定性混为一谈,但是如果您不想雄辩地区分这两个概念,那有什么意义呢?

显然,确定性与确定能力有关。显然,随机化是关于使某些熵相等。

在算法状态下包含随机熵并不一定会使它不确定。例如,PRNG可以具有所需的等概率统计分布,但也可以完全确定。

智商低下的人将正交概念混为一谈。我期望比这个社区更好!


4
这不是不确定性在计算机科学中的含义。非确定性算法并非“不可预测的”。
David Richerby

4
我的回答与自动机响应中非确定性的定义无关。可计算性理论。谢尔比,你应该停止四处乱窜,并获得一本教科书。如果您不理解其他答案,我认为我们无法在评论中为您提供帮助。
拉斐尔

3
@ShelbyMooreIII您完全误解了不确定性在计算机科学中的含义。它与熵无关。这并不意味着您认为它意味着什么:这就是为什么您认为所有其他答案都是错误的原因。也许这个名字选错了,但这不是重点。它在计算机科学中具有特殊的含义,这与其他科学中的含义不同。您正在尝试使用错误的定义,这就是为什么一切对您而言似乎都是错误的。
大卫·里希比

4
“在谈论计算复杂性理论时使用术语不确定性显然是关于熵的。”不,不是。
拉斐尔

3
我们可以达成共识:请停止尝试“教”我们,这对任何人都没有帮助。
拉斐尔
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.