(原创)分治策略教程

(原创)分析分治策略


分治策略

定义

为了解决一个问题,算法一次或者多次递归的调用其自身已解决若干子问题。

也就是符合分治法思想: 将原问题分解为几个规模较小但类似于原问题的子问题,递归地求解这些子问题,然后再合并这些子问题的解来建立原问题的解。

执行步骤

分解:将原问题分为若干子问题,这些子问题是原问题的规模较小的实例。
解决:这些子问题递归地求解各自的子问题,但是如果子子问题足够小,则直接求解。
合并:将这些子问题的解合并为原问题的解。

经典案例

归并排序算法:

实现步骤:
分解:分解待排序的n个元素的序列形成各具有n/2个元素的子序列。
解决:使用归并排序递归地排序两个子序列。
合并:合并两个已排序的子序列以产生排序序列。

分析分治算法之归并排序算法

时间复杂度

归并排序是一种分治算法,它将一个大问题分解成两个小问题,然后递归地解决这些小问题,最后将小问题的解合并成大问题的解。在归并排序中,每次递归都将数组分成两个大致相等的部分,直到每个部分只有一个元素。

归并排序的递归树高度可以通过以下步骤来计算:

  1. 分解步骤:每次递归,数组被分成两个相等(或几乎相等)的部分。如果数组的长度是 ,那么第一次分解后,我们得到两个长度为 的子数组。下一次递归,每个子数组又被分成两个长度为 的子数组,以此类推。

  2. 递归深度:这个分解过程一直持续到子数组的长度为1。因此,我们需要确定需要多少次分解才能将长度为 的数组分解成长度为1的子数组。这可以通过解方程 来找到,其中 是递归的深度。

  3. 解方程:解方程 得到 。取两边的对数(以2为底),我们得到 。这就是递归树的高度。

因此,归并排序的递归树的高度是 ,通常简写为

这个高度是归并排序时间复杂度分析中的一个关键因素。归并排序的时间复杂度是 ,其中 是数组的长度, 是递归树的高度。

进入正题

递归式

数学定义:一个等式或者不等式,通过一个更小的输入上的函数值来描述一个函数。
作用:描述分治算法的运行时间。

解递归式的三种方法

代入法

猜测一个界,用数学归纳法证明。

递归树法

将递归式转换为一棵树,其节点表示不同层次的递归调用产生的代价。然后利用边界和技术来求解递归式。

主方法

可以求解形如如下公式的递归式的界:。其中,为一个给定的函数。

  • a表示生成了a个子问题。
  • b表示每个子问题的规模是原问题的1/b。
  • f(n)表示分解和合并步骤所需要花费的总时间。

递归式技术细节

总的来说,我们会忽略两种技术细节。第一种忽略递归式声明和求解的细节。以归并排序算法为例,如果n为奇数时,n/2不是整数,所以我们要对两个子问题的规模分别向下取整和向上取整。第二种忽略边界条件,例如对于一个常量规模的输入,算法的运行时间为常量,因此对于足够小的n,表示运行时间的算法递归式一般为。所以出于方便我们往往忽略递归式的边界条件。这些细节对结果的影响通常不大,但是我们需要知道在什么情况下会影响不大。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值