当前位置:文档之家› 数据结构习题课1

数据结构习题课1

IF i j 1 THEN
(IF A[i] A[j] THEN(fmax A[j]. fmin A[i]).
ELSE (fmax A[i]. fmin A[j]). RETURN). BS2. [取中值] mid (ij)/2 BS3. [递归调用]
BS (A, i, mid. gmax, gmin). BS (A, mid1, j. hmax,
IF (n≤1) THEN (flag←false. RETURN.) S2[初始化]
i←2. flag←true. S3[求余判断]
WHILE (i ≤ n div 2 ) DO (IF (n MOD i)=0 THEN (flag←false. RETURN.) i←i+1.) ▌
参考答案3
算法 S (n. flag) /*判断整数n是否为素数,将结果保存到变量flag*/ S1[n≤1?]
for(int k=1;k<=n;k++) for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) ;
int t=1; while(t<n) t*=2;
int t=2; while(t<n) t*=t;
作业1-5
题目描述
试用ADL语言编写一个算法,判断任一整数 n 是否为素数
for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) t=a[i][j],a[i][j]=a[j][i],a[j][i]=t;
for(int i=1;i<=n;i++) for(int j=i+1;j<=n;j++) a[j][i]=[i][j];
for(int i=1;i<=n;i++) for(int j=i+i;j<=n;j+=i) flag[j]=false;
…(3)
由(1)(2)(3), T(k+1)=T( (k+1)/2 )+T( (k+1)/2 )+2,
≤ [5* (k+1)/2 /3-2]+[5* (k+1) / 2/ 3-2]+2
= 5*((k+1) / 2 + (k+1)/2 )/3-2 = 5*(k+1)/3-2
综上,命题得证。
常见问题
弱假设 利用(3*n/2 -2 )结论 通过观察可知 T(n+1)<=T(n)+1 ?
确定基本运算
基本运算:算法运行过程中起主要作用且花费最多时间的运算
对每一种候选基本运算,建立T(n)与n的关系式并解 出T(n)
确定整个算法的时间复杂度
用渐进表示法表示
参考答案
以乘法为基本运算 最坏时间复杂度为T(n)=n(n+1)/2, 渐近表示法O(n2) (或算法是n2 阶的)
i←2. flag←true. S3[求余判断]
WHILE (i≤n-1) DO (IF (n MOD i)=0 THEN (flag←false. RETURN.) i←i+1.) ▌
参考答案2
算法 S (n. flag) /*判断整数n是否为素数,将结果保存到变量flag*/ S1[n≤1?]
数据结构习题 第 1 章
课堂练习
求下述计算f=1!+2!+3!+…+n!的算法的时间复杂性 void factorsum(int n) {
int i, j; int f, w; f=0; for (i=1;i<=n; i++) {
w=1; for (j=1;j<=i;j++)
w=w*j; f=f+w; } return;
当k≥3时,有k+1> (k+1) / 2 ≥ (k+1)/2, 即k≥ (k+1) / 2 ≥ (k+1)/2 所以有T( (k+1) / 2 )≤5*( (k+1) / 2 )/3-2,
...(1)
T( (k+1)/2 )≤5*( (k+1)/2 )/3-2 成立,
...(2)
又知 k= (k+1) / 2 + (k+1)/2 ,
IF (n≤1) THEN (flag←false. RETURN.) S2[初始化]
i←2. flag←true. S3[求余判断]
WHILE (i ≤ n 1/2 ) DO (IF (n MOD i)=0 THEN (flag←false. RETURN.) i←i+1.) ▌
用ADL描述算法
10000 1 10000
13 100000000
100000 1 100000 16 10000000000
1000000 1 1000000 19 1000000000000
时间固定1秒(100MIPS, 108),最大输入10000
输入固定为10000,运行时间是?
时间复杂性计算的一般步骤
n=2
T( n/2」)+T(「n/2 )+2 n>2
算法 SM 的改进算法 BS 算法BS(A , i , j . fmax , fmin) /* 在数组 A 的第 i 至第 j 个元素间寻找最大和最小
元素,已知 i j; 假定A 中元素互异 */ BS1. [递归出口]
IF i j THEN (fmax fmin A[i]. RETURN.)
常见问题
输入输出参数的确定 符号“.”的应用
分隔输入输出参数 一条语句的结束;能判断语句结束的问题可略去
符号“■”的应用
标志算法结束
注释有且精 混杂C++语言
作业1-11
题目描述
证明对正整数n≥3,算法BS的元素比较次数T(n) ≤5n/3-2。
已知信息
T(n)= 0
n=1
1
熟练后……
用渐进表示法估算每种候选基本运算的次数, 迅速确定基本运算;
可不明确指出基本运算,但计算时一定要清楚
练习题
sum=n*(n+1)/2
sum=0 for(int i=1;i<=n;i++) if(n%i==0) sum+=i;
int left=1,right=n,mid; while(left<right-1){ mid=(left+right)/2; if(f(mid)==m) break; else if(f(mid)>m) right=mid; else left=mid; }
相关概念
最好时间复杂性
特殊情况;实际意义不大
平均时间复杂性
计算前,需要确定输入的概率分布; 计算复杂
最坏时间复杂性
特殊情况;实际用的最多
算法的阶
n ∞的变化率
次数 1
n
logn
n2
1
11
1
1
10
1 10
4
100
100
1 100
7
10000
1000
1 1000
10 1000000
本题的数学归纳法证明思路
证明 n=3 时成立 假设 n <=k 时都成立,证明 n= k+1时也成立
参考答案
n=3 时, T(3)=T(1)+T(2)+2=3,5*3/3-2=3,命题成立。
假设n<=k时命题成立。
n=k+1时, T(k+1)=T( (k+1)/2 )+T( (k+1)/2 )+2,
hmin). BS4. [合并]
fmax max{gmax, hmax}.
fmin min{gmin, hmin}.
考察知识点
数学归纳法证明
归纳基础 n = ? 时,***,命题成立。
归纳假设步骤 假设n=k是,有***, 当n=k+1时,推出命题也成立
用数学归纳法证明
第一数学归纳法 (假设n=k,往推n=k+1) 第二数学归纳法(假设n<=k,往推n=k+1,强数学归纳法) 两者等价
考察知识点
用ADL描述算法
特殊情况判断 初始化 核心处理步骤 善后
算法的正确性
证明很难 验证较容易 (构造边界条件和特殊数据,人工模拟
算法执行)
评价算法的效率
参考答案1
算法 S (n. flag) /*判断整数n是否为素数,将结果保存到变量flag*/ S1[n≤1?]
IF (n≤1) THEN (flag←false. RETURN.) S2[初始化]
考察知识点
时间复杂性的计算(算法分析和数据结构的基本功)
时间复杂性:评价算法运行时间效源自的度量事后统计:编程,记录运行时间 缺点:编写程序;环境相关; 优点:直观
事前分析:直接对算法进行理论分析 算法的策略 输入的规模 基本运算的速度(100MIPS,位运算、=、+ - <、*、\%)
相关主题