算法导论读书笔记 第一章 算法在计算中的作用

此文的PDF版本下载地址http://download.csdn.net/source/463200

1.算法可以用英语、计算机程序甚至是硬件设计来表达,它是一系列的计算步骤,用来将输入数据转换成输出结果。简单的说,算法是定义良好的计算过程

2.算法有正确的,也有不正确的,如果不正确算法的错误率可以得到控制的话,它们有时也是有用的,但一般我们只关注正确的算法

3.数据结构是存储和组织数据的一种方式,以便对数据进行访问和修改。没有一种数据结构可以适用于所有用途和目的,因此了解数据结构的长处和局限性是相当重要的。

4.衡量算法效率的常用标准是速度

练习

1.1-1:给出一个真实世界的例子,其中包含着下列的某种计算问题:排序,确定多矩阵相乘的最佳顺序,或者找出凸壳。

(1)排序:500名考生参加一次考试,得分按百分制计,要求按分数从高到低进行排名。

(2)确定多矩阵相乘的最佳顺序:某复杂实验模型,其结果来自于 A1*A2*A3...*A17这17个矩阵的积,根据矩阵乘法的结合律确定计算顺序,以达到计算乘法次数最少的目的。

*矩阵乘法的结合律: AX(BXC)=(AXB)XC

(3)找出凸壳:木板上钉了37个钉子,找出这些钉子,以这些钉子中的某几个为顶点组成的凸多边形可以包含所有37个钉子,并使得此条件成立的凸多边形最小。

1.1-2:除了运行速度以外,在真实世界问题背景中,还可以使用哪些效率指标?

占用资源大小,问题的解决程度,答案精度等。

1.1-3:选择你原来见过的某种数据结构,讨论一下其长处和局限性。

栈(LIFO):长处是可以严格按照后进先出顺序,非常适合如保存程序调用的返回地址之类的特殊应用,缺点是无法进行随机读写。

1.1-4:上文中给出的最短路径和旅行商人问题有哪些相似之处?有哪些不同之处。

相似之处:都是寻求最短的路线

不同之处:最短路线问题是从若干条可选线路中选择一条线路使之在两个点之间达到交通路径最短,不需要经过所有的点;旅行商人问题中如果把仓库看做是图中的一个点的话,首先要满足遍历所有的点,然后在所有满足的线路中选择最短的线路,其复杂程度要高于最短路径。

*给定一幅道路交通图,上面标注除了每一对相邻交叉路口之间的距离。我们的目的就是确定一个交叉路口到另一个交叉路口之间的最短路线。即使不允许每一条路线自我交叉,可能的路线数量也会是巨大的。在所有可能的路线中,如何来选出最短的路线?(最短路径问题)

*假设有一个火车运输公司,它有一个中央仓库。每一天,它都要在仓库中将货物装满火车,并让它驶往若干个地方去送货。在一天结束时,这辆火车必须最后回到仓库,以便下一天再装货物。为了降低成本,该公司希望选择一条送火车行驶距离最短的送货顺序。(旅行商人问题)

1.1-5:举出一个现实世界的问题例子,它只能用最佳解决方案来解决。再举出一个例子,在其中“近似”最优解决也足以解决问题。

A.公司需经常往某地大量派人出差,该地有600多家旅馆,其中可以满足公司员工住宿要求的有390家,假设该390家旅馆的住宿费用不全相同,且价格起伏较大。公司为某次出差员工指定旅馆的标准:在出差办公地30分钟车程内,选择价格最低的旅馆,如果价格一样,取车程更近的那家。为了最大化的节省公司运营成本,此例只能用最佳方案来解决,并且总是可以找到最佳方案。

B.在A例子中,假设在出差办公地30分钟车程内,满足公司员工住宿要求的旅馆有很多家,且最高价格与最低价格相差较小,在1%以内,那么可以不管价格,选择离出差办公地较近、地段较好的任意一家旅馆住宿即可,这个近似最优解足以满足公司节省运行成本的目的。

5.计算机可以做的很快,但还不能是无限快。存储器可以做到很便宜,但不会是免费的。因此,计算时间是一种有限的资源,存储空间也是有种有限的资源。这些有限的资源必须被有效的使用,那些时间和空间上有效的算法就有助于做到这一点。

6.算法就像计算机硬件一样,是一种技术。总体的系统性能不仅依赖于选择快速的硬件,还依赖于选择有效的算法。算法是当代计算机中用到的大部分技术的核心。

:一台性能较高的计算机A(每秒执行10亿条指令)和另一台性能较低的计算机B(每秒执行1000万条指令),分别在AB上使用插入排序(Insertion Sort)、合并排序(Merge Sort)算法对100万个数进行排序。假设世界上最能干的程序员采用机器语言,来为计算机编写插入排序算法的代码,所得到的代码需要 条指令来排序n个数(此处, )。另一方面,让一位平均熟练水平的程序员,采用某种低效编译器的高级语言来位计算机B编写合并排序算法的代码,所得到的代码有 条指令(这里 )。为了排序这100万个数,计算机A花费时间:2*(10^6)^2/10^9=2000s

计算机B花费时间:50*10^6*lg(10^6)/10^7=100s

计算机B由于采用了一个运行时间增长的更为缓慢的算法,运行速度大大快于计算机A

练习

1.2-1:给出一个实际应用的例子,它在应用这一层次上要求有算法性的内容。讨论其中所涉及算法的功能。

在一次有210人参加的考试结束后,老师需要对平均分进行计算。假设考试是百分制考试,老师不借助于计算机类的自动工具,而是采取手动计算平均分。

计算方法:看过考分后,大概估计一个值K,然后与210个分数的数据进行比较,如果分数 M>K ,就记录下P1=+|M-K| ,如果 M<K ,就记录下 P2=-|M-K|。在所有的210个比较值记录下后,如果发现P1+P2=0 ,就把对应的P值划去(不作计算)。在做过比较后有相当大的一部分数据已经划去,然后对剩下的数据进行计算。最后的平均分 N=K+ΣP/210.

算法的功能:该算法对于计算机这样的自动化计算工具来说意义不大,但是对于手工计算来说,却是很实用的。在计算的过程中,首先把大数转换成了小数,然后在比较时又直接把一些数据剔除,减少了运算量。最终大大加快了计算效率,并且提高了计算准确度。

1.2-2:假设我们要比较同一台计算机上插入排序和合并排序的实现。对于规模为n位的输入,插入排序要运行 步,而合并排序要运行 步。当n取怎样的值时,插入排序的性能要优于合并排序?

8*n^2<64*n*lg n

2<=n<=43

1.2-3:对于一个运行时间为 的算法,要使其在同一台机器上,比一个运行时间为 的算法运行得更快,n的最小值取多少?

100*n^2<2^n

n>=15

思考题

1-1:算法运行时间的比较

对于下表中的每一个函数 f(n) 和时间t,求出可以在时间t内被求解出来的问题的最大规模n。假设解决该问题的算法解决该问题需要f(n) 微秒。

(这里编辑编辑表格不方便,WORD中的公式又无法上传,这样的格式,将就着看吧)

lg n:2*e6,2^(6e7),2^(3.6e9),2^(8.64e10),2^(2.592e12),2^(9.4608e14),2^(9.4608e16);

n^(1/2):e12,3.6e15,1.296e19,7.46496e21,6.718464e24,8.950673664e29,8.950673664e33;

n:e6,6e7,3.6e9,8.64e10,2.592e12,9.4608e14,9.4608e16;

nlgn:62746,2801417,133378058,2755147513,71870856404,86788101610,6861095675070;

n^2:e3,7746,6e4,293939,1609969,5615692,56156923;

n^3:100,391,1532,4421,13737,31594,146646;

2^n:20,26,32,36,41,45,51

n!:9,11,12,13,15,16,17

*1.这里假设每个月都是30天,每年都是365

*2.除了f(n)=n! ,这里都采用 n计算出来后采用四舍五入处理。

*3. f(n)=n! 的情况采用f(n)<=T 进行计算,然后取 n的max

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值