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

第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 n n个数的序列 < a 1 , a 2 , ⋯   , a n > <a_1,a_2,\cdots,a_n> <a1,a2,,an>

输出:输入序列的一个排列 < a 1 ′ , a 2 ′ , ⋯   , a n ′ > <a_1^{'},a_2^{'},\cdots,a_n^{'}> <a1,a2,,an>,满足 a 1 ′ ≤ a 2 ′ ≤ ⋯ ≤ a n ′ a_1^{'} \le a_2^{'} \le \cdots \le a_n^{'} a1a2an

给定输入序列 < 31 、 41 、 59 、 26 、 41 、 58 > <31、41、59、26、41、58> <314159264158>,一个正确的排序算法返回作为输出的序列 < 26 、 31 、 41 、 41 、 58 、 59 > <26、31、41、41、58、59> <263141415859>。这样的输入序列称为排序问题的一个实例(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 n n个项进行排序,大约需要 c 1 n 2 c_1n^2 c1n2,其中 c 1 c_1 c1是不依赖于 n n n的常数。第二个称为归并排序(merge sort),对 n n n个项进行排序,大约需要 c 2 n log ⁡ n c_2n\log n c2nlogn c 2 c_2 c2是另一个不依赖于 n n n的常数。与归并排序相比,插入排序通常具有一个较小的常数因子,即 c 1 < c 2 c_1 \lt c_2 c1<c2。虽然对于小的数据规模来说,插入排序通常比归并排序要快,但是一旦输入规模 n n n足够大,归并排序 log ⁡ n \log n logn相对于 n n n的优点足以弥补常数因子的差别。不管 c 1 c_1 c1 c 2 c_2 c2小多少,总会存在一个交叉点,超出这个点,归并排序更快。

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

2 ⋅ ( 1 0 7 ) 2   i n s t r u c t i o n s 1 0 10   i n s t r u c t i o n s / s e c o n d = 20000   s e c o n d s ( m o r e   t h a n   5.5   h o u r s ) \frac{2\cdot(10^7)^2 \ instructions}{10^{10}\ instructions/second}=20000\ seconds(more\ than\ 5.5\ hours) 1010 instructions/second2(107)2 instructions=20000 seconds(more than 5.5 hours)

而计算机B需要

50 ⋅ ( 1 0 7 ) log ⁡ 1 0 7   i n s t r u c t i o n s 1 0 10   i n s t r u c t i o n s / s e c o n d ≈ 1163   s e c o n d s ( l e s s   t h a n   20   m i n u t e s ) \frac{50\cdot(10^7)\log 10^7 \ instructions}{10^{10}\ instructions/second} \approx 1163\ seconds(less\ than\ 20\ minutes) 1010 instructions/second50(107)log107 instructions1163 seconds(less than 20 minutes)

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
算法导论第1616.2-5题目描述: 证明:在所有的用于求解单源最短路径问题的算法,Bellman-Ford算法是唯一一个能够处理权值可以是负数的图的算法。 证明如下: 首先,给定一个图G和一个源节点s,我们假设该图G存在至少一条从源节点s到另一个节点v的路径,使得该路径上至少有一条边的权值为负数。我们的任务是要找到一条从源节点s到节点v的最短路径。 考虑Bellman-Ford算法的实现过程。该算法通过迭代更新每个节点的松弛值来找到最短路径。在算法的每一次迭代,我们对所有的边进行一次松弛操作。如果图存在一条从源节点s到节点v的最短路径,那么这条路径上的所有边都会被松弛,且最终计算出的节点v的最短路径长度将会是这条最短路径的长度。 现在我们考虑一种情况:假设在算法的第k次迭代,我们已经找到了从源节点s到节点v的长度为k的最短路径。此时考虑该最短路径的最后一条边(u,v),且该边的权值为负数。由于在Bellman-Ford算法,我们是对所有边进行松弛操作的,因此在第k+1次迭代,我们一定会通过这条边(u,v)来进行松弛操作。此时,由于(u,v)的权值为负数,因此算法将会通过这条边来缩短v的距离值,使得v的距离值变成小于k的某个值。这就意味着我们找到了一条从源节点s到v的更短的路径,与假设矛盾。 因此,我们得出结论:在所有的用于求解单源最短路径问题的算法,Bellman-Ford算法是唯一一个能够处理权值可以是负数的图的算法

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值