A[j]↔A[j-1]
sorted=false
endif
endfor
i=i-1
endwhile
endBUBBLESORT
5.用两种方法证明logn!
=
(nlogn)。
(1)用代数方法
(2)用积分方法
6.求解递推关系式f(n)=-6f(n-1)-9f(n-2)。
7.分治算法由哪些基本步骤组成分治算法的时间复杂性常满足什么样的递归方程,写出该方程的一般形式,并指出其中各参数的意义。
8.算法有哪五个特性
9.什么是最优子结构
10.贪心法与动态规划有何根本区别
11.设计回溯算法通常包括哪些步骤
12.随机算法分成那几类,各有什么特点
三.算法填空
1.以下是计算xm的值的过程
power(x,m)
以下是关于矩阵链乘的算法MATCHAIN1和MATCHAIN_PRODUCT
算法MATCHAIN1
输入:
矩阵链长度n,n个矩阵的阶r[1..n+1],其中r[1..n]为n个矩阵的行数,r[n+1]为第n个矩阵的列数。
输出:
n个矩阵相乘的数量乘法的最小次数,最优顺序的信息数组S[1..n,1..n]。
fori=1tonC[i,i]=0n,1..n]。
输出:
按最优顺序计算的矩阵链乘积M=M1M2…Mn。
M=matchain_product(1,n)
returnM
endMATCHAIN_PRODUCT
过程matchain_product(i,j)
以下是迷宫问题的算法
算法MAZE
输入:
正整数m,n,表示迷宫的数组M[0..m+1,0..n+1](迷宫数据存于M[1..m,1..n]中),迷宫的入口位置(ix,iy),出口位置(ox,oy)。
输出:
迷宫中入口至出口的一条通路,若无通路,则输出nosolution。
M[0,0..n+1]=M[m+1,0..n+1]=1
M[0..m+1,0]=M[0..m+1,n+1]=1m,1..n]=0
为dx[1..4],dy[1..4]置值
flag=falsei]表示的通路。
elseoutput“nosolution” 下面是求一个序列的多数元素的递归算法
算法MAJORITY
输入:
n个元素的数组A[1..n]。
输出:
若A[1..n]存在多数元素,则输出;否则输出none。
c=candidate
(1)n]中的候选多数元素。
count=0n]中的多数元素。
forj=1ton
ifA[j]=cthencount=count+1
endfor
if____________thenreturnc
elsereturnnone
endMAJORITY
过程candidate(m)
n]中的候选多数元素并返回。
j=m;c=A[m];count=1
whilej0
j=j+1
if____________then____________
else____________下面是0-1背包问题的算法
算法KNAPSACKREC
输入:
物品数n,n种物品的体积数组s[1..n]和价值数组v[1..n],
背包容量C。
输出:
装入背包物品的最大总价值,以及最优解的信息数组H[0..n,0..C]。
fori=0ton
forj=0toC
V[i,j]=-1
maxv=knapsack(n,C)
returnmaxv,H
endKNAPSACKREC
过程knapsack(i,j)
n,0..C]。
ifV[i,j]=-1thenn],相应的0/1背包问题的最优解信息数组H[0..n,0..C]。
输出:
相应的0/1背包问题的最优解X[1..n]。
y=C以下是随机化的线性选择算法
算法RANDOMIZEDSELECT
输入:
整数n,k,1<=k<=n,以及n个元素的数组A[1..n]。
输出:
A中的第k小元素s。
s=rselect(A,1,n,k)
endRANDOMIZEDSELECT
过程rselect(A,low,high,k)
high]中的第k小元素并返回。
v=random(low,high)
mm=____________
将A[low..high]分成三个数组:
A1={a|amm}
high]的第k小元素。
|A1|+|A2|returnrselect____________
以下是归并排序的分治算法
MERGESORT
输入:
n个元素的数组A[1..n]。
输出:
按非降序排序的数组A[1..n]。
mergesort(A,1,n)
endMERGESORT
过程mergersort(A,low,high)
high]按非降序归并排序。
iflowmid=___________以下是分数背包问题的贪心算法
算法GREEDY_KANPSACK
输入:
表示背包容量的实数C,物品数n,表示n个物品的体积和价值的实数数组s[1..n]和v[1..n]。
输出:
装入背包物品的最大总价值maxv和相应的最优解x[1..n]。
fori=1ton
y[i]=v[i]/s[i]n]。
endfor
n]按降序地址排序,排序结果返回到数组d[1..n]n]初始化。
i=1;maxv=0;rc=Cn]
endGREEDY_KNAPSACK
9.以下是子集合问题的回溯算法
算法SUBSETSUM
输入:
正整数n,正实数b,表示含有n个正实数的集合S的数组a[1..n]。
输出:
集合S的元素之和等于b的所有子集,若无解,则输出“nosolution”。
fori=1tonx[i]=0n]表示子集,初始化为空集。
r=0
fori=1tonr=r+a[i]
flag=subset(0,0,r)
ifnotflagthenoutput“nosolution”
endSUBSETSUM
过程:
subset(k,sum,r)
k]固定的情况下,求关于S,b的
n];t=true下面是一个求n个元素全排列的算法
算法PERMUTATION
输入:
正整数n和存储n个元素a1,a2,…,an的数组P[1..n]。
输出:
a1,a2,…,an的全排列。
perml
(1)
endPERMUTATION
过程perml(m)
m-1]中元素固定不变的情况下,求P[m..n]中元素
n]中元素的相应排列。
if____________thenn];n]中元素的一个新排列。
else
forj=mton
P[m]↔P[j]
____________
____________
endfor
endif
endperml
11.以下是求最长公共子序列的算法
算法LCS
输入:
非负整数n、m,长度分别为n和m的序列A=a1a2…an和B=b1b2…bn。
输出:
A和B的最长公共子序列长度L[n,m]和存储最长公共子序列的有关信息的数组H[1..n,1..m]。
fori=0tonL[i,0]=0
forj=0tomL[0,j]=0
fori=1ton
forj=1tom
ifai=bjthen
L[i,j]=____________;H[i,j]=0
else
ifL[i-1,j]>=L[i,j-1]then
L[i,j]=____________;H[i,j]=1
else
L[i,j]=L[i,j-1];H[i,j]=____________
endif
endif
endfor
endfor
returnL[n,m],H
endLCS
算法LCSS
输入:
非负整数n、m,长度分别为n和m的序列A和B的最长公共子序列的有关信息数组H[1..n,1..m],序列A=a1a2…an。
输出:
序列A和B的最长公共子序列C。
C=Φ以下是0-1背包问题的回溯算法
算法KNAPSACK01
输入:
物品数n,n种物品的体积数组s[1..n]和价值数组v1..n],背包容量C。
输出:
装入背包物品的最大总价值maxv和最优解x0[1..n]。
n]表示选择的物品子集,初始化为空集。
rv=0;rs=0
fori=1ton
rv=rv+v[i];rs=rs+s[i]
maxv=0;x0[1..n]=x[1..n]=0n]
endKNAPSACK01
过程:
knapsack(k,r,cv,rv,rs)
k]固
k]=x[1..k];x0[k+1..n]=1;
endif
else
ifr>0andcv+rv>maxvthen下面是求第k小元素的算法
算法SELECT
输入:
整数n,k,1<=k<=n,以及n个元素的数组A[1..n]。
输出:
A中的第k小元素s。
s=select(A,1,n,k)
endSELECT
过程select(A,low,high,k)
high]中的第k小元素并返回。
p=high-low+1high]排序
return(A[low+k-1])
endif
high]每5个分组,剩余的被排除。
将A[low..low+5q-1]分为q组,每组5个元素;
将q组中的每一组单独排序并找出中项,所有的中项存于数组M[1..q]中;
mm=select(____________)high]分成三组:
A1={a|amm}
有期限的作业安排问题
算法JOB_ARRANGEMENT
输入:
作业数n,表示n个作业的期限和收益的数组d[1..n]和p[1..n]。
输出:
最优的作业安排序列J[1..k]和安排的作业数k。
n]按降序地址排序,排序结果返回到数组a[1..n]
k]
endJOB_ARRANGEMENT
15.以下是关于矩阵链乘的算法MATCHAIN1和MATCHAIN_PRODUCT
算法MATCHAIN1
输入:
矩阵链长度n,n个矩阵的阶r[1..n+1],其中r[1..n]为n个矩阵的行数,r[n+1]为第n个矩阵的列数。
输出:
n个矩阵相乘的数量乘法的最小次数,最优顺序的信息数组S[1..n,1..n]。
fori=1tonC[i,i]=0n,1..n]。
输出:
按最优顺序计算的矩阵链乘积M=M1M2…Mn。
M=matchain_product(1,n)
returnM
endMATCHAIN_PRODUCT
过程matchain_product(i,j)
格雷码问题
对于给定的正整数n,格雷码为满足如下条件的一个编码序列:
(1)序列由2n个编码组成,每个编码都是长度为n的二进制位串。
(2)序列中无相同的编码。
(3)序列中位置相邻的两个编码恰有一位不同。
例如:
n=2时的格雷码为:
{00,01,11,10}。
设计求格雷码的递归算法。
2.给出一个分治算法,在一个具有n个数的数组中找出第二个最大元素。
给出你的算法的时间复杂性
3.考虑金钱兑换问题。
有一个货币系统,它有n种硬币,它们的面值为v1,v2,…,vn,其中v1=1。
我们想这样来兑换价值为y的钱,要让硬币的数目最少。
更形式地,我们要让下面的量
在约束条件
下极小。
其中,x1,x2,…,xn是非负整数(xi可能是0)
4.线段覆盖问题:
在实轴上有n个点x1,x2,…,xn,要求用最少数量的单位长线段覆盖这些点。
写出求该问题的最优值和最优解的贪心算法。
5.马的周游问题:
给出一个nxn棋盘,一个中国象棋马在某个起点位置(x0,y0),求一条访问每个棋盘格点恰好一次,最后回到起点的周游路线。