图灵机在描述数据结构和算法时很重要,因为它们提供了一个数学模型,我们可以在其中描述算法是什么。大多数时候,算法是使用高级语言或伪代码来描述的。例如,我可能会描述一种算法来查找数组中的最大值,如下所示:
Set max = -infinity
For each element in the array:
If that element is greater than max:
Set max equal to that element.
从这个描述中很容易看出算法是如何工作的,并且很容易将它翻译成源代码。但是,假设我已经写出了这样的描述:
Guess the index at which the maximum element occurs.
Output the element at that position.
这是一个有效的算法吗?也就是说,我们能不能说“猜指数”,严格定义它的含义?如果我们允许这样做,需要多长时间才能做到这一点?如果我们不允许,为什么不呢?第一个描述和第二个有什么不同?
为了对算法进行严格的数学定义,我们需要有一些关于计算机如何工作以及它能做什么和不能做什么的正式模型。图灵机是正式定义计算的一种常用方法,但也可以使用其他方法(register machines、字符串重写系统、Church 的lambda calculus 等)一旦我们定义了计算的数学模型,我们可以开始讨论什么样的算法描述是有效的——即那些可以使用我们的计算模型来实现的描述。
许多现代算法严重依赖于底层计算模型的属性。例如,cache-oblivious algorithms 假设计算模型有一些未知大小的内存缓冲区和两层内存。一些算法要求底层机器为transdichotomous,这意味着机器字的大小必须至少大到足以容纳任何问题的大小。随机算法需要正式定义随机性以及机器如何使用随机值。非确定性算法需要一种指定非确定性计算的方法。基于电路的算法必须知道哪些电路原语是允许的,哪些是不允许的。量子计算机需要正式定义哪些操作是允许的,哪些是不允许的,以及在给定输出是概率的情况下对算法的定义。分布式算法需要一个正式的跨机器通信定义。
简而言之,在描述算法时明确说明允许和不允许的内容很重要。然而,要成为一名优秀的程序员或对算法有扎实的掌握,你不需要了解图灵机的内里和外在,也不需要知道如何使用它们对特定问题进行编码的具体细节.但是,您应该知道的是计算模型可以做什么和不能做什么,以及每次操作的成本是多少。通过这种方式,您可以推断算法的效率如何,它们使用了多少各种资源(时间、空间、内存、通信、随机性、不确定性等)。不过话虽如此,如果您不了解底层模型,请不要惊慌。
考虑计算的底层模型还有另一个原因 - 讨论其局限性。每个计算模型都有其局限性,在某些情况下,您可以证明某些算法不可能针对某些问题存在,或者任何可以解决某些问题的算法都必须使用一定数量的给定资源。算法设计中最常见的例子是 NP-hardness 的概念。有些问题被推测是极其“难以”解决的,但是这个困难的正式定义依赖于图灵机和非确定性图灵机的知识。在这种情况下,了解模型很有用,因为它可以让您推断某些问题的计算可行性。
希望这会有所帮助!