数据结构引例
用递归与for打印数字
// for循环代码
void PrintN(int n){
int i;
for(i=0;i<=n;i++){
printf("%d ",i);
}
}
//递归算法
void PrintN(int n){
if(n){
PrintN(n-1);
printf("%d ",n);
}
}
- 当输入的n是10 1000 10000等比较小的数时,并不能直观的从程序运行来看出运行效率,当n=1000000时 for循环仍旧可以打印出数据,只不过打印的比较慢,但递归函数直接跑飞
- 递归代码简便易读,但是它对空间的消耗很大,空间 时间 效率 好的代码应该综合考虑这三个条件
- 解决问题方法的效率跟空间的利用效率有关
函数运行时间测试模板
#include<time.h>
clock_t start,stop;
//clock_t 是clock()函数返回的变量类型
double duration;
//记录被测函数运行时间,以秒为单位
int main(){
//不在测试范围内的准备工作写在clock()之前
start=clock();
MyFunction();
stop=clock();
duration=((double)(stop-start))/CLK_TCK;
//其他不在测试范围的处理写在后面
}
多项式问题
double f1(int n,double a[],double x){
int i;
double p=a[0];
for(i=1;i<=n;i++){
p+=(a[i]*pow(x,i);
}
return p;
阿西吧 求多项式我肯定会这样写函数 果然傻瓜
double f2(int n,double a[],double x){
int i;
double p=a[n];
for(i=n;i>0;i--){
p=a[i-1]+x*p;
}
return p;
什么是数据结构
- 数据对象在计算机中的组织方式,逻辑结构,物理存储结构
一对一,线性结构
一对多,树结构 - 数据对象必定与一系列夹在其上的操作相关联
- 完成这些操作所用的方法就是算法
- 算法的时间复杂度,空间复杂度,最坏情况复杂度,平均复杂度
复杂度的渐进表示法
最大子列和问题
复杂度为n^3算法
int MaxSubseqSum1(int A[],int N){
int ThisSum,MaxSum=0;
int i,j,k;
for(i=0;i<N;i++){
for(j=i;j<N;j++){
ThisSum=0;
for(k=i;k<=j;k++)
ThisSum +=A[k];
if(ThisSum>MaxSum)
MaxSum=ThisSum;
}
}
return MaxSum;
}
复杂度为n^2
int MaxSubseqSum2(int A[],int N){
int ThisSum,MaxSum=0;
int i,j;
for(i=0;i<N;i++){
ThisSum=0;
for(j=i;j<N;j++){
ThisSum+=A[j];
if(ThisSum>MaxSum)
MaxSum=ThisSum;
}
}
return MaxSum;
}
复杂度为n的在线处理
int MaxSubseqSum4(int A[],int N){
int ThisSum,MaxSum;
int i;
ThisSum=MaxSum=0;
for(i=0;i<N;i++){
ThisSum+=A[i];//向右累加
if(ThisSum>MaxSum)
MaxSum=ThisSum;//发现更大和则更新当前结果
else if(ThisSum<0)//如果当前结果为负
ThisSum=0; //则不能使后面的部分和增大 抛弃掉
}
return MaxSum;
}