1.算法时间复杂度的定义:
在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随n的变化情况并确定T(n)的数量级。算法的时间复杂度,也就是算法的时间量度,记作:T(n)= O(f(n))。它表示随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐近时间复杂度,简称为时间复杂度。其中f(n)是问题规模n的某个函数。
用大写O()来体现算法时间复杂度的记法,我们称之为大O记法。
2.推导大O阶方法
  • 用常数1取代运行时间中的所有加法常数。
  • 在修改后的运行次数函数中,只保留最高阶项。
  • 如果最高阶项存在且不是1,则去除与这个项相乘的常数。
  • 得到的最后结果就是大O阶。

常数阶
先举了例子,如下所示。

1 int sum = 0,n = 100; //执行一次
2 sum = (1+n)*n/2; //执行一次
3 sum = (1+n)*n/2; //执行二次
4 sum = (1+n)*n/2; //执行三次
5 sum = (1+n)*n/2; //执行四次
6 printf(sum); //执行一次 

上面算法的运行的次数的函数为f(n)=3,根据推导大O阶的规则1,我们需要将常数3改为1,则这个算法的时间复杂度为O(1)。如果sum = (1+n)*n/2这条语句再执行10遍,因为这与问题大小n的值并没有关系,所以这个算法的时间复杂度仍旧是O(1),我们可以称之为常数阶。

线性阶
线性阶主要要分析循环结构的运行情况,如下所示。

1 for(int i=0;i<n;i++){
2 //时间复杂度为O(1)的算法
3 ...
4 }

上面算法循环体中的代码执行了n次,因此时间复杂度为O(n)。

对数阶
接着看如下代码:

1 int number=1;
2 while(number<n){
3 number=number*2;
4 //时间复杂度为O(1)的算法
5 ...
6 }

可以看出上面的代码,随着number每次乘以2后,都会越来越接近n,当number不小于n时就会退出循环。假设循环的次数为X,则由2^x=n得出x=log₂n,因此得出这个算法的时间复杂度为O(logn)。

平方阶
下面的代码是循环嵌套:

1  for(int i=0;i<n;i++){
2       for(int j=0;j<n;i++){
3          //复杂度为O(1)的算法
4          ...
5       }
6   }

内层循环的时间复杂度在讲到线性阶时就已经得知是O(n),现在经过外层循环n次,那么这段算法的时间复杂度则为O(n²)。

其他常见复杂度

除了常数阶、线性阶、平方阶、对数阶,还有如下时间复杂度:
f(n)=nlogn时,时间复杂度为O(nlogn),可以称为nlogn阶。
f(n)=n³时,时间复杂度为O(n³),可以称为立方阶。
f(n)=2ⁿ时,时间复杂度为O(2ⁿ),可以称为指数阶。
f(n)=n!时,时间复杂度为O(n!),可以称为阶乘阶。
f(n)=(√n时,时间复杂度为O(√n),可以称为平方根阶。

一个进阶实例:

1 int num1, num2;
2 for(int i=0; i<n; i++){
3      num1 += 1;
4      for(int j=1; j<=n; j++){
5          num2 += num1;
6      }
7 } 

分析:
语句int num1, num2;的频度为1;
语句i=0;的频度为1;
语句i<n; i++; num1+=1; j=1; 的频度为n;
语句j<=n; j++; num2+=num1;的频度为n*n;
T(n) = 2 + 4n + 3n*n

所以时间复杂度是:n^2

 

转载于:https://www.cnblogs.com/Da4er/p/11174106.html

记录学习——算法时间复杂度求法相关推荐

  1. LeetCode0:学习算法必备知识:时间复杂度与空间复杂度的计算

    算法(Algorithm)是指用来操作数据.解决程序问题的一组方法.算法是大厂.外企面试的必备项,也是每个高级程序员的必备技能.针对同一问题,可以有很多种算法来解决,但不同的算法在效率和占用存储空间上 ...

  2. 集成学习-Boosting集成学习算法LightGBM

    在2017年年1月微软在GitHub的上开源了一个新的升压工具LightGBM(Light Gradient Boosting Machine ).它是一种优秀的机器学习算法框架,与XGBoost算法 ...

  3. fifo算法模拟_我是怎样学习算法的?(V1.0)

    我相信很多人都是因为找工作才去看数据结构与算法,我自己也是出于这个目的.我自己在学习数据结构和算法上走了很多弯路,原因就是没有系统地的去学习.看了很多书,刷了很多题,浪费了不少时间,所以希望看到这篇文 ...

  4. 学习算法第一天:算法初步

    一.学习算法必要性why: 应用:机器学习.数据挖掘.自然语言处理.密码学.计算机图形学等 找工作:贪心.分治.动态规划.树.图等. 二.怎么做how? 穷举法(万能算法) 求N个数的全排列 8皇后问 ...

  5. Java数据结构(1.1):数据结构入门+线性表、算法时间复杂度与空间复杂度、线性表、顺序表、单双链表实现、Java线性表、栈、队列、Java栈与队列。

    数据结构与算法入门 问题1:为什么要学习数据结构          如果说学习语文的最终目的是写小说的话,那么能不能在识字.组词.造句后就直接写小说了,肯定是不行的, 中间还有一个必经的阶段:就是写作 ...

  6. 《趣学算法(第2版)》读书笔记 Part 1 :如何高效学习算法

    14天阅读挑战赛 系列笔记链接 <趣学算法(第2版)>读书笔记 Part 1 :如何高效学习算法 <趣学算法(第2版)>读书笔记 Part 2 :算法入门 <趣学算法(第 ...

  7. 新手如何学习算法?算法如何入门以及零基础入门算法应该学些什么?

    搬运工,看到一篇关于算法学习之路的总结,希望对你有帮助. 原文链接:zh.lucida.me/blog/on-le 我的算法学习之路 MAY 4TH, 2014 | COMMENTS  关于 严格来说 ...

  8. 新手收入学习算法?算法如何入门以及零基础入门算法应该学些什么?学习路线是什么...

    作者:周末 链接:https://www.zhihu.com/question/27984119/answer/39116336 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业转载请 ...

  9. 机器学习 | 基础通俗讲解集成学习算法!

    来源:Datawhale 本文约6000字,建议阅读10+分钟 本文以图文的形式对模型算法中的集成学习,以及对集中学习在深度学习中的应用进行了详细解读. 标签:机器学习 数据及背景 阿里天池-零基础入 ...

最新文章

  1. CentOS 修改/etc/resolv.conf 重启network后又恢复到原来的状态
  2. 求1+2!+3!+......+20!的和
  3. 智能会议系统(3)---Android VoIP系统实现原理
  4. 保密检查便携式计算机,Lyaept关于便携式计算机和移动存储介质保密管理制度.doc...
  5. pythonATM,购物车项目实战5-数据处理层
  6. linux命令行安装qq,在Linux上使用mojoqq来实现命令行QQ
  7. Docker安装Jenkins教程
  8. 计算机基础知识——计算机概述
  9. Halcon教程七:简单的回形针识别案例
  10. Linux日文教程,在Deepin/Ubuntu下安装fcitx-Anthy以输入日语(日文)
  11. 计算机设备管理器无com,计算机无设备管理器的方法
  12. NodeJS必知基础知识(非巨详细)
  13. 在macOS上运行bitcoin客户端
  14. mysql rpl_MySQL半同步复制rpl_semi_sync_master_timeout测试
  15. 微信小程序—火车票查询
  16. OPC:服务器开发(一)如何开发OPC Server
  17. ARM7(LPC2xxx)芯片的小总结
  18. catia v5r18 百度云_catia v5r18 64位免费版 附带安装教程
  19. 基于Layui自定义内容轮播插件
  20. 【5G核心网】free5GC UPF源码分析

热门文章

  1. u 20ubuntu 安装 postfix_汽车天线安装指南
  2. java的语法基础_JAVA语法基础1(入门手册)
  3. AtCoder Beginner Contest 182B
  4. 迪杰斯特拉算法 php,最短路径算法
  5. python revit二次开发_Revit怎么二次开发?Revit开发问题汇总
  6. 以下选项中表述为oracle,oracle 选择题
  7. HBaseRegionServer宕机数据恢复
  8. JVM系列:生产环境参数实例及分析【生产环境实例增加中】
  9. UILabel「行距,首行缩进」
  10. 图解25匹马的选马问题