zoukankan      html  css  js  c++  java
  • 第1课 算法的时间复杂度

    判断一个算法的效率时,操作数量中常数项和其他次要项常常可以忽略,只需要关注最高阶项就能得出结论。(这只是定性的比较)

    问题:如何用符号定性的判断算法的效率?

    算法的复杂度
    -时间复杂度
      算法运行后对时间需求量的定性描述
    -空间复杂度
      算法运行后对空间需求量的定性描述

    注意:
    数据结构课程重点关注的是算法的效率问题,因此,整个课程会集中于讨论算法的时间复杂度,但其使用的方法完全可以用于空间复杂度的判断

    大O表示法
    -算法效率严重依赖于操作(operation)数量
    -操作数量的估算可以作为时间复杂度的估算
    -在判断时首先关注操作数量的最高次项
    O(5) = O(1)
    O(2n+1) = O(2n) = O(n)
    O(n*n + n + 1) = o(n*n)
    O(3*n*n*n +1 )= O(3*n*n*n) =O(n*n*n)

    常见的时间复杂度

    线性阶时间复杂度:O(n)
    for(int i=0; i<n; i++)
    {
      //复杂度为O(1)的程序语句
    }
    循环次数:n

    对数阶时间复杂度:O(logn)
    int i =1;
    while(i<n)
    {
      //复杂度为O(1)的程序语句
      i*= 2
    }
    循环次数:log2n(这个地方是以2为底哦)

    平方阶时间复杂度:O(n*n)
    for(int i=0; i<n; i++)
    {
      for(int j=0; j<n; j++)
      {
        //复杂度为O(1)的程序语句
      }
    }
    循环次数:n*n

    时间复杂度计算练习一
    下面代码的时间复杂度是什么?
    for(int i=0; i<n; i++)
    {
      for(int j=i; j<n; j++)
      {
        //复杂度为O(1)的程序语句
      }
    }

    时间复杂度计算练习二

    函数func()的时间复杂度是什么?
    void func(int n)
    {
      int i =0;
      while(i< n)
      {
        t(n);
        i++;
      }
    }

    void t(int n)
    {
      int i=0;
      while(i<n)
      {
        cout << i <<endl;
      }
    }

    时间复杂度计算练习三

    函数test()的时间复杂度是什么?
    void test(int n)
    {
      t(n);
      for(int i=0; i<n; i++)
      {
        t(i);
      }

      for(int i=0; i<n; i++)
      {
        for(int j=i; j<n; j++)
          t(i);
      }
    }

    小结:
    时间复杂度是算法运行时对于时间的需求量
    大O表示法用于描述算法的时间复杂度
    大O表示法只关注操作数量的最高次项
    常见的时间复杂度为:线性阶,平方阶和对数阶

  • 相关阅读:
    安装maven报错及解决
    Servlet包导入
    理解SQL SERVER的逻辑读,预读和物理读以及索引
    第六章(函数)编程题二
    第六章(函数)编程题一
    第五章(使用对象) 编程题一
    第三章(循环) 编程题 4
    第四章(数组) 编程题 1
    第三章(循环) 编程题 3
    低功耗蓝牙 ATT/GATT/Service/Characteristic 规格解读
  • 原文地址:https://www.cnblogs.com/-glb/p/11878232.html
Copyright © 2011-2022 走看看