数据结构题集(C语言版)答案 - 严蔚敏编著 下载本文

(2)通过函数的参数传递进行输入输出 便于实现信息的隐蔽 减少出错的可能

(3)通过全局变量的隐式传递进行输入输出最为方便 只需修改变量的值即可

但过多的全局变量使程序的维护较为困难

1.8 设n为正整数

试确定下列各程序段中前置以记号@的语句的频度: (1) i=1; k=0;

while(i<=n-1){ @ k += 10*i; i++; }

(2) i=1; k=0; do {

@ k += 10*i; i++;

} while(i<=n-1); (3) i=1; k=0;

while (i<=n-1) { i++;

@ k += 10*i; } (4) k=0;

for(i=1; i<=n; i++) { for(j=i; j<=n; j++) @ k++; }

(5) for(i=1; i<=n; i++) { for(j=1; j<=i; j++) { for(k=1; k<=j; k++) @ x += delta; }

(6) i=1; j=0;

while(i+j<=n) { @ if(i>j) j++; else i++; }

(7) x=n; y=0; // n是不小于1的常数 while(x>=(y+1)*(y+1)) { @ y++;

}

(8) x=91; y=100; while(y>0) {

@ if(x>100) { x -= 10; y--; } else x++; }

解:(1) n-1 (2) n-1 (3) n-1

(4) n+(n-1)+(n-2)+...+1=

(5) 1+(1+2)+(1+2+3)+...+(1+2+3+...+n)= = = (6) n

(7) 向下取整 (8) 1100

1.9 假设n为2的乘幂 并且n>2

试求下列算法的时间复杂度及变量count的值(以n的函数形式表示)

int Time(int n) {

count = 0; x=2; while(x

x *= 2; count++; } return count; } 解: count=

1.11 已知有实现同一功能的两个算法 其时间复杂度分别为和

假设现实计算机可连续运算的时间为秒(100多天)

又每秒可执行基本操作(根据这些操作来估算算法时间复杂度)次 试问在此条件下

这两个算法可解问题的规模(即n值的范围)各为多少?哪个算法更适宜?请说明理由

解: n=40 n=16

则对于同样的循环次数n 在这个规模下

第二种算法所花费的代价要大得多 故在这个规模下 第一种算法更适宜

1.12 设有以下三个函数:

请判断以下断言正确与否: (1) f(n)是O(g(n)) (2) h(n)是O(f(n)) (3) g(n)是O(h(n)) (4) h(n)是O(n3.5) (5) h(n)是O(nlogn)

解:(1)对 (2)错 (3)错 (4)对 (5)错 1.13 试设定若干n值 比较两函数和的增长趋势 并确定n在什么范围内 函数的值大于的值

解:的增长趋势快 但在n较小的时候 的值较大

当n>438时

1.14 判断下列各对函数和 当时

哪个函数增长更快? (1)

(2)

(3)

(4)

解:(1)g(n)快 (2)g(n)快 (3)f(n)快 (4) f(n)快 1.15 试用数学归纳法证明: (1) (2) (3) (4) 1.16 试写一算法

自大至小依次输出顺序读入的三个整数X Y和Z的值 解:

int max3(int x

int y int z) {

if(x>y)

if(x>z) return x; else return z; else

if(y>z) return y; else return z; }

1.17 已知k阶斐波那契序列的定义为 ... ;

试编写求k阶斐波那契序列的第m项值的函数算法 k和m均以值调用的形式在函数参数表中出现

解:k>0为阶数 n为数列的第n项 int Fibonacci(int k int n) {

if(k<1) exit(OVERFLOW); int *p x;

p=new int[k+1];

if(!p) exit(OVERFLOW); int i j;

for(i=0;i

if(i

for(i=k+1;i

for(j=0;j

return p[k]; }