五大经典算法思想之分治策略

分治策略

一、分治策略的基本思想

  1. 将原始问题划分为规模较小的子问题。
  2. 迭代或者递归求解每一个子问题。
  3. 将子问题的解综合得到原问题的解。

注意:

  1. 子问题与原问题性质一致。
  2. 子问题相互独立求解。
  3. 迭代或递归停止时子问题直接求解。

二、二分查找

1、核心用法

算法核心用法:查找一个数x是否在一组数中,下面我们来看一段伪代码:

在这里插入图片描述

输入一个数组T,下标从a到b,输入一个数组x,若x在数组T中,输出下表j,否则输出0。

依据分治策略的基本思想,我们需要对T进行划分,使得问题规模变小,因为我们将T对半划分 (a+b)/2 向下取整,得到数组的中位数下标m,如果此时x正好是我们找到的中位数m,则输出下标m,如果x比中位数小,则转变为在前半个数组中查找,否则在后半个数组中查找,一直迭代到查找到数x,则输出对应下标,否则输出0。

2、设计思想

  1. 将数x与中位数进行比较,将原问题转化为规模减半的子问题,若x小于中位数,则子问题在前半个数组查找,否则在后半个数组中查找。
  2. 对子问题继续进行二分查找。
  3. 当子问题规模为1时,直接比较数(x)和T(m),相等则返回值m,否则返回0。

显然,二分查找是一种典型的采用分治策略设计思想的算法。

3、二分查找的时间复杂度分析

最好的情况下:只需进行一次查找就能得到我们想要的结果。

最坏的情况下:

w(n)=w[n/2]+1 可解为:w(n)=[logn]+1(n为log的下标)

三、归并排序

1.核心思想

归并排序:将一组无序的元素按照从小到大进行排序,下面我们来看一段伪代码:

在这里插入图片描述

首先将数组对半划分,归结为两个子数组之后进行排序,然后将两个子数组重复划分,排序,最后综合得到一个从小到大排序的数组。

2.设计思想

  1. 将原问题划分为规模为n/2的两个子问题。
  2. 继续划分,将原问题划分成规模为n/4的四个子问题,直到子问题规模为1时,划分结束。
  3. 从规模1到规模n/2,陆续归并排好序的两个子数组,归并一次数组扩大一倍,直到达到原数组规模。

3.归并排序的时间复杂度分析

最好情况数组本来就是按照顺序进行排列的,这时我们不需要进行排序。

w(1)=0

最坏情况下:

w(n)=2w(n/2)+n-1 可解为:w(n)=nlogn-(n+1)

四、总结

  1. 将原问题规约为规模小的子问题,子问题与原问题具有相同的性质。
  2. 子问题规模足够小时可直接求解。
  3. 算法可以递归实现也可以迭代实现。
  4. 可以使用递推方程式分析算法的时间复杂度。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇

)">
下一篇>>