算法效率的度量通过时间复杂度和空间复杂度来衡量。

一般考察时间复杂度的内容偏多,空间复杂度了解就行。

1.时间复杂度

语句的频度是指一个语句在算法中被重复执行的次数。

时间复杂度是指执行算法所需要的计算工作量;

时间复杂度主要是找到各个语句执行的次数,再找到相同的数量级。

T(n)=所有语句的频度之和,它是算法问题规模的n的函数,时间复杂度主要分析T(n)的数量级。

算法中基本运算[最深层次循环的语句]的频度与T(n)同数量级。

时间复杂度一般分为以下三种:

  • 最坏时间复杂度:顾名思义,在最坏情况下的算法时间复杂度
  • 平均时间复杂度:指所有可能输入在等概率的情况下,算法期望运行的时间
  • 最好时间复杂度:指在最好情况下,算法的时间复杂度

一般总是考虑在最坏情况下的时间复杂度,目的是保证算法的运行时间不会比它更长。

注:下面两条规则非常重要

1)加法规则

T(n)=T1(n)+T2(n)=O(f(n))+O(g(n))=O(max(f(n),g(n)))

2)乘法规则

T(n)=T1(n)xT2(n)=O(f(n))xO(g(n))=O(f(n)xg(n))

常见的时间复杂度比较:

O(1)<O(lg n)<O(n)<O(nlg n)<O(n²)<O(n³)<O(2的n次方)<O(n!)<O(n的n次方)


下面我举几个栗子说明一下:

count=0;
for(k=1;k<=n;k*=2)for(j=1;j<=n;j++)count++;

内层循环j<=n与外层循环的变量无关,各自独立,没执行一次j自增1,每次内层循环都执行n次。外层循环条件看k<=n,增量的定义式k*=2,可知循环次数t满足k=2的i次<=n,即t<=lg n。

所以内层循环的时间复杂度为O(n),外层时间复杂度为O(lg n)。

对于嵌套循坏,由乘法规则可知,该程序的时间复杂度为T(n)=T1(n)xT2(n)=O(n)xO(lg n)=O(nlg n)。

int fact(int n){if(n<=1) return 1;elsereturn n*fact(n-1);
}

这道题实际上是求n!的递归代码,每次递归调用fact()的参数-1,递归出口为fact(1),一共执行n次递归调用fact(),T(n)=O(n)。

int m=0,i,j;
for(i=1;i<=n;i++)for(j=1;j<=2*i;j++)m++;

这个题求m++这一步的时间复杂度。

显然,跟上面第一个例子是一样的乘法规则,由于是嵌套语句,所以时间复杂度T(n)=T1(n)xT2(n)=O(n)xO(2(n+1))=O(n(n+1))。

这种算完,可以忽略掉系数和次要的项,即T(n)=O(n²)。

x=0;
while(n>=(x+1)*(x+1))
x=x+1;

先假设第k次循环终止,则第k次执行时,(x+1)²>n,x的初始值为0,第k次判断时,x=k-1,即k²>n,k>根号n,所以时间复杂度=O(根号n)。

2.空间复杂度

空间复杂度是指执行这个算法所需要的内存空间。

1.递归算法的空间复杂度=递归深度N*每次递归所要的辅助空间

2.对于单线程来说,递归有运行时堆栈,求的是递归最深的那一次压栈所耗费的空间的个数。

算法原地工作是指算法所需的辅助空间为常数,即O(1)。

算法效率的度量--时间复杂度与空间复杂度相关推荐

  1. 第四课:算法效率的度量和存储空间需求

    第四课 本课主题: 算法效率的度量和存储空间需求 教学目的: 掌握算法的渐近时间复杂度和空间复杂度的意义与作用 教学重点: 渐近时间复杂度的意义与作用及计算方法 教学难点: 渐近时间复杂度的意义 授课 ...

  2. 【数据结构】之算法效率的度量

    算法效率的度量 算法效率的度量是通过时间复杂度和空间复杂度来描述的. 时间复杂度 一个语句的频度是指该语句在算法中被重复执行的次数.算法中所有语句的频度之和记为T(n) 算法的时间复杂度记为 T(n) ...

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

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

  4. 排序算法之 归并排序 及其时间复杂度和空间复杂度

    在排序算法中快速排序的效率是非常高的,但是还有种排序算法的效率可以与之媲美,那就是归并排序:归并排序和快速排序有那么点异曲同工之妙,快速排序:是先把数组粗略的排序成两个子数组,然后递归再粗略分两个子数 ...

  5. 常见排序算法及其对应的时间复杂度、空间复杂度

    常见排序算法及其对应的时间复杂度.空间复杂度: 排序算法经过长时间演变,大体可以分为两类:内排序和外排序.在排序过程中,全部记录存放在内存,则成为内排序:如果排序过程中需要使用外存,则称为外排序,本文 ...

  6. 常见排序算法及对应的时间复杂度和空间复杂度

    排序算法经过了很长时间的演变,产生了很多种不同的方法.对于初学者来说,对它们进行整理便于理解记忆显得很重要.每种算法都有它特定的使用场合,很难通用.因此,我们很有必要对所有常见的排序算法进行归纳. 排 ...

  7. python【数据结构与算法】一种时间复杂度和空间复杂度的计算方法

    文章目录 1 算法的时间复杂度定义 2 推导大O阶方法 2.1 常数阶 2.2 线性阶 2.3 对数阶 2.4 平方阶 2.5 立方阶 3 常见的时间复杂度排序 4 算法空间复杂度 5 常用算法的时间 ...

  8. 深度优先算法(DFS)和广度优先算法(BFS)时间复杂度和空间复杂度计算精讲

    现在我们设定任务为到山东菏泽曹县买牛逼,需要利用深度优先算法(DFS)和广度优先算法(BFS)在中国.省会.市.区县这张大的树中搜索到曹县,那么这个任务Goal就是找到曹县. 假如图的最大路径长度m和 ...

  9. 堆排序重建堆的时间复杂度_排序算法之 堆排序 及其时间复杂度和空间复杂度-Go语言中文社区...

    堆排序是由1991年的计算机先驱奖获得者.斯坦福大学计算机科学系教授罗伯特.弗洛伊德(Robert W.Floyd)和威廉姆斯(J.Williams)在1964年共同发明了的一种排序算法( Heap ...

  10. 排序算法之 冒泡排序 及其时间复杂度和空间复杂度

    冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交 ...

最新文章

  1. firefox显示nagios
  2. 微信端图片上传方式2
  3. 自动更新AndroidManifest版本号
  4. Centos 安装Eclipse报错java.lang.UnsatisfiedLinkError: Could not load SWT library
  5. .NET的一点历史故事:作者的一些感想
  6. jdbc url链接加时区正确方法
  7. windows 常见环境变量(%AppData%、%TEMP%、%TMP%)
  8. redis 入门总结
  9. linux accept 修改数据包,Linux协议栈accept和syn队列问题
  10. 重装系统大法—WePE or 老毛桃
  11. 提供全套Python教学资源和考试系统,全力打造良心服务
  12. mac mini 储存文件的服务器,另一种“NAS”的玩法---mac系统的远程管理和文件共享...
  13. ubuntu, xftp 命令安装 testlink (xampp-linux-x64-5.5.3,Linux Un 5.4.0-39)
  14. 数学有什么用处?看完后恍然大悟!
  15. DL之DSSD:DSSD算法的简介(论文介绍)、架构详解、案例应用等配图集合之详细攻略
  16. 全球与中国汽车空气悬架系统市场现状及未来发展趋势
  17. NBA常规赛总助攻排行榜(数据截止至11年4月14日)
  18. AMM做市无常损失对冲分析系列(一)—— 损益及期权对冲模型构建
  19. Python的egg包
  20. 极光推送:后台向APP:android,ios极光推送消息

热门文章

  1. Ubuntu关机(shut down)(power off)后不断电的问题
  2. 给定一个球体的半径,计算其体积。其中球体体积公式为 V = 4/3*πr3,其中 π= 3.1415926。
  3. 9x9九宫格java_9x9九宫格数字填写规律
  4. win10浏览器html设置字体大小设置,Win10网页字体变小了如何变大?网页字体变小了调节方法...
  5. 公众号淘客返利系统,自动回复淘宝优惠券实现方法
  6. 哈尔滨华夏计算机学院分数线,黑龙江2008年高职(专科)批录取院校录取最低分数线(九)...
  7. 计算机网络——集线器和交换机
  8. 使用思维导图提高工作效率的秘诀:6种工作思维导图模板分享
  9. python自动化操作微信_利用Python实现微信半自动化操作!
  10. 解决网页上不能直接复制文字的问题