数据结构习题1-4
10 51
12
7
51
3
s helpStack
51 3 7 10 12 51 s helpStack
小元素,已知 i j; 假定A 中元素互异 */ BS1. [递归出口] IF i j THEN (fmax fmin A[i]. RETURN.) 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).
22
考察知识点
算法的时间复杂度
最好 平均 最坏
计算时间复杂度的一般步骤
确定基本运算 (基本运算指算法运行过程中起主 要作用花费最多时间的运算)
确定时间复杂度 用渐进表示法表示
3
参考答案
以乘法为基本运算, 最坏时间复杂度为T(n)=n(n+1)/2, 渐近表示法O(n2) (或算法是n2 阶的)
18
a1 a2 … an-1 an an an-1 … a2 a1
辅助数组B: 先将A[1]存到B[n], A[2]存到B[n-1],…
A[n]存到B[1]; 之后将B赋值给A。
辅助空间大小为n 题目要求用尽量少的辅助空间
19
分析
a1 a2
… an-1 an
an an-1 … a2 a1
1+n 2+(n-1) … (n-1)+2 n+1
BS (A, mid1, j. hmax, hmin). BS4. [合并]
fmax max{gmax, hmax}. fmin min{gmin, hmin}.
13
算法 BS 递归方法
分治思想:不断将规模变小,直至可以处理 (本题是2或1个元素),之后进行合并。
如果规定基本运算为元素的比较,则
0
n=1
T(n) = 1
n=2
T( n/2 )+T( n/2 )+2 n>2
14
数学归纳法:
① 基础归纳:n=c (初值)时,命题是正确的; ② 归纳步骤:假设n=k时,命题成立,证明n
=k+1时,命题也成立。 完成情况:
1. 利用16页结论T(n)=3n/2-2,需要注意 前提条件——当n是2的幂时 ;
( IF (n MOD i)=0
THEN (flag←false. RETURN.)
i←i+1 .
)▌
8
边界条件和特殊数据,人工模拟算法执行过程
正确性验证: 假定n=7,模拟执行过程,对i=2,3,4, 5,6时,分别判断(7 mod i)的取值是否为 0改。进:n-1?a…≤a…n,n…1a/=n2,a,a1…≥n/b21≥nb/2b2=,,nn…ba1/,≤2/…2,bnnb//2…2,, …
= 5(k+1)/3-2
综上,命题得证。
16
第二章习题
17
2-1
编写算法Reverse (A[ ], n),将顺序存储的线性表 A=( a1, a2, …, an )转换为A=( an,…, a2, a1),要求 转换过程中使用尽量少的辅助空间。
线性表有两种存储方式:顺序存储、链接存储
按照线性表结点间的逻辑顺序依次将它们存储于一 组地址连续的存储单元中。 一维数组是实现线性表顺序存储的有效方法。 如线性表(a1, a2, …, an),可用一维数组a[n]存放。
THEN (flag←false. RETURN.)
i←i+1.
)▌
10
参考答案3
算法 S (n. flag)
S1[n≤1?]
IF (n≤1) THEN (flag←false. RETURN.)
S2[初始化] i←2. flag←true.
S3[求余判断]
时间复杂性
最好为:O(1) 最坏情况为:O(n1/2)
2. 由n=k反推n=k-1时的情况。
15
0
n=1
T(n) = 1
n=2
T( n/2 )+T( n/2 )+2 n>2
n=3 时, T(3)=T(1)+T(2)+2=3,53/3-2=3,命题成立。 假设n<=k时命题成立,需证明n=k+1时成立。
当k≥3时,有(k+1)> (k+1)/2 ≥ (k+1)/2 , 即k≥ (k+1)/2 ≥ (k+1)/2
6
完成情况
① 思想:基本正确 ② 算法:
特殊情况处理——n1?算法输出; ADL语言的使用——
a) 运算符号: % ?sqrt ? fabs() ? b) 输入输出参数: 设置返回值;中间用“.”分隔。 c) 条件语句:
if then else ; for i=1 to n step 1 (i=i+1?) d) 赋值语句:
<操作1>
…
ADL语言书写
<操作J>
算法的格式
….
▌
算术运算符: +,-,*,/, MOD(模),DIV(除数),/(除),
, 关系、逻辑运算符、逻辑常量、集合运算符 赋值语句: 条件语句: if then else ;
for i=1 to n step 1 EXIT语句、RETURN语句 、输入、输出语句
所有值大于mink且小于maxk的元素,同时释放被 删结点空间,并分析算法的时间复杂度。
特殊情况的处理:
1. 表为空 2. 元素都大于maxk 3. 元素都小于mink
第一个元素大于maxk 最后一个元素小于mink
29
主要思想:
找到大于mink的第一个元素,删除操作,直至元 素大于maxk。 时间复杂度:
q ←p. p ←next(p).
AVAILq.)
) RETURN.
prev
p
32
LD3.[找]
WHILE(pNULL AND data(p)<maxk) DO
( IF(data(p)mink) THEN
(prev ←p. p ←next(p)) //向后移动
ELSE( //删除
next(prev) ←next(p).
(
P3 next(p2)
next(P2) P1.
//反转节点指针
P1 P2. P2 P3. //移动3个指针
)
RV4[head指向反转链表]
next(head) P1 . ▌
28
2-11
链表有序的 找到区间
已知线性表中的元素以data值递增有序排列,并以 单链表做存储结构。试写一高效的算法,删除表中
第一章习题
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; }
只需从线性表的第一个数据元素开始,将 第i个数据元素与第n-i+1个数据元素相交 换即可。
i的变化范围是1到n/2。
20
参考答案
算法Reverse(A, n. A) Reverse1. [元素互换]
FOR i=1 TO n/2 DO ( temp ← A[i]. A[i] ← A[n-i+1]. A[n-i+1] ← temp. ).▌
q ←p. p ←next(p).
AVAILq.)
) RETURN. q
p
prev
33
2-17
对于顺序堆栈和链式堆栈s,分别编写函数 SelectItem(Stack & s , int n),要求在 堆栈中查找元素n在栈中第一次出现的位置, 并将该位置元素移至栈顶,同时其他元素次 序不变。(注意:用int匹配堆栈的模板)
26
p1 p2
p3
RV3[反转链表]
WHILE( P2 ≠ NULL ) DO
(
P3 next(p2)
next(P2) P1.
//反转节点指针
P1 P2. P2 P3. //移动3个指针
)
RV4[head指向反转链表]
next(head) P1 . ▌
27
p1
p2
RV3[反转链表]
WHILE( P2 ≠ NULL ) DO
LD2.[初始化] prev←head. p ←next(head) prev
head
P
31
LD3.[找]
WHILE(pNULL AND data(p)<maxk) DO
( IF(data(p)mink) THEN
(prev ←p. p ←next(p)) //向后移动
ELSE( //删除
next(prev) ←next(p).
比较为基本运算
最好:空,元素都大于maxk(找不到)//O(1) 最坏:元素都小于mink(找不到)
元素都小于maxk //O(n)
30
算法 LD ( L,mink,maxk. L)
LD1.[特殊情况] IF mink maxk THEN (RETURN.) IF (next(head)=NULL) THEN RETURN.
WHILE (i ≤ 「n 1/2 ) DO