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;
    }
    
  • 相关阅读:
    vue.js 条件与循环
    vue.js 声明式渲染
    数据库设计范式?
    用户购物车,实现添加商品的功能!
    用户购物车功能的实现。
    初始ajax技术
    SQL语句中 INNER JOIN的用法!
    商城 用户登录、注册、注销,购物车。
    EL和 JSTL? 在JSP中简化 java代码的写法!
    小数点后保留2位小数的正则表达式
  • 原文地址:https://www.cnblogs.com/Alex3O/p/13275619.html
Copyright © 2011-2022 走看看