《武汉理工大学算法设计题》由会员分享,可在线阅读,更多相关《武汉理工大学算法设计题(4页珍藏版)》请在金锄头文库上搜索。
1、9else if x Amid如果 x Amid,则 x 可能位于 low1if i = j与 mid 之间,2then10否则x可能位于mid与high之间311then high e mid - 14fmaxa A*i+;12else lowe mid + 15fmina A*i+;13614 retrun 07else if i = j-18then if AiAj一种二分检索的变形 BINSEARCH1。9thenBINSEARCH1(A,n,x,j)101low 囹 111fmaxa A*j+;2high 囹 n+112fmina A*i+3while low high134do14
2、else5156mid 囹(low + high) / 216fmaxa A*i+;7if (x rmax算法 2.5 直接找最大和最小元素25then fmaxa lmax;maxmin(A,n) 将A(1:n)中的最大元素置于max,最小元26else fmaxa rmax素置于 min/27if lmin rmin1max eA128then fmina rmin;2min eA1;29else fmina lmin;3for ie2 to n30fmin8 then return middoif max Aithen mineAi算法 2.3 二分检索给定一个按非降次序排列的元素数组A
3、(1:n),n$1,判断x是否出现。若是,置j,使得x=A(j),若非,j=0 BINSEARCH(A,n,x)i low ei2 high e nwhile lowhigh,数组A中没有找到x, 返回j=04 do56 /取处于 low 和 high 之间的中间值7 if x=Amid找到值为x的元素,mid即为其下标, 返回 mid8 用下面的语句代替 for 循环中的语句:if A(i)max then maXA(i)else if A(i) cu break;/物品i无法全部放入背包, 退出 for 循环;7 else yij1;8 cu jcu - wi;910 if iWn11 t
4、hen yi j cu/wi; /不能完全装入的物品的部分 装入量算法 3.4 带有限期和效益的单位时间的作业排序贪心算 法GreedyJob(int n , int d , int &J)d1,.,dn是期限值。n三1。作业已按p1三p22.pn被 排序。Ji是最优解中的第i个作业,1WiWk。终止时, dJi WdJi+1, 1WiVk1 kj1;2 d0j0;3 J0j0;4 J1j1;/首先将作业 1 插入第一个位置;5 for ito n 按p的非增次序依次考虑剩下的作业;6 do7 rjk;8 while dJr di and dJr工 r9 do/while 循环用来确定正在考虑
5、的作业可能要插入的位置;10 rjr - 1;11 12 if dJrWdi and di r/判断此作业是否可以插入 J;13 then14 for j j k to r+1 /j 是递减的15 do将第k到第r+1个作业依次后移一位以插 入新的作业;16 Jj + 1 j Jj;17 18 Jr + 1 j i; /将作业插入位置 r+1;19 k j k + 1;记入J的作业数加1;20 22 return k; /返回记入 J 中的作业数。算法JS所需要的总时间是O (sn)。由于sWn (s为包含 在解中的作业数),因此JS的最坏计算时间为O (n2)。算法 4.1 多段图的向前处理
6、算法FGRAPH(Elemtype E,int k, int n, Elemtype Pk)输入是按段的顺序给结点编号的,有n个结点的k段 图。E是边集,cij是边的成本。Pk是最小成本路 径/ 输入:多段图的顶点编号表,各顶点的边表和各边的成 本函数c(i,j)的表。输出:从s到t的一条最小成本路径上的各顶点以及成本 COST(l, s)。1 COST n0;2 for jn-1 to 1 by -1计算 COST j;3 do 设 r 是这样一个结点, 且使 cjr+ COSTr 取最小值;4 COSTj Gcjr+ COSTr;5 DjJ;6 /找一条最小成本路径;7 P 11; P k
7、n;8 for j2 to k-1找路径上的第j个结点。9 do 10 P jDP j-1;11 第3-6行的for循环的时间是(n+e),第9-11行的for循环 时间是 。总的计算时间在以内。算法 6.1 回溯的一般方法BackTrack(n)/这是对回溯法控制流程的抽象描述。每个解都在 Xn中生成,一个解一经确定就立即打印出。在 X1, .,Xk-1已被选定的情况下,R (X1, .,Xk-1)给 出Xk啲所有可能的取值。限界函数C (X1, .,Xk)判 断哪些元素Xk满足隐式约束条件1 k1 变量k用来记录树的层数,初始化为12 while k0 do34 if还剩有没检验过的Xk使
8、得5 Xk e R(X1,Xk-1) and C(X1,Xk)=true6 then if (X1,Xk)是一条抵达一答案结点的 路径7 then print (X1+,.,Xk+);8 虚k1; 910 else k眼1;/说明不剩没有检验的X(k)或 Ck(X(1).X(k)=false11 进入此过程时确定。的值已k-;=12工叫)J=m算法 6.2 递归回溯算法RBackTrack(k)/此算法是对回溯算法的抽象递归描述。进入算法时,解向量Xn的前k-1个分量X1,.Xk-1 已 赋值/while 满足下式的每个 X(k)Xk eR(X1,.,Xk-1)andC(X1+,.,Xk+)=
9、true doif(X1,.,Xk)是一条已抵达一答案 结点的路径then print(X1+,.,Xk+) ;RBackTrack(k+1)算法 6.4 可以放置一个新皇后吗?以下函数Place(k),用来判定将皇后k放在棋盘的第xk列 是否可行,如果皇后k可以放在第xk列,那么Place(k) 的返回值为真,否则返回值为假,显然,在进入该函数 前,前k-1皇后已经放置好,即xn已确定k-1个值。Place(int k)1 i - 1;设置i值;2 while i 04 do5 刈k - xk + 1;将第k行的皇后k后移一列;6 while xkW n and Place(k)=FALSE
10、确定皇后k的列数刈k;7 do xk-xk + 1;8 if xkWn9 then10 if k = n /n个皇后的位置都已经确定,输出;11 then for i - 1 to n12 do print(xi);13 else/n 个皇后的位置还没全确定,考虑下一 个皇后的位置;14 k - k + 1;15 xk - 0;16 /xkWn17 else /当前行皇后无位置放,将上一行的皇后的 位置重新安排;18 k - k- 1;回溯/19/while算法 6.6 子集和数问题的递归回溯算法SumOfSub(int s , int k , int r) 找W(1:n)中和数为M的所有子集。X(1),X(k-1)。这些W(j按非降次序排列。假定W(1)M,5生成左儿子。注意,由于Bk-1=true,