当前位置:
文档之家› 数据结构第1章习题讲评(13通本)
数据结构第1章习题讲评(13通本)
… …
…
4 5
…
…
…
…
典型的错误 (错误2)
当n=6时,执行3次; 当n=7时,执行3次; 当n=3时,执行2次; 当n=3时,执行3次; 当n=8时,执行4次; 当n=9时,执行4次; … 由此推知,当n=n时,T(n)与 n的关系为: 解: 输出语句cout为基本语句, 2T(n)-n ≥n 设T(n)为执行次数。 当n=1时,执行1次; 点评 根据所列出的循环变 当n=2时,执行2次; 量n的变化过程, 无法看出 当n=3时,执行2次; 可以推知不等式 当n=3时,执行3次; 2T(n)-n ≥n 当n=4时,执行3次; 是成立的. 当n=5时,执行3次;
(2)void binary(int n) { while(n) { cout<<n; n=n/2; } }
…
典型的错误 (错误3)
(2)void binary(int n) { while(n) { cout<<n; n=n/2; } }
解: ∵n>0为非零正整数 n 执行次数 1 1 2 2 3 2 4 3 5 3 6 3 7 3
T= (n i 1)
i 1
(n 1)n 解 该算法具有二重循环结 = 2 构,显然输出语句cout也是原 2) ≈ O ( n 操作语句。 当外层第1次循环时 i= 1 答:输出语句的执 n 内层循次数为: 行次数是 (n+1)n/2, 当外层第2次循环时 i= 2 该算法的时间复杂 n-1 内层循次数为: 度为O(n2)。
× n) O(n ) O(log × O(n )
O(210 )
2 3
× n ×
n3
2
O(2n) O(2n+1) O(n)
× ×
2 确定下列算法中输出语句的执行次数,并给出算法的 时间复杂度(n为非零正整数)。 (1) void combi(int n) { int i,j,k=0; for(i=1;i<=n;i++) for(j=i;j<=n;j++) { cout<<j; k++; } }
解: ∵n>0为非零正整数 n 执行次数 1 1 2 2 3 2 4 3 5 3 6 3 7 3
n 8 9
执行次数 4 4
15 16
① ∴T(n)=20 × 1+21 ×2 +22 ×3+…+2n-1 ×n ②2T(n)=21 ×1+22×2+…+ 2n × n ①- ②得 点评 2.①式是怎么得来的? 依据是什么没有任何说明, 由循环的分析过程,根本 无法推出此式。
等级 D+ D DF
分数 69 65 60 不及格
1.以下分别为几种算法关于问题规模的执行时间, 请给出每种算法的时间复杂度。
(1)100n3 (2)6n2-12n+1 (3)1024 (4)n+2log2n (5)n(n+1)(n+1)/6 (6)2n+1+100n
O(n3 )
O(n2 ) O(1 )
典型的错误
点评: (1) void combi(int n) 外循环 1.没有指明算法中哪条 { int i,j,k=0; 语句是原操作语句,就 for(i=1;i<=n;i++) 设其执行次数为T(n),让 for(j=i;j<=n;j++) 人感到莫明其妙; 内循环 { cout<<j; k++; } 2.将互相嵌套的多层循 } 环的内层循环与外层循 环弄颠倒了。无法理解 为何会有如此低级的错 解: ? 设原操作语句执行次数为T(n)。 误? 3.“则有cout的执行次数 由题意得 为n”是错误的结论. 内 ×:初值i=1,终值i=n 反映出分析能力差. × 则有cout的执行次数为n 既然已得出“ cout的执 外 ×:j=i(初值),j=n(终值) 行次数为n”的结论,为何 所以 n 下面还要求T(n)? T(n)= (n i 1) 反映出思维的逻辑性差。 i 1 …
T-1
…
…
(2)void binary(int n) { while(n) { cout<<n; n=n/2; } }
第3次循环结束时n=n/8=n/2 3
由此推知第T-1次结束时
n= n(1/2) 由while循环条件,n>=2 此时必有 n(1/2) T-1 > = 1
T-1
解:循环表量该n的初值为n 点评 4.没正确理解和掌握C语 ,终值为2 言的基本语法规则。 故cout的执行次数为n/2 设原操作语句的执行次数为 T(n) 循环过程如下: 第1次循环结束时 n=n/2 第2次循环结束时 n=n/4 =n/22
(2)void binary(int n) { while(n>=1) while(n) while(n!=0) { cout<<n; n=n/2; } }
第2次循环结束时 2 n(1/2) n/4 = n2= 第3次时循环结束时 n3= n/8=n(1/2)3 …
(2)void binary(int n) { while(n>=1) while(n) while(n!=0) { cout<<n; n=n/2; } }
数据结构第一章
作业讲评
一、存在的主要问题 1、解题过程不够严谨、条理性和逻辑性差, 分析问题的能力仍有待提高;。 2、做了题,但没有明确回答作业规定的求解 问题的答案; 3、个别同学没做完或只抄题就交; 4、个别同学写字太撩草,作业无法批改。
二、作业评定等级的含义 等级 A+ A AB+ B BC+ C C分数 100 95 90 89 85 80 79 75 70
(2) void binary(int n) { while(n) { cout<<n; n=n/2; } }
(1) void combi(int n) { int i,j,k=0; for(i=1;i<=n;i++) for(j=i;j<=n;j++) { cout<<j; k++; } }
当外层第i次循环时 n-i+1 内层循次数为: 因此,输出语句的执 行次数n T为:
由此推知第T-1次结束时 T-1 nT-1= n(1/2) 由while循环条件,此时 解 :输出语句是原操 T-1 作语句,设第i次循环时,循 n(1/2) > = 1 环变量的值为ni T-1 n 即 <= 2 设输出语句共执行了T次。 T<= log2n+1 第1次循环结束时 1 ≈ O (log n ) 2 n(1/2) n/2 = n1=
解:循环表量该n的初值为n ,终值为2 故cout的执行次数为n/2 设原操作语句的执行次数为 T(n) 循环过程如下: 第1次循环结束时 n=n/2 第2次循环结束时 n=n/4 =n/22
第3次循环结束时n=n/8=n/2 3
由此推知第T-1次结束时
n= n(1/2) 由while循环条件,n>=2 此时必有 n(1/2) T-1 > = 1 点评 1.循环变量终值为2 没正确理解和掌握C语言的 基本语法规则。 2.“故cout的执行次数为 n/2”的结论是错误的。 3.原操作语句是哪条语 句 ?,没有指明。
n 8 9
执行次数 4 4
15 16
① ∴T(n)=20 × 1+21 ×2 +22 ×3+…+2n-1 ×n ②2T(n)=21 ×1+22×2+…+ 2n × n ①- ②得 点评 1.T(n)表示什么量? 没有任何说明。
… …
…
4 5
…
…
(2)void binary(int n) { while(n) { cout<<n; n=n/2; } }
答:输出语句的执行次 数小于或等于log2n+1, 该算法的时间复杂度为 O(log2n) 。
…
解 :输出语句是原操 作语句,设第i次循环时,循 环变量的值为ni 设输出语句共执行了T次。 第1次循环结束时 1 n(1/2) n/2 = n1=
典型的错误 (错误Байду номын сангаас)
(2)void binary(int n) { while(n) { cout<<n; n=n/2; } }