算法导论 第三节 分治法

分治法


1 分 把一个大问题分成若干个小问题 即原问题的n变小
2 治 递归的解决每一个子问题,然后把这些子问题的解合并成整个大问题的解

归并排序
1. 一分为二
2. 递归的对每一个子数组进行排序
3. 合并(线性的n时间内就可以完成)

归并排序的时间复杂度

每一个符合分治策略的算法,几乎都有相似形式的递归出现

用主方法计算归并排序的时间复杂度
T(n)=2T(n/2)+θ(n)
用主方法
f(n) = θ(n)
logba = log22 = 1
1 = logba
k=0
故为第二种情况
可得T(n)=θ(nlogn)

二分查找算法

设某个元素为x,你需要在一个已排序的数组中找到这个x

  1. 分 把x与数组的中间元素相比较
  2. 治 因为可以确定x在哪个数组中,所以只在一个子数组中递归
  3. 合 没有计算量

时间复杂度

T(n) = T(n/2)+θ(1),log21 =0,f(n) = θ(1),为第二种情况,k=0,故T(n) = θ(logn)

乘法问题

给定一个数x,实数或浮点数,然后再给定一个正整数n>=0,计算x^n
1. 朴素算法
x*x*x*x*x*x*x*x*x*x……*x = x^n
做n-1次乘法
T(n) = θ(n)
2. 分治法

当n为偶数 x^n = x^(n/2)*x^(n/2)
当n为奇数 x^n = x^(n/2)*x^(n/2)*x
T(n) = T(n/2)+θ(1)=θ(logn)

斐波那契数列

F0=0,F1=1,Fn=Fn-1+Fn-2(n>=2,n∈N*)

递归算法

Time Ω(φ^n),φ=(√5-1)/2

自下而上的递归

F0,F1,F2……FN
Time θ(n)

朴素平方递推式

Fn = φ^n/√5 (不能实现)
根据矩阵
(F(n+1) Fn)= (1 1)^n
(Fn F(n-1))…(1 0)…..=>θ(logn)
归纳法

矩阵乘法

分治法
斯特拉森算法(Strassen)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值