Devide and Conquer

分治算法——分而治之

分治算法的基本思想

将问题划分(devide)成多个子问题
递归的解决(conquer)每个子问题
将子问题的解合并(combine)为原问题的解

分治算法的使用条件

分治算法能解决的问题一般具有如下特征:
①问题的规模缩小到一定程度就可以很容易的解决
②问题可以分解为若干规模较小的相同问题
③利用分解出的子问题的解可以合并为原问题的解
④原问题分解出的各个子问题相互独立,子问题之间没有公共子问题

ps:如果子问题之间不相互独立,动态规划算法可以通过避免重复多余的计算很好的发挥优势(详见Dynamic programming)

分治算法的基本步骤

在这里插入图片描述
ps:平衡(balancing)子问题思想:使子问题规模大致相等,实践经验表明这样的划分几乎总是比子问题规模不等的划分更好

归并排序

用伪代码说明一下分治算法的思想:
在这里插入图片描述
复杂度分析
对于最好,最坏,平均情况的复杂度一样:
T(n) = 2T(n / 2) + cn
由Master Method:
T(n) = O(nlg n)

快速排序

在每一趟快速排序中,将比枢纽量小的数放在左边, 大的数放在右边,以枢纽为轴划分为两个子问题,递归解决。伪代码如下:
自己写的
书上的代码如下(《算法导论》):
书上的代码
图解:
在这里插入图片描述

复杂度分析
Best Case:O(nlg n)
正好二分的情况下:
T(n) = 2T(n / 2) + cn
由Master Method:
T(n) = O(nlg n)

Worst Case:O(n2)
对于快速排序,数列有序(顺序或逆序)是最坏的情况,因为每一趟排序只能使一个数有序:
T(n) = T(n - 1) + O(n)
T(n) = O(n2)

Average Case:O(nlg n)

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值