数据结构与算法习题讲解(全).ppt
《数据结构与算法习题讲解(全).ppt》由会员分享,可在线阅读,更多相关《数据结构与算法习题讲解(全).ppt(97页珍藏版)》请在第壹文秘上搜索。
1、第一章n1.5编写一个递归方法,它返回数n的二进制表示中1的个数。利用这样的事实:如果n是奇数,那么它等于n/2的二进制表示中1的个数加1。nint ones( int n ) if( n 2 ) return n; return n%2 + ones(n/2); #include using namespace std; int j=0; count(int n) int k; k=n/2; j+; while(k=1) if(n%2=0) j-; return count(); main() int i,j; cout“Please input n:”i; if(i0) i=-i; cou
2、nt(i); cout“所输入整数中的二进制中1的个数是:”jendl; return 0;n1.7证明下列公式na. logx0成立n数学归纳法:当0 x1, 命题显然成立:x=1, 公式是成立的;当x1时, logx 是负数。 同理可以很容易推出当1x2时命题成立:x=2, 公式成立;当x2, logx最大为1。假设命题在px2p时成立(p为正整数), 这时考虑有2pY4p (p 1)。则logy=1+log(y/2) 1+y/2y/2+y/2y, 由此可推导出公式成立。二项式法:令x=2x,有log2x2x, 即xx 即2xx, 得logxx;命题得证nb. log(AB)=BlogA证
3、明:令2X=A, 则AB =(2X)B =2XB ; 则logAB =XB, X=logA;命题得证第二章n2.1按增长率排列函数:N, N1/2, N1.5, N2, NlogN, Nlog(logN), Nlog2N, Nlog(N2), 2/N, 2N, 2N/2, 37, N2logN, N3。指出哪些函数以相同的增长率增长。n答:2/N, 37, N1/2, N, Nlog(logN), NlogN, Nlog(N2), Nlog2N, N1.5, N2, N2logN, N3, 2N/2, 2N. 其中,NlogN, Nlog(N2)有相同的增长率。n常见的几种计算时间的关系: O
4、(1)O(logN)O(N)O(NlogN)O(N2)O(N3)O(2N)O(N!)O(NN)n2.7对于下列六个程序片段中的每一个:给出运行时间分析n1) sum=0; 2) sum=0; for(i=0; in; i+) for(i=0; in; i+) sum+; for(j=0; jn; j+) O(N) sum+; O(N2)n3) sum=0; for(i=0; in; i+) for(j=0; jn*n; j+) sum+; O(N3)n4) sum=0; for(i=0; in; i+) for(j=0; ji; j+) sum+; O(N2)n5)sum=0; for(i=0
5、; in; i+) for(j=0; ji*i; j+) for(k=0; kj; k+) sum+; O(N5)nj可等规模于i2, 同样也等规模于N2. k等规模于j, 即N2. 则该程序段的运行时间复杂度分析为 N*N2*N2, 即O(N5). n6) sum=0; for(i=1; in; i+) for(j=1; jii; j+)* if(j%i=0) for(k=0; kj; k+) sum+; O(N4)注:*处的for语句的循环次数为“12+22+32+n2”,n如上题所述if 语句至多要执行N3次, 但是实际上只有O(N2)次 (因为对每一个i,实际上都严格执行了i次), 因
6、此最内的循环只执行了O(N2)次。 而每执行一次, 将花费 O(j2) = O(N2) 的时间, 总数即为O(N4)。n个人理解: if(j%i=0) for(k=0; kj; k+) sum+;这段程序段的循环次数O(N)n2.8 假设需要生成n个自然数的一个随机置换。例如:4, 3, 1, 5, 2和3, 1, 4, 2, 5就是合法的置换,但5, 4, 1, 2, 1则不是,因为数1出现2次而数3却没有。这种程序常常用于模拟一些算法。我们假设存在一个随机数生成器n,它用方法randInt(i,j)以相同的概率生成i和j之间的一个整数。下面是三个算法: (1).如下填入从a0到an-1的数
7、组a:为了填入ai,生成随机数直到它不同于已经生成的一个a0,a1,ai-1时再将其填入; (2).同算法(1),但是要使用一个附加的数组,称之为used数组。当一个随机数ran最初被放入数组a的时候,设置usedran=ture。就是说,当一个随机数填入ai时,可以用一步来测试是否该随机数已经被使用,而不是像第一个算法那样可能用i步来测试; (3).填写该数组,使得ai=i+1,然后for(i=1; in; i+) swap(ai, arandInt(0,i);n试问: a.证明这三个算法都生成合法的置换,并且所以的置换都是等可能的; b.对每个算法都给出你能够得出的尽可能不同的期望运行时间
8、分析; c.没个算法的最坏情形的运行时间是什么?n答:a. 所有的算法都可以生成合法的置换。很明显,前2个算法在测试中可以保证不生成重复的数,并且它们是完全随机的,故它们生成的置换是等可能。第3个算法轮换数组中的元素,这个数组最初是没有重复数的,也不会存在非法置换。n前2个算法很明显成立,第3个算法可以用数学归纳法证明,详细证明如下:n1.当n=1时,a0=1,都是100%,成立;n2.当n=2时,for(i = 1; i n; +i) swap (ai,arandInt(0,i); 第一次循环,当i=1时,即a0=1,ai=a1;n3.当 n=3时,第二次循环时,当i=2时,此时有两种可能,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 算法 习题 讲解