算法复杂度分为时间复杂度空间复杂度,二者也是衡量代码的好坏两个重要指标:

  • 时间复杂度:指执行算法所需要的计算工作量;
  • 间复杂度:指执行这个算法所需要的内存空间。

算法的复杂性体现在运行该算法时的计算机所需资源的多少上,计算机资源最重要的是时间和空间(即寄存器)资源,因此复杂度分为时间和空间复杂度。

1. 概念理解

1.1 基本执行次数:T(n)

由于运行环境和输入规模的影响,代码的绝对执行时间是无法估计的,但我们可以估算出代码的基本执行次数。

一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数,用这个函数来表达相对时间,可以记作 T(n)。

1.2 时间复杂度:O(n)

因为执行规则具有不确定性(文章下面就列举4种可能), 所以T(n) 不足以分析和比较一段代码的运行时间,就有了渐进时间复杂度(asymptotic time complexity)的概念,官方的定义如下:

若存在函数 f(n),使得当n趋近于无穷大时,T(n)/ f(n)的极限值为不等于零的常数,则称 f(n)是T(n)的同数量级函数。记作 T(n)= O(f(n)),称O(f(n)) 为算法的渐进时间复杂度,简称:时间复杂度。

渐进时间复杂度用大写“O”来表示,所以也被称为大O表示法。

算法时间复杂度里有O(1), O(n), O(logn), O(nlogn), O(n^2)的概念,这是算法的时空复杂度的表示。

它不仅仅用于表示时间复杂度,也用于表示空间复杂度。

O后面的括号中有一个函数,指明某个算法的耗时/耗空间与数据增长量之间的关系。其中的n代表输入数据的量。

1.3 空间复杂度:S(n)

与时间复杂度类似,空间复杂度是指算法在计算机内执行时所需存储空间的度量,记作:S(n)=O(f(n)) 。

上面提到过,O(n)不仅仅用于表示时间复杂度,也用于表示空间复杂度。

2. 场景分析:

这是针对时间复杂度的场景分析,时间复杂度排序为:O(1)< O(log2n)< O(n)< O(n^2)

场景1:T(n) =  O(1)

表示算法的运行时间为常量,这是最低的时空复杂度了,也就是耗时/耗空间与输入数据大小无关,无论输入数据增大多少倍,耗时/耗空间都不变。

哈希算法就是典型的O(1)时间复杂度,无论数据规模多大,都可以在一次计算后找到目标(不考虑冲突的话)。

场景2:T(n) =  O(log2n)

当数据增大n倍时,耗时增大log n倍(这里的log是以2为底的,比如,当数据增大256倍时,耗时只增大8倍,是比线性还要低的时间复杂度)。

二分查找就是O(log n)的算法,每找一次排除一半的可能,256个数据中查找只要找8次就可以找到目标。

场景3:T(n) =  O(n)

表示该算法是线性算法,数据量增大几倍,耗时也增大几倍。

比如常见的for循环遍历,要找到一个数组里面最大的一个数,你要把n个变量都扫描一遍,操作次数为n,那么算法复杂度是O(n)。

场景4:T(n) =  O(n^2)

代表数据量增大n倍时,耗时增大n的平方倍,这是比线性更高的时间复杂度。

比如冒泡排序,就是典型的O(n^2)的算法,对n个数排序,需要扫描n×n次。

在编程的世界中有着各种各样的算法,除了上述的四个场景,还有许多不同形式的时间复杂度,我们按照时间复杂度,按数量级递增依次排列为:

常数阶 O(1) <  对数阶(log2n) < 线性阶 O(n)<  线性对数阶 O(nlog2n) < 平方阶 O(n^2) < 立方阶 O(n^3) < k次方阶 O(n^k) < 指数阶 O(2^n)……

3. 算法比较:

排序算法

平均时间

最差情形

稳定度

额外空间

备注

冒泡

O(n 2 )

O(n 2 )

稳定

O(1)

n 小时较好

交换

O(n 2 )

O(n 2 )

不稳定

O(1)

n 小时较好

选择

O(n 2 )

O(n 2 )

不稳定

O(1)

n 小时较好

插入

O(n 2 )

O(n 2 )

稳定

O(1)

大部分已排序时较好

基数

O(log R B)

O(log R B)

稳定

O(n)

B 是真数 (0-9) ,

R 是基数 ( 个十百 )

Shell

O(nlogn)

O(n s ) 1<s<2

不稳定

O(1)

s 是所选分组

快速

O(nlogn)

O(n 2 )

不稳定

O(nlogn)

n 大时较好

归并

O(nlogn)

O(nlogn)

稳定

O(1)

n 大时较好

O(nlogn)

O(nlogn)

不稳定

O(1)

n 大时较好

借鉴了一些官方统计,再加上自己的理解,整理了一篇比较全面的关于介绍时间复杂度的博客,内容涵盖了从概念延伸到原理,再到算法的总结,希望对大家有一定的帮助。

少侠请留步 ... ヾ(◍°∇°◍)ノ゙ ... 
欢迎点赞、评论、加关注,让更多人看到学到赚到
更多精彩,请关注我的"今日头条号":Java云笔记

理解算法中的时间复杂度,O(1),O(n),O(log2n),O(n^2)相关推荐

  1. python冒泡排序时间复杂度_Python算法中的时间复杂度问题

    在实现算法的时候,通常会从两方面考虑算法的复杂度,即时间复杂度和空间复杂度.顾名思义,时间复杂度用于度量算法的计算工作量,空间复杂度用于度量算法占用的内存空间. 本文将从时间复杂度的概念出发,结合实际 ...

  2. 排序算法中平均时间复杂度_操作系统中的作业排序(算法,时间复杂度和示例)...

    排序算法中平均时间复杂度 作业排序 (Job sequencing) Job sequencing is the set of jobs, associated with the job i wher ...

  3. js算法中的时间复杂度

    大O表示法,是通过类比的方式来描述计算机算法的效率 常见的有 符号 名称 O(1) 常数 O(log(n)) 对数 O(n) 线性 O(nlog(n)) 线性和对数乘积 O(n²) 平方 O(2^n) ...

  4. 机器学习:算法中的泛化误差、偏差、方差、噪声的理解(超详细)

    摘要:在现实任务中,我们往往有多种学习算法可供选择,甚至对同一个学习算法,当使用不同的参数配置时,也会产生不同的模型,那么,我们该如何选用哪一个学习算法,使用哪一种参数配置呢?这就是机器学习中的&qu ...

  5. 如何快速找到最优路线?深入理解游戏中寻路算法

    如果你玩过MMOARPG游戏,比如魔兽,你会发现人物行走会很有趣,为了模仿人物行走的真实体验,他们会选择最近路线达到目的地,期间会避开高山或者湖水,绕过箱子或者树林,直到走到你所选定的目的地. 这种看 ...

  6. 算法中的各种排序以及查找时间复杂度

    今天简单的总结一下算法中经常用到的排序以及查找(用C语言实现,不全,持续更新) 一.首先是最常见也是最常被问的冒泡排序(原理就是每趟排序相邻两两比较...因为比较好理解,就省略了) //冒泡排序 -( ...

  7. [Vue][面试]你怎么理解vue中的diff算法?

    你怎么理解vue中的diff算法? #####源码分析1:必要性,lifecycle.js–mountComponent() vue中一个组件一个watcher实例,而组件中可能存在很多个data中的 ...

  8. 算法中七种常见的时间复杂度

    这是我的推广信息,以激励自己更好的分享自己的知识和经验!也希望看到的你能够多多支持,谢谢! 1. 滴滴云AI大师: 目前滴滴云正在大力推广自己的云计算服务,需要购买的朋友们用我的AI大师码 「2049 ...

  9. 如何理解算法时间复杂度的表示法O(n²)、O(n)、O(1)、O(nlogn)等?

    如何理解算法时间复杂度的表示法O(n²).O(n).O(1).O(nlogn)等? 2018年10月30日 00:09:14 JackLiu16 阅读数 127 时间复杂度这个东西,其实更准确点说应该 ...

  10. 如何去理解算法时间复杂度?

    如果你之前对此有过一面之缘,那么这里可以帮你加深你的印象.如果你是初学,那么这里可以帮助你理解.在想要理解时间复杂度之前,我们先来了解一下算法. 算法是什么? 算法(algorithm),在数学(算学 ...

最新文章

  1. NIO详解(二): BIO 浅谈 同步 异步与阻塞 非阻塞
  2. python每天学习30分钟系列
  3. 三十九、Vue项目上手 | 用户管理系统 实现添加用户功能(中篇)
  4. Microsoft Updater Application Block 1.5.3 服务器端manifest文件设计 [翻译]
  5. openpyxl模块_Openpyxl让Excel飞(一)
  6. 同一个按钮绑定多个事件_带你走进JavaScript世界系列——事件处理程序之 IE 事件处理...
  7. python和c先学哪个-对于初学者而言,python和 c语言先学哪个好
  8. python求解LeetCode习题Sort Colors
  9. FontLab 7 for Mac(字体编辑器)
  10. 持久层框架 -Xxmm.Net
  11. 等保2.0多少分合格?70分还是80分呢?
  12. DoNet6新特性 PriorityQueue 优先队列终于来啦~
  13. 关于高校通过ipv6免收费上网
  14. CCF-CSP 201912-2 回收站选址(python实现)
  15. php出生年月日怎么写,出生年月日五行查询表,五行属性查询表
  16. CHCR让iOS布局更婀娜
  17. 【Codeforces】Codeforces Global Round 18
  18. string.h 或 cstring 头文件包含的字符串操纵函数查询
  19. 图像检索:CIE Lab三维直方图+卡方距离
  20. 我待过的最坑的公司,强行996,溜溜球了

热门文章

  1. 关于Word插入图片闪退
  2. 解决Win10打开可执行文件提示为了对电脑进行保护,已经阻止此应用的问题
  3. 怎样将优酷视频编码KUX转MP4视频格式
  4. 什么是HD , HDTV , BD(Blu-Ray) , HDDVD
  5. 【论文翻译 AAAI 2020 | 知识图谱综述】A Survey on Knowledge Graphs: Representation, Acquisition and Applications
  6. CentOS添加新硬盘和硬盘格式化
  7. 大连海事计算机学硕分数线,大连海事大学2019年考研复试分数线预测
  8. 中国十大电商网站优势与劣势分析
  9. VMware9 绿色破解版 下载地址
  10. 起得比鸡早,睡得比狗晚,干得比驴多,吃得比猪差