分析的原则——去粗取精
He caculated just like men breathe, as eagles sustain themselves in the air. Francois Arago
复杂度分析之级数求和
分析算法的单调性和确定性,是分析算法是否可行的重要方法
举例——求循环的复杂度
举例——封底估计
估计地球的半径:
举例——算法复杂度对于计算的影响
可见算法的改进对于问题的解决事何等的重要和威力无穷!!!
TIP:以后谈论空间复杂度,没有特殊说明,只考虑去除输入所占有空间之外所需要的空间
递归和迭代
思想:减而治之【Decrease and conquer】//想到哈佛的老师扯电话薄
为了求解一个规模较大的问题,可以将其划分为两个子问题:其中一个平凡,另一个规模缩减(且形式和原问题相似)
然后,分别求解子问题
由子问题的解,得到原问题的解
例子——数组求和
void sum(int A[], int n)
{
return (n<1)>?0:sum(A,n-1)+A[n-1];
}
1 递归跟踪(recurision trace )
但是,适用于较为简明递归模式
2 递推方程
T(N)-N=T(N-1)-(N-1)
例子——数组倒置问题
【递归版】
void reverse(int *A, int lo, int hi)
if(lo
【迭代原始版】
next:
if( lo<hi)
{
swap( A[lo], A[hi] );
lo++;
hi--;
goto next;
}
【迭代精简版】
while( lo<hi) swap( A[lo++], A[hi--] );
宽度,每次减少两个,奇偶性不变
最小的奇数1
最小的偶数0
算法策略之分而治之【Devide and conquer】
求解一个大规模的问题时,可以将其划分为若干个(通常为两个)子问题,规模大体上相当
分别求解子问题
有子问题的解得到原问题的解
例子——二分递归法来进行,数组求和
void sum( int A[], int lo, int hi)//区间为(lo, hi)
{
if(hi==lo) return A[lo];
int mi=(lo+hi)>>1;//中间值
return m
}