第二章、递归与分治策略——算法设计与分析思维导图

 

 

 分治算法

一、二分查找

算法设计基本思想:将一数组元素进行排序,找出中间元素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。将问题分解成求更小的区域。利用规律将问题解决,最后得到问题的解。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值