第三章分治算法.PDFVIP

  • 8
  • 0
  • 约2.69万字
  • 约 17页
  • 2017-08-15 发布于上海
  • 举报
第三章分治算法

1 第三章 分 治 算 法 §1. 算法基本思想 考虑下面折半搜索算法 程序 3-1-1 折半搜索 templateclass T int BinarySearch(T a[], const T x, int n) {// 在 数 组 a[0:n-1] 中 搜 索 x , 数 组 中 的 元 素 满 足 a[0]=a[1] //= ···=a[n-1]。如果找到 x,则返回所在位置(数组元素的下标), //否则返回 –1 int left=0; int right=n-1; while (left=right){ int middle=(left+right)/2; if(x a[middle]) return middle; if(xa[middle]) left=middle+1; else right=middle – 1; } return –1; //未找到 x } while 的每次循环 (最后一次除外)都将以减半的比例缩小搜索范围,所以, 该循环在最坏的情况下需要执行Θ(log n) 次。由于每次循环需耗时Θ(1) ,因此在 最坏情况下,总的时间复杂性为Θ(log n) 。 折半搜索算法贯彻一个思想,即分治法。当人们要解决一个输入规模,比 如 n,很大的问题时,往往会想到将该问题分解。比如将这n 个输入分成 k 个不 同的子集。如果能得到 k 个不同的可独立求解的子问题,而且在求出这些子问题 的解之后,还可以找到适当的方法把它们的解合并成整个问题的解,那么复杂的 难以解决的问题就可以得到解决。这种将整个问题分解成若干个小问题来处理的 方法称为分治法。一般来说,被分解出来的子问题应与原问题具有相同的类型, 这样便于采用递归算法。如果得到的子问题相对来说还较大,则再用分治法,直 到产生出不用再分解就可求解的子问题为止。人们考虑和使用较多的是 k=2 的情 形,即将整个问题二分。以下用A[1:n]来表示 n 个输入,用 DiCo(p,q)表示处理 输入为 A[p:q]情况的问题。 2 分治法控制流程 DiCo (p,q) global n,A[1:n]; integer m,p,q; // 1≤p≤q≤n if Small(p,q) then return Sol(p,q); else m=Divide(p,q); // p≤mq return Combine(DiCo(p,m),DiCo(m+1,q)); end if end DiCo 这里,Small(p,q)是一个布尔值函数,用以判断输入规模为 q-p+1 的问题 是否小到无需进一步细分即可容易求解。若是,则调用能直接计算此规模下子问 题解的函数 Sol(p,q). 而 Divide(p,q)是分割函数,决定分割点,Combine(x,y) 是解的合成函数。如果假定所分成的两个问题的输入规模大致相等,则 DiCo 总 的计算时间可用下面的递归关系来估计: ( ) n ( ) g n 当输入规模 比较小时,直接求解运算Sol n 的用时 ⎧ ( ) T n ⎨ (3.1.1) 2 ( / 2) ( ) ( ) ⎩ T n +f n f n 是Combine用时 例 3.1.1 求 n 元数组中的最大和最小元素 最容易想到的

文档评论(0)

1亿VIP精品文档

相关文档