分治法
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
- 分 把x与数组的中间元素相比较
- 治 因为可以确定x在哪个数组中,所以只在一个子数组中递归
- 合 没有计算量
时间复杂度
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)