c语言写流水作业调度问题算法,算法_计算机与软件_考研论坛(kaoyan.com)

基本概念复习题(问答题每题回答尽可能不超过200字,先写出你认为是最重要的内容)

什么是基本运算? 什么是算法的时间复杂性(度)?什么是算法的渐近时间复杂性?

答:基本运算是解决问题时占支配地位的运算(一般1种,偶尔两种)  算法的时间复杂性(度)是指用输入规模的某个函数来表示算法的基本运算量。算法的渐进时间复杂性是指当输入规模趋向于极限情形时(相当大)的时间复杂性。

表示渐进时间复杂性的三个记号的具体定义是什么?

答:(1). T(n)= O(f(n)):若存在c > 0,和正整数n0≥1,使得当n≥n0时, 总有 T(n)≤c*f(n)。 (给出了算法时间复杂度的上界,不可能比c*f(n)更大)                                   (2). T(n)=Ω(f(n)):若存在c > 0,和正整数n0≥1,使得当n≥n0时, 存在无穷多个n ,使得T(n)≥c*f(n)成立。(给出了算法时间复杂度的下界,复杂度不可能比c*f(n)更小)    (3).T(n)= Θ(f(n)):若存在c1,c2>0,和正整数n0≥1,使得当n≥n0时, 总有 T(n)≤c1*f(n), 且有无穷多个n,使得T(n)≥c2*f(n)成立, 即:T(n)= O(f(n))与T(n)=Ω(f(n))都成立。(既给出了算法时间复杂度的上界,也给出了下界)

什么是最坏情况时间复杂性?什么是平均情况时间复杂性?

答:最坏情况时间复杂性是规模为n的所有输入中,基本运算执行次数为最多的时间复杂性。  平均情况时间复杂性是规模为n的所有输入的算法时间复杂度的平均值 (一般均假设每种输入情况以等概率出现)。

一般认为什么是算法?什么是计算过程?算法研究有哪几个主要步骤?主要从哪几个方面评价算法?

答:一般认为,算法是由若干条指令组成的有穷序列,有五个特性a.确定性(无二义)b.能行性(每条指令能够执行)c.输入 d.输出 e.有穷性(每条指令执行的次数有穷)只满足前4条而不满足第5条的有穷指令序列通常称之为计算过程。算法研究的主要步骤是1)设计2)表示 3)确认,合法输入和不合法输入的处理 4)分析 5)测试。评价算法的标准有1)正确性 2)健壮性 3)简单性 4)高效性 5)最优性。

关于多项式时间与指数时间有什么样的结论?

答:1. 多项式时间的算法互相之间虽有差距,一般可以接受。                       2. 指数量级时间的算法对于较大的n无实用价值。

什么是常系数线性递归方程(差分方程)?

c0an+c1an-1+…+cran-r=f(n)  (*)  (这里c0*cr≠0) ,所有ai都是一次的。

主定理的内容是什么?根据主定理的结论,可以获得哪些关于算法改进的启示?

答:T(n)=a*T(n/b)+f(n)

若有ε> 0, 使f(n)=O( )  (即f(n)的量级多项式地小于 的量级),

则T(n)=  ( )。

若f(n)= ( )   (即f(n)的量级等于 的量级),

则T(n) =(  )。

若f(n)= (  ), 则T(n)=(   )。

若有ε>0, 使f(n)=( )  (即f(n)的量级多项式地大于 的量级),

且满足正规性条件:  存在常数c<1, 使得对所有足够大的n,有a*f(n/b)c*f(n), 则T(n)=(f(n))。

正规性条件的直观含义: 对所有足够大的n,a个子问题的分解准备与再综合所需要的 时间总和,严格小于原问题的分解准备和综合所需要的时间。 因此一般来说,对于时间复杂度满足递归关系 T(n)=a*T(n/b)+f(n)的算法,只需比较f(n)与的量级大小, aLogbn算法的时间复杂度总是与量级大的那个相同(即小的那个可以忽略);若f(n)与的量级相同(或只差), aLogbnnLogk则算法的时间复杂度为f(n)*。

主定理对于算法改进得启示在于:1)当T(n)= Θ ()时,即当的量级高于f(n)的量级时,n的量级在算法的时间复杂度中起主导作用。因而此时首先应当考虑使 aLogbnaLogbnaLogb logb a的值变小,而暂时无须考虑如何改善f(n),即此时要考虑减小a (子问题个数)且使b不变(n/b为子问题规模),或增大b(减小子问题规模)而使a不变。也就是说,此时的重点应考虑改进子问题的分解方法,暂不必考虑改进子问题组合时的处理。2)当f(n)的量级高于或等于的量级时,则f(n)的量级在算法的时间复杂度中起主导作用。因而此时首先应当考虑把f(n)的量级往下降,即此时应着重改善子问题组合时的处理方法,减少该部分工作的处理时间f(n)。

分治法的要领是什么?(分治法可分为哪三个主要步骤?)

答:分治法是把一个规模较大的问题分解为若干个规模较小的子问题,这些子问题相互独立且与原问题同类; 首先求出这些子问题的解,然后把这些子问题的解组合起来得到原问题的解。由于子问题与原问题是同类的,故使用分治法很自然地要用到递归。   因此分治法分三步:1 将原问题分解为子问题(Divide)。2 求解子问题(Conquer)。3 组合子问题的解得到原问题的解(Combine)。

分治法求最大、最小元算法的主要思路是什么?

答:当n=2时,一次比较就可以找出两个数据元素的最大元和最小元。当n>2时,可以把n个数据元素分为大致相等的两半,一半有n/2个数据元素,而另一半有n/2个数据元素。先分别找出各自组中的最大元和最小元,然后将两个最大元进行比较,就可得n个元素的最大元;将两个最小元进行比较,就可得n个元素的最小元。

叙述Strassen矩阵相乘算法的主要思路和意义。

答:把矩阵A,B分成4个规模为n/2的子矩阵块如下。

由于  = ,所以,C11=A11B11+A12B21,C12= A11B12+ A12B22,C21=A21B11+A22B21,C22= A21B12+ A22B22。

同时引入下列Mi(i=1,2...7) M1=(A12-A22) (B21+B22),M2=(A11+A22) (B11+B12)

M3=(A11-A21) (B11+B12),M4=(A11+A12) B22,M5=A11(B12-B22),M6=A22(B21-B11)

M7=(A21+A22)B11  则计算两个n阶矩阵的乘法为7对n/2阶矩阵的乘法(时间为7T(n/2)), 18对n/2阶的矩阵的加减法(时间为18*(n/2)2=(n2))。因此得时间复杂度的递归方程:T(n)=7T(n/2)+(n2),由主定理得T(n)=  ( ). Strassen矩阵相乘算法意义在于打破了人们认为矩阵乘法的时间复杂度为(n3)的固有看法。

11.用200字概括Select(求第k小元)算法的主要思路。

答:1.若S<50,则采用堆排序的方法找出第k小的元素。若S50,则采用下述的方法。2.将n个元素分成[n/5]组,每组5个元素

3.对每个5元组进行排序,全部5元组排序后,从每组中取出第3个元素(中间元)得到一个长为[n/5]的数组M

4.递归调用Select([|M|/2],M),即在M数组中找到第[|M|/2]小的数(中位数),记为m

5.依次扫描整个数组S,此项工作所需时间为O(n)。当sim时将si放入数组S3;在得到的3个集合中,S1中的数均小于m;S2中的数均等于m;S3中的数均大于m。

6. 按照k值大小,共可分成下列三种情况(注意S2至少有一个元素m): k≤|S1|;|S1||S1|+|S2|。 下面针对这三种情况分别进行讨论。

6.a:若k≤|S1|,则第k小元素必定在S1中。 此时递归调用Select(k,S1),就可以获得第k小元素。 因大于等于m的数据元素至少有3n/10-6个, 而S1中的数均小于m,故S1中的数据元素至多有7n/10+6个, 即|S1|≤7n/10+6。因此,调用Select(k,S1)的 时间复杂度不超过T(7n/10+6)。

6.b:若|S1|

6.c:若k>|S1|+|S2|,则第k小元素必定大于m,因此在S3中。 而且此时该元素在S3中应为第k-|S1|-|S2|小的元素。 于是递归调用Select(k-|S1|-|S2|, S3), 就可以获得S中的第k小元素。 因小于等于m的数据元素至少有3n/10-6个

12. 试用200~300字概述寻找最近点对算法的主要步骤。该算法中有哪几点最为关键?

答:主程序算法: 读入n个点的坐标,这n个点的x坐标和y坐标 分别放在X,Y两个数组中,然后进行预处理: 对X数组中的n个x坐标值按从小到大的次序进行排序, 排序过程中保持x坐标和y坐标的对应关系:

若X与X[j]对换位置,则Y与Y[j]也做相同的对换。 另外,若两个点的x坐标相同,则y坐标值小的排前。 X数组排好之后就固定了,以后不再改变, 以便在O(1)时间对其实现分拆。(排序时间为Θ(n log n)) 将数组IND初始化为:IND=i(i=1,2,┉,n)。 数组IND即是用来保持x坐标和y坐标的对应关系的机制, IND记录的是 其y坐标值为Y的点所对应的x坐标在X数组中的下标。 对Y数组中的n个y坐标值按从小到大的次序进行排序, 排序过程中保持y坐标和x坐标的对应关系: 若Y与Y[j]对换位置,则IND 与IND [j]也做相同的对换。 这样,当给了一个点的y坐标Y之后, 就可以在O(1)时间找到其对应的x坐标: Y与X[IND ]就是该点的y坐标和x坐标。

调用子程序FCPP(1,n,X,Y,IND,δ,p,q) 就可求得n个点中的最近点对(p,q)和最小距离δ。 子程序FCPP的主要执行过程: 首先看当前处理的点数。若不超过3个点,就直接进行相互比较。 若超过3个点,则把点的y坐标分为两部分:左边和右边。

然后进行分治,求得两边的δL和δR,从而求得δ。 求出分割线,扫描当前的所有点,把落到2δ带状区域内的点找出来, 并使这些点的y坐标仍然保持从小到大的次序。 对落到2δ带状区域内的每一个点检查其后面的7个点, 若有距离更近的点对,则把最小距离δ(及最近点对(p,q))更新, 执行完毕时,最小距离δ及最近点对(p,q)就得到了。

子程序FCPP(j,k,X,Ypres,INDpres,δ,p,q)中的参数说明: X数组存放已排好序的n个点的x坐标。 j,k为当前处理的X数组一段中的最小和最大下标。 Ypres数组存放当前处理的k-j+1个点的y坐标 (已按从小到大的次序排好)。 INDpres数组的长度也是k-j+1,INDpres记录了其y坐标值 为Ypres 的点的x坐标在X数组中的下标值。 δ,p,q均为返回值, 给出当前处理的k-j+1个点中的最小距离δ和最近点对(p,q)。

算法中的几个关键点:分割线的寻找和最小距离相关的比较次数的判定

13. 什么是离散傅立叶变换(DFT)?其使用的矩阵有什么特点?

答:是连续傅里叶变换在时域和频域上都离散的形式,将时域信号的采样变换为在离散时间傅里叶变换(DTFT)频域的采样。在形式上,变换两端(时域和频域上)的序列是有限长的,而实际上这两组序列都应当被认为是离散周期信号的主值序列。即使对有限长的离散信号作DFT,也应当将其看作经过周期延拓成为周期信号再作变换。在实际应用中通常采用快速傅里叶变换以高效计算DFT。

14. 什么是快速傅立叶变换(FFT)?如何用FFT来计算2个多项式的乘积?

答: 能在Θ(nlogn)时间里完成DFT的算法就称为FFT.  给了2个多项式的系数向量a和b之后,若其系数不是2的幂次,则将a和b的规模扩大(向量最后加若干个0)使得n=2m..然后把这两个向量维数再扩大一倍,得到两个维数为2n的向量。分别对2个向量做DFT,所得到两个向量进行点乘,再对结果做2n阶的DFT-1,即可求得2多项式相乘后的多项式系数c

15. 什么是平衡?分治法与平衡之间有着什么样的关系?

答:在使用分治法和递归时,要尽量把问题分成规模相等,或至少是规模相近的子问题,这样才能提高算法的效率。使子问题规模尽量接近的做法,就是所谓的平衡。

16. 分治法与动态规划法之间的相同点是什么?不同之处在哪些方面?

答:与分治法类似,动态规划法 也是把问题一层一层地分解为规模逐渐减小的同类型的子问题。   动态规划法与分治法的一个重要的不同点在于,用分治法分解后得到的子问题通常都是相互独立的, 而用动态规划法分解后得到的子问题很多都是重复的。因此,对重复出现的子问题,只是在第一次遇到时才进行计算,然后把计算所得的结果保存起来;当再次遇到该子问题时,就直接引用已保存的结果,而不再重新求解。

17. 简述求矩阵连乘最少乘法次数的动态规划算法(不超过300字)

答:按照做最后一次乘法的位置进行划分,

该矩阵连乘一共可分为j-i种情况即有(j-i)种断开方式:

Mi(Mi+1┅Mj),(MiMi+1)(Mi+2┅Mj),┅,(MiMi+1┅Mj-1)Mj。

其中任一对括号内的矩阵个数(即规模)不超过j-i。

由于在此之前我们已知 任一个规模不超过j-i的矩阵连乘所需的最少乘法次数, 故(Mi┅Mk)和(Mk+1┅Mj)所需的最少乘法次数已知, 将它们分别记之为mik和mk+1,j。 于是,形为(Mi⋯Mk)(Mk+1⋯Mj)的矩阵连乘所需的最少乘法次数为:mik+mk+1,j+ri-1×rk×rj。 此式中的所有参加运算的数均已知, 故此式在O(1)时间里即可完成计算。 对满足i≤k

mij=min(i≤k

于是在初始时我们定义mii=0(相当于单个矩阵的情况), 然后首先求出计算M1M2, M2M3, ┅, Mn-1Mn 所需的乘法次数mi,i+1(i=1,2,┅,n-1), 具体数值为ri-1×ri×ri+1, 因mii= m i+1, i+1=0; 再利用这些结果和(*)式,就可以求出 计算M1M2M3, M2M3 M4, ┅, Mn-2Mn-1Mn 所需的最少乘法次数mi,i+2(i=1,2,┅,n-2)。 同理,可依次算出mi,i+3(i=1,2,┅,n-3),mi,i+4(i=1,2,┅,n-4),┅, 直至算出m1,n即M1M2┅Mn-1Mn矩阵连乘所需的最少乘法次数。

18. 能够用动态规划法求解的问题通常具有什么样的特征?

答:若一个问题可以分解为若干个高度重复的子问题, 且问题也具有最优子结构性质,就可以用动态规划法求解: 以递推的方式逐层计算最优值并记录必要的信息, 最后根据记录的信息构造最优解。

19. 什么是最长公共子序列问题?在求LCS的算法中,C[i,j]是如何计算的?为什么需要这样计算?

答:若Z

则称Z是X和Y 的最长公共子序列,记为Z∈LCS(X,Y)。如何在低于指数级的时间复杂度内找到LCS称为最长公共子序列问题

C[i,j]=0, 若i=0或j=0

C[I,j]=C[i-1,j-1]+1 若i,j>0且xi=yi

C[I,j]=max{C[i-1,j],C[i,j-1]} 若i,j>0且xi!=yi

二维数组C,用C[i,j]记录Xi与Yj的LCS的长度 如果我们是自底向上进行递推计算,那么在计算C[i,j]之前, C[i-1,j-1], C[i-1,j]与C[i,j-1]均已计算出来。此时我们 根据X=Y[j]还是X≠Y[j],就可以计算出C[i,j]。  计算的理由:求LCS(Xm-1,Y)的长度与LCS(X,Yn-1)的长度 这两个问题不是相互独立的: ∵两者都要求LCS(Xm-1,Yn-1)的长度, 因而具有重叠性。 另外两个序列的LCS中包含了两个序列的前缀的LCS, 故问题具有最优子结构性质 考虑用动态规划法。

20. 用200~300字概述求最优二分搜索树算法的主要步骤。算法中有哪几点最为关键?

答:记cij是最优子树Tij的耗费, 则ci,k-1是最优子树Ti,k-1的耗费,ck,j是最优子树Tk,j的耗费。 考察以ak (i+1≤k≤j)为根、由结点bi,ai+1,bi+1,⋯,aj,bj构成的、 耗费最小的树的总耗费:该树的左子树必然是Ti,k-1,右子树必然是Tk,j。 这棵树的总耗费可分为三部分:左子树、右子树和根。 由于Ti,k-1作为左子树接到结点ak之下时,其耗费增加wi,k-1, 故左子树的耗费为:ci,k-1+ wi,k-1, 同理,右子树的耗费为:ck,j+wk,j, 由于根ak的深度为0,按定义,根的耗费为pk。 因此,以ak 为根、耗费最小的树的总耗费为:ci,k-1+ wi,k-1+ckj+wk,j+pk。 注意到,wi,k-1=qi+pi+1+qi+1+⋯+pk-1+qk-1, wk,j=qk+pk+1+qk+1+⋯+pj+qj, 从而有wi,k-1+wkj+pk = qi+pi+1+qi+1+⋯+pk-1+qk-1+ pk +qk+pk+1+qk+1+⋯+pj+qj = wij。 由此得到以ak 为根、耗费最小的树的总耗费为:ci,k-1+ckj+wi,j

由于pi(i=1,2,⋯,n), qj(j=0,1,2,⋯,n)在初始时已经知道, 若wi,j-1已知,则根据wi,j= wi,j-1+pj + qj可以计算出wij。 故当ci,k-1与ckj已知时,以ak 为根的树的最小总耗费 在O(1)时间就可以计算出来。 分别计算以ai+1,ai+2,⋯,aj为根、 含有结点bi,ai+1,bi+1,⋯,aj,bj的树的最小总耗费, 从中选出耗费最小的树,此即最优子树Tij。 因此,最优子树Tij的耗费cij={cminj k i ≤

本算法的关键点:分析出最优二分搜索树具有最优子结构;在计算中规模较小的最优子树在计算中要被多次用到。Cij和Wij都是可以通过前面的计算递推得出的。

21. 用200~300字概述二维流水作业调度算法的主要步骤。

答:求解该问题的算法如下。

1. 建立长为2n的数组C,将a1, a2,┅, an依次放入C[1]~ C[n]中,b1, b2,┅, bn依次放入C[n+1]~ C[2n]中。 /* O(n), 下面将对这2n个数进行排序*/

2. 对长为2n的数组D进行初始化:D[1]~ D[n]中依次放1,2,┅,n,D[n+1]~ D[2n]中依次放-1,-2,┅,-n。 /* O(n), 分别对应于a1, a2,┅, an和b1, b2,┅, bn的下标*/

3. 对数组C进行排序,D[k]始终保持与C[k]的对应关系。

(若C与C[j]对换,则D也与D[j]对换。

或将C,D放在同一结构体中。) 当a1, a2,┅, an及b1, b2,┅, bn按从小到大次序排好之后,

D[1]~ D[2n]也就按从小到大的次序记录了这些ai和bj的下标即作业号(bj的下标前有一负号以区别于ai))。/*O(n log n)*/

4. 将E[1]~ E[n]全部置为"No"。 /* O(n),表示所有任务均尚未被安排*/

5. 下标变量初始化:i←1;j←n;k←1;

/*O(1),i指向当前最左空位F,放当前应最先安排的作业号;*/ /* j指向当前最右空位F[j],放当前应最后安排的作业号;*/ /* k从1开始逐次增1,*/ /* D[k](或-D[k])按ai和bj从小到大的次序依次给出作业号*/

6. while i ≤ j

do { /* 作业尚未安排完毕,i从小到大, j从大到小*/

if D[k] > 0 then {if E[D[k]]为"No"then /*作业D[k]放在当前最左空位*/ {F←D[k]; i增1; E[D[k]] 置为"Yes"}}

else if E[-D[k]]为"No"then /*作业-D[k]放在当前最右空位*/ {F[j]←-D[k]; j减1; E[-D[k]] 置为"Yes"}}

k增1;}

22. 什么是备忘录方法?它在什么情况下使用较为有效?

答:备忘录方法是动态规划方法的变形。与动态规划算法不同的是,备忘录方法的递归方式是自顶向下的,而动态规划算法则是自底向上的。

若有大量的子问题无需求解时,用备忘录方法较省时。

但当无需计算的子问题只有少部分或全部都要计算时,

用递推方法比备忘录方法要好(如矩阵连乘,最优二分搜索树)。

23. 简单不相交集的合并算法中为什么要引进集合的外部名和内部名?

答::若没有内部名,则每次合并时两个集合中的所有元素均要改名(改为K),这样,在n-1次Union中改名的时间就变为O(n2) 。

24. 什么是平摊分析?平摊分析常用的手法有哪几种?简单说明这几种手法的要点。

势能方法中引入平摊代价的意义是什么?

答:考虑n条指令执行的最坏时间复杂性。 即使某些指令执行时具有比较大的代价,

但利用平摊分析后对整体考虑, 可以得到较小的平均代价。

平摊分析方法主要有:聚集方法,会计方法和势能方法。

聚集方法:全局考虑时间复杂性, 把n条指令的耗费分为几类; 分别计算每一类耗费的总和, 然后再把各类耗费总加起来。

会计方法:利用几个操作之间的联系,在一个操作中预先支付下面某个操作的费用,以达到简化代价计算的目地。

势能方法:设Ci为第i个操作的实际代价,D0为处理对象的数据结构的初始状态,

Di为第i个操作施加于数据结构Di-1之上后数据结构的状态,引入势函数Φ,Φ(Di)是与Di相关的势。定义第i个操作的平摊代价为:= Ci +(Φ(Di)- Φ(Di-1))(即实际代价加上势的变化),

25. 为什么树结构下执行O(n)条带路径压缩的Union-Find指令只需要O(n*G(n))时间?

答:用平摊分析的聚集方法,把O(n)条Find指令的耗费分为三类:

1) O(n)条Find指令的根费用,

2) O(n)条Find指令的组费用,

3) O(n)条Find指令的路径费用。

根费用:执行一条Find指令时,处理根及其儿子所需的费用。 一条Find指令只会碰到一个根(及其儿子), 故O(n)条Find指令的根费用为O(n), 这样,根及其儿子的费用已全部计算在内。

组费用:若结点ik (0≤k≤m-2)与其父结点ik+1的秩不在同一个秩组中, 则对ik收取一个组费用。因最多有G(n)个组, 故一条Find指令最多只会碰到G(n)个结点、 其秩与其父结点的秩不在同一个秩组中, 故O(n)条Find指令的组费用最多为O(n*G(n))。

路径费用:由于其秩在组号为g的组中结点的个数不超过n/F(g), 故组g中的结点的收取的路径费用 不超过[n/F(g)]*[F(g)-(F(g-1)+1)]< [n/F(g)]*F(g)=n。 因总共只有G(n)个组, 故所有结点在O(n)条Find指令的执行中, 收取的路径费用不超过O(n*G(n))。

三项费用总加起来,有O(n)+ O(n*G(n))+O(n*G(n))=O(n*G(n)) 于是可得结论:如果合并是是把小集合并入大集合, 且执行Find指令时实施路径压缩,则执行O(n)条Unoin-Find指令的时间复杂度为O(n*G(n));

26. 对于任意给定的一棵2-3树,能够画出插入一个结点或删除一个结点后的状态。

27. 能够正确编写出返回Weight值的FIND程序和FIND-DEPTH程序(给出结点在未经压缩的森林中的深度)。

28. 什么是字典?什么是优先队列?什么是可并堆?什么是可连接队列?

答:字典:可实现MEMBER、INSERT、DELETE的数据结构。优先级队列是不同于先进先出队列的另一种队列。每次从队列中取出的是具有最高优先权的元素。可并堆是可实现Insert、Delete、Union和Min的数据结构。可连接队列:可实现Insert、Delete、Find、Concatenate(保序合并)、Split(分裂)的数据结构。

29. 在以上这些数据结构上的各种操作如何实现?

30. 简述随机取数算法和找第k小元素的随机算法。

答:Random Sampling问题(Las Vegas算法)

设给定n个元素(为简单起见,设为1,2,⋯n),要求从n个数中随机地选取m个数(m≤n)。可以用一个长为n的布尔数组B来标识i是否被选中,初始时均表为"未选中"。然后随机产生〔1,n〕之间的一个整数i,若B为"未选中",则将i加入被选中队列, 同时把B标识为"已选中",反复执行直到m个不同的数全部被选出为止。

找第k小元素的随机算法(Las Vegas算法):

在n个数中随机的找一个数A=x, 然后将其余n-1个数与x比较,分别放入三个数组中: S1(元素均x)。 若|S1|≥k 则调用Select(k,S1); 若(|S1|+|S2|)≥k,则第k小元素就是x; 否则就有(|S1|+|S2|)< k,此时调用Select(k-|S1|-|S2|,S3)。

31. 简述Testing String Equality算法的误判率分析。

答:数论定理1:设π(n)是小于n的素数个数,则π(n)≈nnelog, 误差率不超过6%。

∵M=2n2,Pr[failure]的分母 π(M)≈Pr[failure]的分子 ≤ 使得Ip(x)=Ip(y)的素数p(p

数论定理2:如果a<2n,则能够整除a的素数个数不超过π(n)个。 (只要n不是太小。)

∴Pr[failure]≤π(n) / π(M)≈nnnneelog/log/2=n1。即误匹配的概率小于n1。

设x≠y,如果取k个不同的小于2n2的素数来求Ip(x)和Ip(y), 由于事件的独立性,因此事件均发生的概率满足乘法规则, 即k次试验均有Ip(x)=Ip(y)但x≠y(误匹配)的概率小于kn1。 ∴当n较大、且重复了k次试验时,误匹配的概率趋于0。

32. 简述MILLER-RABIN素数测试算法的理论基础和算法的主要思路。

答:一.费马小定里 if n is prime and (a,n) equals one ,then a^(n-1) = 1 (mod n)。费马小定理只是个必要条件,符合费马小定理而非素数的数叫做Carmichael.前3个Carmichael数是561,1105,1729。Carmichael数是非常少的。在1~100000000范围内的整数中,只有255个Carmichael数。为此又有二次探测定理,以确保该数为素数:   二. 二次探测定理 如果p是一个素数,0

0、先计算出m、j,使得n-1=m*2^j,其中m是正奇数,j是非负整数;

1、随机取一个b,2<=b ;2、计算v=b^m mod n;3、令i=1;4、如果v==1,通过测试,返回;5、如果v=n-1,通过测试,返回;6、如果i==j,非素数,结束;7、v=v^2 mod n,i=i+1;8、循环到5;

33. 完成Pattern Matching三种算法的上机作业。

34. Church-Turing Thesis的内容是什么?它的提出有什么意义?

答:任何合理的计算模型都是相互等价的(计算范围相同)。

合理:单位时间内可以完成的工作量,有一个多项式的上限。不合理举例:任意多道的并行计算。由于有"任何"二字,故无法进行证明。但迄今为止所有被提出的合理计算模型均满足该论题。

这个论题说明:可计算性本身是不依赖于具体模型的客观存在。

35. 非确定性Turing机与确定性Turing机的主要区别在什么地方?

答:与DTM不同的是,NDTM的每一步动作允许有若干个选择,对于给定的Q×Tk的一个元素(qi, a1, a2,⋯, ak),它的δ转移函数值不是对应于一个Q×(T×{L,R,S})k中的一个元素,而是对应于Q×(T×{L,R,S})k中的一个子集。

与DTM不同的是,DTM的 ID序列是线性的: ID0├ ID1├ ID2├ ┅├ IDm, 而NDTM的ID序列通常是用树来描述的 (因为在每个格局都可能有多个选择)。

NDTM的另一种解释是,每当遇到n个(n≥2)选择时, NDTM就把自身复制n个,让它们进行并行的计算。 由于具有任意多道并行计算的能力。

36. 什么是P类与NP类语言?什么是NP-完全性语言?

答:语言族P=﹛L|L是一个能在多项式时间内被一台DTM接受的语言﹜

NP=﹛L|L是一个能在多项式时间内被一台NDTM接受的语言﹜

37. 什么是NP-hard问题?什么是NP-完全性问题?引进NP-完全性的概念有什么意义?

答:NP-完全性语言定义1(狭义,Karp):称满足下述2条的语言L0是NP-C的:

1)L0∈NP; 2) ∀L∈NP,都有L≤pL0。

NP-完全性问题 :若某个判定问题进行编码后,所对应的语言L0是NP-C的, 则称该问题是NP-C的。 有些最优化问题(对应的编码ω∈L0)可以满足 NP-完全性定义的第2条要求:∀L∈NP,都有L≤p L0。 满足上述条件的问题被称为NP-hard问题。

如果存在一台DTM在多项式时间里接受某个NP-C语言,

则所有NP类语言均可找到DTM在多项式时间里接受,从而有P=NP。

如果某个NP类语言不存在DTM在多项式时间里接受(即P≠NP),

则所有NP-C语言都不存在DTM在多项式时间里接受,

即有NP-C∩P=Φ。

38. 设计近似算法时必须讨论哪几方面的问题?

答:该算法所得近似解和最优解之间的差距到底有多大。该近似算法的相对误差界有多大;该近似算法的相对误差有多大;绝对近似度和相对近似度。

39. 什么是算法A对于实例I的近似比、A的绝对近似比和渐进近似比?

答:算法A对于实例I的近似比(ratio factor) =RA(I)=max{A(I)/OPT(I),OPT(I)/A(I)}

由于是取max,故近似比总是大于等于1的。绝对近似比rA=Inf{RA(I)} 对一切 即算法A对于一切实例I的近似比的最小上界(相当于最大值)。渐进近似比rA=sup{r≥1| 存在正整数n0, 使得对于所有OPT(I)≥n0的实例,都有≤r} 即反映了近似比的收敛情况,它允许OPT(I)较小的实例的近似比大于rA。

40. 什么是多项式时间近似方案(PTAS)?什么是完全多项式时间近似方案(FPTAS,FPAS)?

答:多项式时间近似方案 (PTAS, Polynomial Time Approximation Scheme)

设ε是求解某类问题的多项式时间近似算法,ε>0也作为该算法的输入。如果对每一个给定的ε,的绝对近似比≤1+ε,则称A 是一个PTAS。完全多项式时间近似方案(FPTAS,FPAS, Fully Polynomial Time Approximation Scheme)如果一个PTAS 以某个二元多项式函数p(|I|,1/ε)为时间复杂度上界,则称ε是一个FPTAS。

41. NP-hard问题在PNP的假定之下,通常可以分成哪4类(举例)?

答:NP-hard问题在P≠NP的假定之下,可以分成4类:

1、 有FPTAS(e.g.Knapsack)

2、 有PTAS而没有FPTAS(e.g. k-Knapsack)

3、 没有PTAS,但有绝对近似比为常数的近似算法(Bin-Packing)

4、 没有绝对近似比为常数的近似算法(e.g. TSP)

42.什么是伪多项式时间的算法?如何用伪多项式时间的动态规划法求解(整数)背包问题?

答:定义:设实例I的输入规模为n,实例中的最大数为max(I), 若算法的时间复杂性以某个二元多项式p(n,max(I))为上界, 则称该算法是伪多项式时间的算法。

动态规划法。对0≤k≤n,0≤b≤B,设f(b)为:装前k件物品中若干件、且体积和不超过b时可得到的最大价值。  因此,f(B)就是该问题的最优解。     根据f(b)的定义可知子问题具有最优子结构性质。  另外,引入初值均为0的二维数组x,每一个数组元素x[k,b]记录:当体积限制为b时,uk是否被选中,1为被选中,0为未被选中。初始当k=0时,有(b)=0(0≤b≤B),此为递推计算的基础值。设对b∈[0,B],(b),(b),⋯,f(b)均已计算出来,此时需要对区间[0,B]中的整数b(即0≤b≤B),逐一求出(b)。考虑b与sk的关系。若b < sk,则对于体积限制b,物品uk根本不能装(太大了),

∴x[k,b]应为0(即此时不选物品uk);同时执行fk(b)←fk-1(b)。(实际执行时,只要对小于sk的b,执行fk (b)←fk-1 (b)。)若b≥sk,就要看把一些物品取出,再把物品uk放入,所得的总价值是否比不装物品uk(其总价值为fk-1 (b))时大。而装物品uk时,可获得的最大价值为fk-1 (b-sk)+ck。这里的fk-1 (b-sk)是:当体积限制不超过b-sk时,装前k-1件物品中的若干件,可得到的最大价值。若fk-1 (b-sk)+ck >(b),则物品uk应装入,即此时要执行x[k,b]←1,以及fk (b)←fk-1 (b-sk)+ck。否则应执行x[k,b]←0,以及fk (b)←fk-1 (b)。按上述方法,当执行到k=n,b=B时,最优解的值即为(B)。

这部分算法的时间复杂度为O(nB)。上述计算完毕之后,再根据x数组内容,找出应取哪几件物品。置初值b=B,循环从j=n开始,检查x[j,b]:若x[j,b]=0,则表示uj未被选中,故不做动作,直接执行j←j-1;若x[j,b]=1,则表示uj被选中,把j放入集合S中(S初始为空),然后执行b←b-sj以及j←j-1。循环一直执行到j=1的判断完成后为止。算法时间复杂度为O(n)。从而整个算法的时间复杂度为O(nB)。注意B与输入规模n无关,故nB不是输入规模的多项式函数。因此,算法是伪多项式时间的算法。

你可能感兴趣的:(c语言写流水作业调度问题算法)