确定性算法
在计算机科学中,确定性算法是一种算法,鉴于特定的输入,它总是会产生相同的输出,而基础机始终通过相同的状态序列。确定性算法是迄今为止研究最多,最熟悉的算法,也是最实用的算法之一,因为它们可以有效地在真实机器上运行。
正式地,确定性算法计算数学函数。函数对于其域中的任何输入都具有唯一的值,并且该算法是产生该特定值作为输出的过程。
正式定义
确定性算法可以用状态机器来定义:一个状态描述了机器在特定瞬间在时间上所做的事情。国家机器以离散方式从一个州传递到另一个州。在我们输入输入之后,机器处于其初始状态或开始状态。如果机器是确定性的,则意味着从这一点开始,其当前状态决定其下一个状态的状态;它通过一组状态的过程是预定的。请注意,机器可以是确定性的,并且仍然永远不会停止或完成,因此无法提供结果。
确定性的特定抽像机器的示例包括确定性的图灵机和确定性有限自动机。
非确定性算法
多种因素会导致算法以不确定性或非确定性的方式行为:
- 如果使用输入以外的外部状态,例如用户输入,全局变量,硬件计时器值,随机值或存储的磁盘数据。
- 例如,如果它以对定时敏感的方式运行,例如,如果它具有多个处理器,同时将其写入相同的数据。在这种情况下,每个处理器编写数据的确切顺序将影响结果。
- 如果硬件错误导致其状态以出乎意料的方式发生变化。
尽管实际程序很少纯粹是确定性的,但是对于人类以及其他程序来说,更容易就计划的程序进行推理。因此,大多数编程语言,尤其是功能性编程语言都会努力防止上述事件在受控条件下发生。
多核处理器的普遍性导致对并行编程中的确定性和非确定性挑战的兴趣激增。已经提出了许多帮助应对挑战的工具,以应对僵局和比赛状况。
决定论的缺点
在某些情况下,一个计划表现出非确定性行为是有利的。例如,二十一点游戏中使用的卡片改组程序的行为也不应由玩家预测,即使该程序的源代码可见。使用伪数编号生成器通常不足以确保玩家无法预测混乱的结果。一个聪明的赌徒可能会精确地猜测发电机会选择的数字,因此可以提前确定甲板的整个内容,从而使他作弊。例如。可以通过使用密码安全的伪随机数生成器来避免这些问题,但是仍然需要使用不可预测的随机种子来初始化发电机。为此,需要非确定性的来源,例如硬件随机数生成器提供的来源。
请注意,对P = NP问题的负面答案并不意味着具有不确定输出的程序在理论上比具有确定性输出的程序更强大。可以使用基于验证者的定义来定义复杂性类NP(复杂性),而无需提及非确定性。
语言中的确定性类别
汞
如参考文献中所述,水星逻辑功能性编程语言为谓词模式建立了不同的确定性类别。
哈斯克尔
Haskell提供了几种机制:
- 非确定性或失败的概念
- 也许和两种类型都包含成功的概念。
- 班级单元的失败方法可用于信号失败为异常。
- 也许Monad和Maybet Monad Transformer提供了失败的计算(停止计算顺序并返回什么)
- 具有多种解决方案的Neterminism/Non-Det
- 您可以通过将其结果类型包装在Monadplus monad中,从而检索多重结果计算的所有可能结果。 (其方法MZero使结果失败, MPLU收集成功的结果)。
ML家庭和派生语言
- 选项类型包括成功的概念。
爪哇
在Java中,零参考值可能代表一个不成功(室外)结果。