zoukankan      html  css  js  c++  java
  • 数据结构引例

    用递归与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;
    }
    
  • 相关阅读:
    docker 部署aps.net MVC到windows容器
    docker 搭建私有仓库 harbor
    解决关于:Oracle数据库 插入数据中文乱码 显示问号???
    ionic cordova build android error: commamd failed with exit code eacces
    cordova build android Command failed with exit code EACCES
    Xcode 10 iOS12 "A valid provisioning profile for this executable was not found
    使用remix发布部署 发币 智能合约
    区块链: 编译发布智能合约
    mac 下常用命令备忘录
    JQuery fullCalendar 时间差 排序获取距当前最近的时间。
  • 原文地址:https://www.cnblogs.com/Alex3O/p/13275619.html
Copyright © 2011-2022 走看看