算法导论(三版):第一章第二节课后题 以及 第一章思考题

来源:互联网 发布:dreamweaver淘宝首页 编辑:程序博客网 时间:2024/05/28 03:01

第一章第二节课后题 

1.2-1 

Give an example of an application that requires algorithmic content at the applicationlevel, and discuss the function of the algorithms involved.

答:

比如说我研究生期间要完成音乐门户网站的建设,但是为了能够提高用户体验,加入了推荐这个功能,包括用户推荐、歌曲推荐,这些都需要推荐的算法支持,比如协同过滤。这也和机器学习的算法有着很强的关联。

再比如我在实习期间,需要随机筛选出在百度被搜索的词,但是每天在百度搜索的词接近1亿,如何从这1亿从快速、有效的随机筛选出词呢?就是使用蓄水池算法。

此外,这里还有一个不太好的地方就是:applicationlevel,中文译为应用层。书中未能准确定义,经过我的搜索,认为是以下内容(摘自wiki):


A typical vision of a computer architecture as a series of abstraction layers: hardware, firmware, assembler, kernel, operating system and applications


1.2-2


答:

两个函数必定有一个交点,求交点即可。



1.2-3


答:
同上


第一章思考题

1-1 


答:

想不到中文翻译错了,英文本microseconds是微秒,一百万分之一秒,但是中文翻译成了毫秒,下面的计算我也按照毫秒来计算的。

这个题开始我也没太懂,不知道这个题在问什么。参考了这个链接的问答之后,我大概明白一些。计算方式都是类似的,比如,第一列第一行,f(n)=lg(n),时间为1秒,即1000毫秒。也就是说该算法在时间复杂度为f(n)的情况下需要耗时1000毫秒,求n。即lg(n)=1000,求n。
后来想了一下,这个问题最好写一段代码来计算就比较方便了。计算结果如下表:
其中需要说明的是:
  1. lgn、nlgn、n! 三个不能计算的原因分别是:数值太大,python无法计算、无法求解方程式、无法求解方程式。
  2. 但还是可以从下表观察出算法的不同时间复杂度,对输入规模的极大的影响。

 1秒钟1分钟1小时1天1月1年1世纪lgn-------√n100000036000000001.3e+137.5e+156.7e+189.9e+209.9e+24n1000600003600000864000002592000000315360000003155760000000nlgn-------n^231.6244.91897.39295.250911.7177583.81776445.8n^310.039.1153.2442.11373.73159.414667.92^n9.915.921.826.431.234.941.5n!-------
代码如下:
#!/usr/bin/env python# -*- coding: utf8 -*-"""brief:算法导论的第一章的唯一的一道思考题的求解代码。author:zhangyang27@baidu.com"""import sys,random,osimport mathdef main():    second = 1000    minutes = 60 * second    hour = 60 * minutes    day = 24 * hour    month = 30 * day #暂且怎么算吧    year = 365 * day    century = 75 * year + 25 * 366 * day #每个世纪有25个闰年,比平常多一天    date = {second,minutes,hour,day,month,year,centuryr}    for total_microseconds in date:        print "-----------------------"        print total_microseconds        #print math.pow(2,total_microseconds)        print math.pow(total_microseconds,2)        print total_microseconds        #nlgn 怎么算?        print math.sqrt(total_microseconds)        print total_microseconds**(1.0/3)        print math.log(total_microseconds,2)        #n! 怎么算?if __name__ == '__main__' :    main()




0 0