Back-of-The-Envelope Calculation
封底估算,用于复杂度的分析
减而治之
sum(int A[],int n)
{
return (n<1)? 0: sum(A,n-1)+A[n-1];
}
T(n)=T(n-1)+O(1)
T(0)=O(1)
故T(n)=O(n)
数组倒置
void reverse(int * A,int lo,int hi)
{
if(lo<hi)
{
swap(A[lo],A[hi]);
reverse(A,lo+1,hi-1);
}
else
{
return;
}
}
问题规模的奇偶性不变
分而治之
数组求和:二分递归
sum(int A[],int lo,int hi) //区间范围A[lo,hi]
{
if(lo == hi) return A[lo];
int mi = (lo+hi)>>1;
return sum(A,lo,mi)+sum(A,mi+1,hi);
}
sum(A,0,n-1);
从数组区间A[lo,hi)中找出最大的两个整数A[x1]和A[x2]
元素比较的次数,要求尽可能小
方法一
void max(int A[],int lo,int hi,int &x1,int &x2)
{
for(x1 = lo,int i = lo+1;i<hi;i++)
{
if(A[x1]<A[i]) x1=i;
}
for(x2 = lo,int i = lo+1;i<x1;i++)
{
if(A[x2]<A[i])x2=i;
}
for(int i = x1+1;i<hi;i++)
{
if(A[x2]<A[i])x2 = i;
}
}
方法二
void max(int A[],int lo,int hi,int &x1,int &x2)
{
if(A[x1=lo]<A[x2=lo+1])swap(x1,x2);
for(int i = lo+2;i<hi;i++)
{
if(A[x2]<A[i])
if(A[x1]<A[x2=i])
swap(x1,x2);
}
}