分治算法
一、二分查找
算法设计基本思想:将一数组元素进行排序,找出中间元素mid,将数组分为两个子集。与mid进行比较,若相等则返回,如果小于mid则在小的集合中找,反之则在大的集合中找。直到找到为止,否则返回false。
时间复杂度为O(log n)。
二、大整数乘法
算法设计基本思想:将每个大整数串分成等分成两个长度近似的字串,例如A分成A1和A2,Y分成B1和B2。则A * B = (A1 * 10^(n/2) + A2)(B1 *10^(m/2) + B2)
化简得 A1B1 * 10^n + (A1B2 + A2B1)*10^(n/2) + A2B2
XY = A1B1 * 10^n + ((A1-A2)(B2-B1) + A1B1 + A2B2) * 10^(n/2) + A2B2
时间复杂度为:
T(n) = 3T(n / 2) + O(n)
通过主定理可算出T(n) = O(n^1.59)。
三、Strassen矩阵乘法
算法设计基本思想:
首先算出7个矩阵:
Strassen矩阵乘法用了7次对于n/2阶矩阵乘积的递归调用和18次n/2阶矩阵的加减运算。时间复杂度优化到O(n^2.81)。
四、棋盘覆盖
算法设计基本思想:
当k>0时,将棋盘分割为4个子棋盘。特殊方格必位于4个较小子棋盘之一中,其余3个子棋盘无特殊方格。为了将这3个无特殊方格的子棋盘转化为特殊棋盘,可以用一个L型骨牌覆盖这3个较小棋盘的会合处,这3个子棋盘上被L型骨牌覆盖的方格就成为该棋盘上的特殊方格,从而将原问题转化为4个较小规模的相同覆盖问题。
时间复杂度T(k)=4T(k-1)+O(1)。
五、求第k小数
算法设计基本思想:取序列M的中位数x,用x作为基准元素,对原n个元素进行划分,i为分裂点
,若k<=j,则用前部分子问题递归求第k小元素;若k>j,则用后部分子问题求第k-i小元素。
j为前部分子问题元素的个数。
时间复杂度为O(n)。
六、循环日程表
算法设计基本思想:
经过观察发现LT、RB,RT、LB元素相同,LT、LB元素相差n/2。将问题分解成求更小的区域。利用规律将问题解决,最后得到问题的解。