【数据结构】笔记(3)——算法分析

分析的原则——去粗取精

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 
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值