算法导论-第1章-算法在计算中的作用

发布时间 2023-04-01 13:42:49作者: gengduc

第1章 算法在计算中的作用

1.1 算法(Algorithms)

非形式地说,算法(algorithm)是任何明确定义的计算过程,该过程取某个值或值的集合作为输入并产生某个值或某个值的集合作为输出。因此算法就是将输入转换为输出的一系列计算步骤。

Informally, an algorithm is any well-defined computational procedure that takes some value, or set of values, as input and produces some value, or set of values, as output in a finite amount of time. An algorithm is thus a sequence of computational steps that transform the input into the output.

我们也可以把算法看成是用于求解明确说明的计算问题的工具。问题的声明一般指定了问题实例所期望的输入/输出关系。算法则描述了一个特定的计算过程来实现输入/输出关系。

You can also view an algorithm as a tool for solving a well-specified computational problem. The statement of the problem specifies in general terms the desired input/output relationship for problem instances, typically of arbitrarily large size. The algorithm describes a specific computational procedure for achieving that input/output relationship for all problem instances.

例如,假设您需要将一个数字序列排序为单调递增的顺序。

输入:\(n\)个数的序列\(<a_1,a_2,\cdots,a_n>\)

输出:输入序列的一个排列\(<a_1^{'},a_2^{'},\cdots,a_n^{'}>\),满足\(a_1^{'} \le a_2^{'} \le \cdots \le a_n^{'}\)

给定输入序列\(<31、41、59、26、41、58>\),一个正确的排序算法返回作为输出的序列\(<26、31、41、41、58、59>\)。这样的输入序列称为排序问题的一个实例(instance)

算法能解决哪些问题?(What kinds of problems are solved by algorithms?)

  • 人类基因组计划:存储人类DNA信息在数据库中。采用算法对DNA序列进行分析,比如采用第14章的动态规划算法。
  • 互联网:计算机网络的路由算法,采用第22章单源最短路径算法。搜索引擎采用第11章的哈希表和第31章字符串匹配等技术。
  • 电子商务:保证信息的安全性,采用第31章加密与数字签名等技术。
  • 制造业和其它商务企业:需要分配资源,采用第29章线性规划技术。
  • 地图寻路:找出起点到终点的最短路径,采用第22章单源最短路径算法。
  • 机械设计零部件的拓扑排序:需要应用第20章图的基础算法。

数据结构(Data structures)

数据结构是一种存储和组织数据的方式,旨在访问和修改。

A data structure is a way to store and organize data in order to facilitate access and modifications

技术(Technique)

本书可以当做工具书来使用,本书也会教你如何设计和分析算法。

难题(Hard problems)

旅行商问题(英语:Travelling salesman problem, TSP),问题内容为“给定一系列城市和每对城市之间的距离,求解访问每一座城市一次并回到起始城市的最短回路。”

1.2 算法作为一种技术(Algorithms as a technology)

计算时间和存储空间都是有限资源,所以应该选择能够有效利用时间和空间的算法。

效率(Efficiency)

举例来说,第2章将要介绍的两个排序算法。第一个称为插入排序(insertion sort),对\(n\)个项进行排序,大约需要\(c_1n^2\),其中\(c_1\)是不依赖于\(n\)的常数。第二个称为归并排序(merge sort),对\(n\)个项进行排序,大约需要\(c_2n\log n\)\(c_2\)是另一个不依赖于\(n\)的常数。与归并排序相比,插入排序通常具有一个较小的常数因子,即\(c_1 \lt c_2\)。虽然对于小的数据规模来说,插入排序通常比归并排序要快,但是一旦输入规模\(n\)足够大,归并排序\(\log n\)相对于\(n\)的优点足以弥补常数因子的差别。不管\(c_1\)\(c_2\)小多少,总会存在一个交叉点,超出这个点,归并排序更快。

举一个具体的例子,让我们将运行插入排序的速度更快的计算机(计算机A)与运行合并排序的速度较慢的计算机(计算机B)进行比较。他们每个人都必须对1000万个数字进行排序。假设计算机A每秒执行100亿条指令,计算机B每秒执行1000万条指令,所以计算机A就纯计算能力来说是计算机B的1000倍。为了使差异更加显著,假设世界上最“聪明”的程序员用计算机A的机器语言进行插入排序,并且得到的代码需要\(2n^2\)条指令来对\(n\)个数字进行排序。进一步假设,只有一个普通的程序员实现了合并排序,使用一种具有低效编译器的高级语言,得到的代码需要\(50n\log n\)条指令。为了分类1000万个数字,计算机A需要

\[\frac{2\cdot(10^7)^2 \ instructions}{10^{10}\ instructions/second}=20000\ seconds(more\ than\ 5.5\ hours) \]

而计算机B需要

\[\frac{50\cdot(10^7)\log 10^7 \ instructions}{10^{10}\ instructions/second} \approx 1163\ seconds(less\ than\ 20\ minutes) \]

通过使用一种运行时间增长较慢的算法,即使编译器较差,计算机B的运行速度也比计算机A快17倍以上!当排序1亿个数字时,归并排序的优势更加明显:插入排序需要超过23天,而归并排序需要不到4个小时。一般来说,随着问题规模的增加,归并排序的相对优势也会增加。