1.二分查找
有序队列 a[0],a[1],a[2],....a[n]
注:可以重载一个"<",来表示其他的
- a<b : a<b
- a>b : a>b
- a==b : !(a< b)&&!(b<a)
- a<=b : !(b<a)
设a[-]的类型是T,有"<"
template<class T>
int bisearch(T *a,int l,int r,const T &v)
{
if(r<l)
return -1;
//l<=r
int m = ( r + l ) / 2
if(v<a[m])
{
return bisearch(a,l,m-1,v);
}
if(a[m]>v)
{
return bisearch(a,m+1,r,v);
}
return m;
}
算法分析:
分+归并:工作量为0
最好情况:1次比较
最坏情况:O(logn)
2.大整数乘法
分治:ab = a1 b1* 10^n+(a1* b2+a2* b1)* 10^(n/2)+a2* b2
T(n) = 4T(n/2) = = n^2(没改进)
令 p = a1b1 , q = a2 b2 , r = (a1 + a2)* (b1 * b2)
a * b = p*10^n + ( r - p - q)*10^(n/2) + q
T(n) = 3T(n/2) = n(log2(3))<n2
补:二分查找的应用问题
struct TStudent
{
int id;
int age;
string name;
};
//由于bisearch中有"<",故必须对TStudent重载"<"
bool operator(const Tstudent & x,Tstudent & y)
{
//按id进行比较
return x.id<y.id;
}
int n = 50000;
TStudent *a = new TStudent[n];
for(int i = 0;i<n;i++)
{
a[i].id = ...;
a[i].new = ...;
a[]....
}
std::sort(a,0,n);
TStudent v = new int TStudent();
int pos = biSearch(a,0,n-1,v);
.....
delete[] a;//释放内存
3.大矩阵乘法
分治平均:
- C11 = A11B11+A12B21
- .....
- C22 =A21B12+A22B22
乘法-》P(n) = 8 P(n/2) = n^3
加法-》A(n) = 8A(n/2)+n^2
如何改进?
可改进, 改进后 7次n/2次矩阵乘法,但是加法次数增多