• 数据结构 算法


    #include<iostream>
    using namespace std;
    
    /*
    算法
    
    算法概念
    算法是特定问题求解步骤的描述
    在计算机中表现为指令的有限序列
    算法是独立存在的一种解决问题的方法和思想。
    对于算法而言,语言并不重要,重要的是思想。
    
    算法和数据结构区别
    数据结构只是静态的描述了数据元素之间的关系
    高效的程序需要在数据结构的基础上设计和选择算法
    程序=数据结构+算法
    
    总结:
    算法是为了解决实际问题而设计的
    数据结构是算法需要处理的问题载体
    数据结构与算法相辅相成
    
    算法特性
    1.输入
    算法具有0个或多个输入
    2.输出
    算法至少有1个或多个输出
    3.有穷性
    算法在有限的步骤之后会自动结束而不会无限循环
    4.确定性
    算法中的每一步都有确定的含义,不会出现二义性
    5.可行性
    算法的每一步都是可行的
    
    算法效率的度量
    影响算法效率的主要因素
    1.算法采用的策略和方法
    2.问题的输入规模
    3.编译器所产生的代码
    4.计算机执行速度
    
    大O表示法
    算法效率严重依赖于操作(Operation)数量
    在判断时首先关注操作数量的最高次项
    操作数量的估算可以作为时间复杂度的估算
    
    在一台计算机上,cpu执行每个操作的时间是确定的
    请看以下程序
    */
    
    //时间复杂度2n+4  空间复杂度4n+8
    long sum1(int n)
    {
        long ret = 0;//操作1次  占4个字节
        int* array = (int*)malloc(n * sizeof(int));//操作1次 占4*n个字节
        int i = 0;//操作1次  占4个字节
    
        for (i = 0; i<n; i++)//操作n次   在cpu中运算,不占用内存
        {
            array[i] = i + 1;
        }
    
        for (i = 0; i<n; i++)//操作n次 在cpu中运算,不占用内存
        {
            ret += array[i];
        }
    
        free(array);//操作1次 不占用内存
    
        return ret;
    }
    
    //时间复杂度n+2   空间复杂度8
    long sum2(int n)
    {
        long ret = 0;//操作1次  占4个字节
        int i = 0;//操作1次 占4个字节
    
        for (i = 1; i <= n; i++)//操作n次
        {
            ret += i;
        }
    
        return ret;
    }
    
    //时间复杂度 2 空间复杂度4
    long sum3(int n)
    {
        long ret = 0;//操作1次 占4个字节
    
        if (n > 0)//if语句只会执行一个分支
        {
            ret = (1 + n) * n / 2;//操作1次
        }
    
        return ret;
    }
    
    /*
    注意1:判断一个算法的效率时,往往只需要关注操作数量的最高次项,其它次要项和常数项可以忽略。
    注意2:在没有特殊说明时,我们所分析的算法的时间复杂度都是指最坏时间复杂度。
    对于sum1()--2n+4  说明sunm1的时间复杂度跟n值有关,n值越大  复杂度越大   用大O表示法写成 O(2n+4)-->O(n)
    对于sum2()--n+2  说明sunm2的时间复杂度跟n值有关,n值越大  复杂度越大  用大O表示法写成 O(n+2)-->O(n)
    对于sum2()--2  说明sunm2的时间复杂度跟n值无关,是一个常量值 用大O表示法写成 O(2)-->O(1)
    
    空间复杂度
    对于sum1()--4n+8  说明sunm1的时间复杂度跟n值有关,n值越大  复杂度越大   用大O表示法写成 O(4n+8)-->O(n)
    对于sum2()--8  说明sunm2的时间复杂度跟n值无关,是一个常量值 用大O表示法写成 O(8)-->O(1)
    对于sum2()--4  说明sunm2的时间复杂度跟n值无关,是一个常量值 用大O表示法写成 O(2)-->O(1)
    
    空间与时间的策略
    多数情况下,算法执行时所用的时间更令人关注
    如果有必要,可以通过增加空间复杂度来降低时间复杂度
    同理,也可以通过增加时间复杂度来降低空间复杂度
    
    */
    
    int main()
    {
        printf("%d
    ", sum1(100));
        printf("%d
    ", sum2(100));
        printf("%d
    ", sum3(100));
    
        return 0;
    }

     

  • 相关阅读:
    多Web服务器之间共享Session的解决方案
    在WinForm中使用CacheDependency来监视文件
    使用WCF的一些问题
    IIS6.0配置注意
    匿名委托注册事件的触发
    关于datawindow does not have update capability
    EF自关联建模详解
    NHiberante3.2版注意
    EF做数据绑定时一些神奇问题
    EF 中不同会话上下文的对象,不能互设为对方的导航属性值
  • 原文地址:https://www.cnblogs.com/zhanggaofeng/p/5672851.html
Copyright © 2020-2023  润新知