1.算法入门系列之分治法

1. 递归

递归是一种程序设计技术, 一般可以理解为函数或方法不停的调用自身,最终形成多种嵌套调用的形式。

递归的三要素

  1. 递归终止条件 递归需要一个明确的临界点,程序一旦到达了这个临界点,就不用继续往下递归, 防止无限递归。

  2. 终止处理办法在递归的临界点对应一种简单的情景,这种情景下,应当直接给出问题的解决方案。

  3. 递归处理方法递归问题必须可以分解为若干个规模较小、与原问题形式相同 的子问题,这些子问题可以用相同的思路来解决,并且合并得到原问题答案。

递归调用过程
下面以求阶乘说明递归调用过程:
在这里插入图片描述
在这里插入图片描述

2. 分治法

分治算法的核心思想是将原问题划分为n个规模较小而结构与原问题相似的子问题;递归的解决这些子问题,然后再合并其结果,就得到原问题的解。
分治法分为三个阶段:

  1. 分解:将原问题分解为一系列子问题,如果子问题的规模任不够小则再继续划分,如此递归下去,直到子问题规模足够小很容易求出解为止。
  2. 解决:求解规模足够小的子问题。
  3. 合并:将求出的小规模的问题合并为一个更大规模问题的解,自底向上逐步求出原问题的解。
    在这里插入图片描述

分治算法框架程序:
在这里插入图片描述

设计划分策略,把原问题P划分为k个规模较小的子问题,这是分治法的关键步骤,一般遵循以下原则:

  1. 平衡子问题原则:分割出的k个子问题规模最好大致相当。
  2. 独立子问题原则:分割出的k个子问题重叠越少越好,最好k个子问题相互独立,不存在重叠子问题。
3. Master定理
  1. master定理
    分治算法的时间复杂度分析一般需要借助Master定理。
    T ( n ) = a T ( n / b ) + f ( n ) T(n) = aT(n / b) + f(n) T(n)=aT(n/b)+f(n)
    其中:
  • n n n是问题规模大小;

  • a a a是原问题的子问题个数;

  • n / b n / b n/b是每个子问题的大小,这里假设每个子问题有相同的规模大小;

  • f ( n ) f(n) f(n)是将原问题分解成子问题和将子问题的解合并成原问题的解的时间。

    对上面的式子进行分析,得到三种情况:
    在这里插入图片描述
    Master的三种情况可以简要记忆为:

    • 若函数 n l o g b a > f ( n ) n^{log_{b}^{a}}>f(n) nlogba>f(n) ,如情况1,则时间复杂度 T ( n ) = O ( n l o g b a ) T(n)=O(n^{log_{b}^{a}}) T(n)=O(nlogba)
    • 若函数 n l o g b a < f ( n ) n^{log_{b}^{a}}<f(n) nlogba<f(n) ,如情况3,则时间复杂度 T ( n ) = O ( f ( n ) ) T(n)=O(f(n)) T(n)=O(f(n))
    • 若函数 n l o g b a = f ( n ) n^{log_{b}^{a}}=f(n) nlogba=f(n) ,如情况2,则时间复杂度 T ( n ) = O ( n l o g b a l o g ( n ) ) T(n)=O(n^{log_{b}^{a}}log(n)) T(n)=O(nlogbalog(n))
  1. Master定理应用
    • 二分查找
      T ( n ) = T ( n / 2 ) + O ( 1 ) T(n) =T(n/2) + O(1) T(n)=T(n/2)+O(1)
      分析: a = 1 , b = 2 , f ( n ) = O ( 1 ) , 由此可得: n l o g b a = 0 = O ( 1 ) , 所以 T ( n ) = n l o g b a l o g ( n ) = l o g ( n ) a = 1, b = 2, f(n) = O(1), 由此可得:n^{log_{b}^{a}} = 0 = O(1),所以T(n) = n^{log_{b}^{a}}log(n) = log(n) a=1,b=2,f(n)=O(1),由此可得:nlogba=0=O(1),所以T(n)=nlogbalog(n)=log(n)

    • 归并排序
      T ( n ) = 2 T ( n / 2 ) + O ( n ) T(n) = 2T(n/2) + O(n) T(n)=2T(n/2)+O(n)
      分析: a = 2 , b = 2 , f ( n ) = O ( n ) ,由此可得: n l o g b a = n = O ( n ) , 所以 T ( n ) = n l o g ( n ) a = 2, b = 2, f(n) = O(n),由此可得:n^{log_{b}^{a}} = n = O(n), 所以T(n) = nlog(n) a=2,b=2,f(n)=O(n),由此可得:nlogba=n=O(n),所以T(n)=nlog(n)

    • 二叉树遍历
      T ( n ) = 2 T ( n / 2 ) + O ( 1 ) T(n) = 2T(n/2) + O(1) T(n)=2T(n/2)+O(1)
      分析: a = 2 , b = 2 , f ( n ) = O ( 1 ) 由此可得: n l o g b a = n > O ( 1 ) ,所以 T ( n ) = O ( n ) a = 2, b = 2, f(n) = O(1)由此可得:n^{log_{b}^{a}} = n > O(1),所以T(n)=O(n) a=2,b=2,f(n)=O(1)由此可得:nlogba=n>O(1),所以T(n)=O(n)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值