zoukankan      html  css  js  c++  java
  • 算法的时间复杂度和空间复杂度(C语言版)

    //逐步递增型爱你
    #include <stdio.h> void loveYou(int n){//n为问题的规模 int i=1;//爱你的程度 1次 while(i<=n){//n+1次 i++;//每次加1 n次 printf("I love you%d ",i);//n次 内层循环执行了n*n次 } printf("I love you more than %d ",n);//1次 } int main(){ loveYou(10); return 0; }//T(n)=3n+3 时间开销—基本运算的频度 时间复杂度n

    代码运行:

    问题1:是否可以忽略表达式某些部分?

      我们可以直接保留时间开销最大的那一项,也就是最高阶的那一项,在最高阶的那项里,常数系数也可以忽略(都变为1),只关注最高阶的数量级即可。

    Tn=O(f(n))——大O表示同阶<<==>>当n-->无穷的时候,Tn的精确表达式/f(n)=k(用数学思维来描述),即二者之比皆为常数。

    a)加法规则 T(n)=T1(n)+T2(n)=O(f(n))+O(g(n))=O(max(f(n),g(n))) 多项相加,只保留最高阶的项,且系数变为1

    b)乘法规则 T(n)=T1(n)*T2(n)=O(f(n))*O(g(n))=O(f(n)*g(n)) 多项相乘,都保留

    问题2:如果有好几千行代码?按照这种方法需要一行一行数? 

    结论1:顺序执行的代码指挥影响常数项,可以忽略。

    结论2:只需要挑循环中的一个基本操作分析它的执行次数与n的关系即可。

    结论3:如果有多层嵌套循环,只需关注最深层循环循环了几次。

    算法复杂度大小:

    O(1)<O(log2n)<O(n)<O(nog2n)<O(n2)<O(n3)<O(2n)<O(n!)<O(nn)

    口诀==>常对幂指阶

    算法的空间复杂度:

    空间复杂度:空间开销与问题规模n之间的关系

      放在内存后的程序代码不是我们看到的高级语言的代码,而是经过编译后形成的相应指令。放入内存后,CPU开始运行,先传入参数n和局部变量i(此时一共需要8个字节去存放数据),其实可能还有别的参数什么的,但是道理都是类似的。

      不管问题规模n怎么变化,算法在执行的过程中,他所需要的内存空间大小都是固定不变的常数值,空间复杂度都是常数阶。

           空间复杂度都是常数阶的算法,可以称算法原地工作(算法所需内存空间为常量)。

    void test(int n){
    int flag[n];
    int i;
    }
    //假设一个变量占4B,则所需内存空间为4n+8 存放参数n(4个字节) int型数组占4n i又占4个字节==>S(n)=O(n)=n
    //空间复杂度只需要关注存储空间大小,与问题规模相关的变量

  • 相关阅读:
    Ghost Button制作教程及设计趋势分析
    onhashchange事件--司徒正美
    window.location.hash属性介绍
    优质UI的7条准则(一)
    当在浏览器地址栏输入一个网址的时候,究竟发生了什么?
    全球最快的JS模板引擎
    眨眼登录表单
    DIV+CSS规范命名
    es6--export,import
    es6--class
  • 原文地址:https://www.cnblogs.com/SpringChuXin/p/14778364.html
Copyright © 2011-2022 走看看