数据结构引例

用递归与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;
}
posted @ 2020-07-09 19:34  小哑师兄  阅读(195)  评论(0编辑  收藏  举报