1、时间复杂度

1.1度量一个程序(算法)执行时间的两种方法

事后统计的方法

这种方法可行, 但是有两个问题:
一是要想对设计的算法的运行性能进行评测,需要实际运行该程序;
二是所得时间的统计量依赖于计算机的硬件、软件等环境因素, 这种方式,要在同一台计算机的相同状态下运行,才能比较那个算法速度更快

  • 事前估计的方法

通过分析某个算法的时间复杂度来判断哪个算法更优。因事后统计方法更多的依赖于计算机的硬件、软件等环境因素,有时容易掩盖算法本身的优劣。因此人们常常采用事前分析估算的方法。

在编写程序前,依据统计方法对算法进行估算。一个用高级语言编写的程序在计算机上运行时所消耗的时间取决于下列因素:

  1. 算法采用的策略、方法;
  2. 编译产生的代码质量;
  3. 问题的输入规模;
  4. 机器执行指令的速度。
    一个算法是由控制结构(顺序、分支和循环3种)和原操作(指固有数据类型的操作)构成的,则算法时间取决于两者的综合效果。为了便于比较同一个问题的不同算法,通常的做法是,从算法中选取一种对于所研究的问题(或算法类型)来说是基本操作的原操作,以该基本操作的重复执行的次数作为算法的时间量度

1.2时间频度

时间频度:一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多。一个算法中的语句执行次数称为语句频度或时间频度。记为T(n)
举例:
比如计算1-100所有数字之和,我们设计两种算法

int total=0;
int end=100;
for(int i=1;i<=end;i++)
{total+=i;
}

T(n) = n+1;也就是要执行101次第101次也要判断一下

total=(1+end)*end/2

T(n)=1;也就是只需要执行一次

忽略常数项


观察图像分析:
2n+20 和 2n 随着n 变大,执行曲线无限接近, 20可以忽略
3n+10 和 3n 随着n 变大,执行曲线无限接近, 10可以忽略
忽略低次项

观察图像分析:
2n^2+3n+10 和 2n^2 随着n 变大, 执行曲线无限接近, 可以忽略 3n+10
n^2+5n+20 和 n^2 随着n 变大,执行曲线无限接近, 可以忽略 5n+20
忽略系数


观察图像分析:
随着n值变大,5n^2+7n 和 3n^2 + 2n ,执行曲线重合, 说明 这种情况下, 5和3可以忽略。
而n^3+5n 和 6n^3+4n ,执行曲线分离,说明多少次方才是关键

1.3时间复杂度

一般情况下,算法中的基本操作语句的重复执行次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n) / f(n) 的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数。记作 T(n)=O( f(n) ),称O( f(n) ) 为算法的渐进时间复杂度,简称时间复杂度

T(n) 不同,但时间复杂度可能相同
如:T(n)=n²+7n+6 与 T(n)=3n²+2n+2 它们的T(n) 不同,但时间复杂度相同,都为O(n²)。

计算时间复杂度的方法
比如:计算T(n)=3n²+2n+2的时间复杂度

  1. 用常数1代替运行时间中的所有加法常数: T(n)=3n²+2n+2 => T(n)=3n²+2n+1
  2. 修改后的运行次数函数中,只保留最高阶项 T(n)=3n²+2n+1 => T(n) = 3n²
  3. 去除最高阶项的系数 T(n) = 3n² => T(n) = n² => O(n²)

1.4常见的时间复杂度



常见的算法时间复杂度由小到大依次为:

随着问题规模n的不断增大,上述时间复杂度不断增大,算法的执行效率越低。从图中可见,我们应该尽可能避免使用指数阶的算法

无论代码执行了多少行,只要是没有循环等复杂结构,那这个代码的时间复杂度就都是O(1)

int i = 1;
int j = 2;
++i;
j++;
int m = i + j;

上述代码在执行的时候,它消耗的时候并不随着某个变量的增长而增长,那么无论这类代码有多长,即使有几万几十万行,都可以用O(1)来表示它的时间复杂度。

int i = 1;
while(i<n)
{i=i*2;
}

说明:在while循环里面,每次都将 i 乘以 2,乘完之后,i 距离 n 就越来越近了。假设循环x次之后,i 就大于 2 了,此时这个循环就退出了,也就是说 2 的 x 次方等于 n,那么 x = log2n也就是说当循环 log2n 次以后,这个代码就结束了。因此这个代码的时间复杂度为:O(log2^n) 。 O(log2^n) 的这个2 时间上是根据代码变化的,i = i * 3 ,则是 O(log3^n) .

for(i=1;i<=n;i++)
{j = i;j++;
}

说明:这段代码,for循环里面的代码会执行n遍,因此它消耗的时间是随着n的变化而变化的,因此这类代码都可以用O(n)来表示它的时间复杂度

for(m=1;m<n;m++)
{while(i<n){i=i*2;}
}

说明:线性对数阶O(nlogN) 其实非常容易理解,将时间复杂度为O(logn)的代码循环N遍的话,那么它的时间复杂度就是 n * O(logN),也就是了O(nlogN)。比如上面的代码的时间复杂度就是O(nlog2^ n) , 如果 i=i * 2改为i=i * 3的话,时间复杂度就是O(nlog3^ n)

for(x=1; i<=n; x++)
{for(i=1; i<=n; i++){j = i;j++;}
}

说明:平方阶O(n²) 就更容易理解了,如果把 O(n) 的代码再嵌套循环一遍,它的时间复杂度就是 O(n²),这段代码其实就是嵌套了2层n循环,它的时间复杂度就是 O(nn),即 O(n²) 如果将其中一层循环的n改成m,那它的时间复杂度就变成了 O(mn)

O(n³)相当于三层n循环

O(n^k)相当于k层循环

1.5平均时间复杂度和最坏时间复杂度

  1. 平均时间复杂度是指所有可能的输入实例均以等概率出现的情况下,该算法的运行时间。
  2. 最坏情况下的时间复杂度称最坏时间复杂度。一般讨论的时间复杂度均是最坏情况下的时间复杂度。这样做的原因是:最坏情况下的时间复杂度是算法在任何输入实例上运行时间的界限,这就保证了算法的运行时间不会比最坏情况更长。
  3. 平均时间复杂度和最坏时间复杂度是否一致,和算法有关。

比如下图为八大排序算法的时间复杂度:

2、算法的空间复杂度

  • 类似于时间复杂度的讨论,一个算法的空间复杂度(Space Complexity)定义为该算法所耗费的存储空间,它也是问题规模n的函数。
  • 空间复杂度(Space Complexity)是对一个算法在运行过程中临时占用存储空间大小的量度。有的算法需要占用的临时工作单元数与解决问题的规模n有关,它随着n的增大而增大,当n较大时,将占用较多的存储单元,例如快速排序和归并排序算法就属于这种情况
  • 在做算法分析时,主要讨论的是时间复杂度。从用户使用体验上看,更看重的程序执行的速度。一些缓存产品(redis,memcache)和算法(基数排序)本质就是用空间换时间.

欢迎持续关注!
个人博客站:jQueryZK Blog

算法(Java实现)-算法的时间复杂度和空间复杂度相关推荐

  1. JAVA数据结构和算法:第一章(时间复杂度和空间复杂度)

    数据结构 数据结构基础概念 不论是哪所大学,数据结构和算法这门课都被贯上无趣.犯困.困难的标签,我们从最基础最通俗的语言去说起,保证通俗易懂. 数据结构到底是什么呢?我们先来谈谈什么叫数据. 数据:数 ...

  2. 算法简介——二分查找,时间复杂度,空间复杂度

    文章目录 前言 二分查找 时间复杂度 大O表示法 空间复杂度 小结 前言 算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略 ...

  3. 数据结构和算法:(2)时间复杂度和空间复杂度

    首先需要明确一个概念,我们研究算法的复杂度,侧重的是研究算法随着输入规模扩大增长量的一个抽象,而不是精确的定位需要执行多少次. 我们在分析一个算法的运行时间时,重要的是把基本操作的数量和输入模式关联起 ...

  4. manacher 算法 java,Manacher算法的详细讲解

    Manacher算法,又叫"马拉车"算法,可以在时间复杂度为O(n)的情况下求解一个字符串的最长回文子串长度的问题. 一.回文子串的一般解法 比较简单的思路是将字符串的每一个字符作 ...

  5. a*算法的时间复杂度_算法基础——时间复杂度amp;空间复杂度

    关注.星标公众号,学点计算机知识. 整理:persistenceBin 今天来跟大家继续分享一下数据结构的基础知识--算法效率的度量:时间复杂度和空间复杂度.首先来跟大家分享一下在电影<复仇者联 ...

  6. 关于算法的时间复杂度和空间复杂度的总结

    一.算法的概念   算法(Algorithm)是将一组输入转化为一组输出的一系列计算步骤,其中每个步骤必须能在有限时间内完成.算法是用来解决一类计算问题的,注意是一类问题,而不是一个特定的问题. 二. ...

  7. 算法的时间复杂度、空间复杂度、稳定性

    1.算法的概念: 算法 (Algorithm),是对特定问题求解步骤的一种描述. 解决一个问题往往有不止一种方法,算法也是如此.那么解决特定问题的多个算法之间如何衡量它们的优劣呢?有如下的指标: 2. ...

  8. 数据结构: 算法的时间复杂度和空间复杂度

    1.算法的概念: 算法 (Algorithm),是对特定问题求解步骤的一种描述. 解决一个问题往往有不止一种方法,算法也是如此.那么解决特定问题的多个算法之间如何衡量它们的优劣呢?有如下的指标: 2. ...

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

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

  10. 算法:算法概述【时间复杂度、空间复杂度】

    一.算法定义 算法:为了实现业务目的的各种方法和思路就是算法.同样的数据,同样的目的, 不同的算法,不同的方法和思路,效率就会不同 算法是一种独立的存在 , 它并不依附于代码 , 代码只是实现算法思想 ...

最新文章

  1. 互联网不互联,挡住淘菜菜?
  2. css button 四种状态,css中按钮的四种状态
  3. 【转】用Terracotta实现Master-Worker
  4. Springboot thymeleaf i18n国际化多语言选择-2.业务流程内部返回 对应的语言
  5. SQLite判断表是否存在
  6. n位吸血鬼数字的算法
  7. 三相并网逆变器系统(光伏发电系统)simulink仿真
  8. 两阶段最小二乘法原理_什么是两阶段最小二乘法(2sls)?
  9. python人脸识别实验报告总结_人脸识别实验报告.doc
  10. Adlik发布v0.1.0(Antelope羚羊)版本,赋能深度学习模型产业化
  11. 03_使用决策树预测隐形眼镜类型
  12. java jsp小例题_JSP 相关试题(一)
  13. 人工智能里你不知道的那些事!所有人都感兴趣的文章
  14. [HDU - 2852] KiKi's K-Number (树状数组+二分)
  15. 5G助威云游戏前哨战,科技公司竞逐游戏界“Netflix”名号
  16. matlab振动信号数据,Matlab在场地微振动信号数据处理中的应用
  17. ActiveX数据对象之事务控制在VB和DELPHI中的应用
  18. android车载娱乐系统场景,复合式娱乐综合体,共享设备集成场景化空间-迷你ktv官网...
  19. 四自由度机械手c语言编程设计,四自由度机械手的机械结构原理毕业设计毕业论文...
  20. vue render 渲染函数 属性写法

热门文章

  1. 程序员的核心竞争力是什么?
  2. python中的继承的初始化_python中子类继承父类的__init__方法实例
  3. 分布式mysql proxy 360_mysql-proxy之奇虎360 Atlas 安装实现mysql读写分离
  4. springcloud:访问/bus/refresh地址后出现错误,,client端出现以下错误
  5. html制作类似qq聊天室,QQ聊天室主页设计
  6. 英语月份、星期、日期的缩写
  7. Java 输入一个正整数的字符串,输出与它最接近的对称数字(不包括它自己)的字符串
  8. 2019天梯赛第四次训练赛
  9. div获得/失去焦点
  10. 水牛城大学计算机科学,【揭秘】美国纽约州立水牛城大学计算机科学与工程专业申请条件有哪些?...