我The Design and Analysis of Computer Algorithms的副本今天已经到了。在第一章中,作者介绍了图灵机。我还有另外两本算法教科书Introduction to Algorithms和The Algorithm Design Manual,但它们都没有谈到图灵机,尽管它们在算法和数据结构方面都很有名。
我想了解图灵机和算法/数据结构之间的关系。了解图灵机成为算法专家真的很重要吗?
答案 0 :(得分:7)
图灵机只是分析计算的理论工具,即。我们可以通过创建一个计算它的图灵机来指定一个算法。它们在可计算性研究中非常有用,也就是说,如果有可能计算函数。霍普克罗夫特和乌尔曼在经典book中讨论了图灵机和其他几种形式语言结构。图灵机也在讨论NP完整性时出现,例如在Garey和Johnson的this书中。
书籍和图灵机一般都是理论上的。如果你对学术方面的algorihhms感兴趣,我会推荐它们。但是,如果你想要真实地理解在真实计算机上实现的算法并运行真实数据,那么我会说对图灵机有一个粗略的了解是非常重要的。
答案 1 :(得分:5)
图灵机在描述数据结构和算法时非常重要的原因是它们提供了一个数学模型,我们可以在其中描述算法是什么。大多数情况下,使用高级语言或伪代码来描述算法。例如,我可能会描述一种算法来查找数组中的最大值,如下所示:
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,这意味着机器字的大小必须至少足以容纳任何问题的大小。随机算法需要randomess的正式定义以及机器如何使用随机值。非确定性算法需要一种指定非确定性计算的方法。基于电路的算法必须知道哪些电路原语是不允许的。量子计算机需要正式定义什么操作是不允许的,以及算法的定义是什么,输出是概率性的。分布式算法需要跨机器的正式通信定义。
简而言之,在描述算法时明确说明什么是不允许的是很重要的。但是,要成为一名优秀的程序员或掌握算法,您不需要知道图灵机的内部和外部,也不需要知道如何使用它们编码特定问题的具体细节。但是,您应该知道的是计算模型能够做什么和不能做什么,以及每次操作的成本是多少。通过这种方式,您可以推断出算法的有效性,它们使用的各种资源(时间,空间,内存,通信,randomess,非确定性等)的大小。但是,如果您不了解基础模型,请不要惊慌。
还有另外一个原因要考虑计算的基础模型 - 讨论它的局限性。每种计算模型都有其局限性,在某些情况下,您可以证明某些算法对某些问题不可能存在,或者任何解决某些问题的算法必然必须使用一定数量的给定资源。算法设计中最常见的例子是NP硬度的概念。一些问题被推测为非常“难以”解决,但这种困难的正式定义依赖于图灵机和非确定性图灵机的知识。在这种情况下理解模型很有用,因为它允许您推断某些问题的计算可行性。
希望这有帮助!