“算法(algorithm)是为求解一个问题需要遵循的,被清楚地指定的简单指令集合。”

算法设计时,很重要的一步需要确定其占用的空间资源和时间资源,如果一个算法执行需要很长的时间,那么它很难有什么用处。同样的一个算法占用的空间太大,很有可能目前大多数的计算机都无法运行。这篇介绍的是算法的时间复杂度。

首先我们需要理解算法的时间复杂度是什么,其并不是一台计算机运行一个算法所花的时间。同样的一个算法在不同的计算机的运行时间是不同的,既与计算机的配置有关,也与计算机的使用时间有关,甚至于计算机所在的环境有关,所以算法执行的时间是难以确定的,也是没有太大意义的,因此需要找一个方式来作为专门比较算法的复杂度。使得在相同环境中算法的执行时间最低。

为了解决这个问题引入一个时间复杂度的计算法则:大O记法。

时间频度

一个算法花费的时间与算法中语句执行的次数成正相关,算法中语句执行的次数称为时间频度或语句频度。记作T(n)。

一般情况下,算法中语句的执行次数,是一个与那有关的函数,用T(n)来表示。若有一个辅助函数f(n),在当n趋近于无穷大时,T(n)/f(n)时的极限值趋近于一个不等于零常数值,则称f(n)为T(n)的同数量级函数。记作T(n)=O(f(n))。称O(f(n))为算法的时间复杂度。

我们在这给出的是他们之间的相对级别,任意给定两个不同的函数,可能会存在某一个点使得f(n)>g(n),但就此我们说f(n)的算法复杂度高于g(n),这是这是没有意义的。于是我们比较的是其函数增长率。因此即使T(n)不同,但是其算法复杂度也可能相同。比如:T(n)=10n2+100n+100与T(n)=100n2+10n+200的时间复杂度是相同的都是O(n2)。

常见的时间复杂度

  1. 常数阶:O(1)
  2. 对数阶:O(logn)
  3. 线性阶:O(n)
  4. 线性对数阶:O(nlogn)
  5. 次方阶:O(nk)
  6. 指数阶:O(2n)

说明:

其时间复杂度有小到大的排列关系为:O(1) < O(logn) < O(n) < O(nlogn) < O(n2) < O(n3) < O(nk) < O(2n)

举例

  • 对数阶 O(logn)
for (int i = 1; i < n; i++)
{i = i * 2;
}
  • 线性阶 O(n)
int i = 1;
while (i < n)
{i++;
}
  • 线性对数阶 O(nlogn)
for(int i = 1; i < n; i++)
{j = 1; while (j < n){j = j * 2;}
}
  • 平方阶 O(n2)
for (int i = 0; i < n; i++)
{for (int j = 0; j < n; j++){int x = i; x++;}
}

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

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

举例:(八个著名的排序算法^ _ ^)

排序法 平均时间 最差时间 稳定性 额外空间 备注
冒泡排序 O(n2) O(n2) 稳定 O(1) n较小时比较好
简单选择排序 O(n2) O(n2) 不稳定 O(1) n较小时比较好
直接插入排序 O(n2) O(n2) 稳定 O(1) 大部分已经排列好了的时候
快速排序 O(nlogn) O(n2) 不稳定 O(nlogn) n较大时比较好
归并排序 O(nlogn) O(nlogn) 稳定 O(1) n较大时比较好
堆排序 O(nlogn) O(nlogn) 不稳定 O(1) n较大时比较好
基数排序 O(logRB) O(logRB) 稳定 O(n) B是真数(0~9),R是基数(个十百)
希尔(shell)排序 O(nlogn) O(ns) 1<s<2 不稳定 O(1) s是所选分组

对算法的时间复杂度的理解相关推荐

  1. 算法时间复杂度lg是多少_时间复杂度入门理解

    前言 当你编写完一个程序的时候,怎样对它进行算法最优的判断呢?效率又是怎样体现的呢?效率=总执行次数/总时间,一般来说,程序越庞大,其执行效率越低.因此,对于模块化程序,优化其算法的时间复杂度是非常重 ...

  2. 算法的时间复杂度(python版容易理解)+常用的时间复杂度、python代码--数据结构

    https://blog.csdn.net/hanhanwanghaha宝藏女孩 欢迎您的关注! 欢迎关注微信公众号:宝藏女孩的成长日记 如有转载,请注明出处(如不注明,盗者必究) 目录 一.算法时间 ...

  3. 算法导论-时间复杂度理解-抽签

    题目: 抽 签 你的朋友提议玩一个游戏:将写有数字的n 个纸片放入口袋中,你可以从口袋中抽取4 次纸 片,每次记下纸片上的数字后都将其放回口袋中.如果这4 个数字的和是m,就是你赢,否 则就是你的朋友 ...

  4. a*算法的时间复杂度_从经典算法题看时间复杂度

    本文首发公众号:架构精进​,排版比较清晰. 经常有同学在 LeetCode 的题解中问解法的复杂度是多少.作为一个懒人,我一直在「逃避」这个问题,毕竟这东西听起来就这么「复杂」. 但本着对题解认真负责 ...

  5. 简单分析算法的时间复杂度

    目录 一.什么是算法的时间复杂度 二.如何分析一个算法的时间复杂度 1.有确定次数的算法 2.次数不确定的算法 一.什么是算法的时间复杂度         时间复杂度是一个函数 ,定性描述一个算法(程 ...

  6. 《大话数据结构》第2章 算法基础 2.9 算法的时间复杂度

    2.9 算法的时间复杂度 2.9.1 算法时间复杂度定义 在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随n的变化情况并确定T(n)的数量级.算法的时间复杂度,也就 ...

  7. 时间复杂度为on的排序算法_排序算法amp;时间复杂度计算

    对于排序算法而言,有几个重要的点: 理解此种排序算法是怎么运行的 理解算法的时间复杂度与空间复杂度计算 递推公式(关乎时间复杂度的计算) 递推公式主要为以下的形式(递归使用的复杂度也这么算): 具体推 ...

  8. 算法和时间复杂度概念(一级)

    第一个内容什么是算法?什么是算法的复杂度?什么是算法的空间复杂度?我们的标题是数据结构和算法入门,这两个就是数据结构的入门,这三个就是算法的入门什么叫算法?算法就是指令的集合,是为解决特定问题而规定的 ...

  9. 数据结构与算法之时间复杂度详解

    数据结构与算法之时间复杂度详解 目录 排序算法的介绍和分类 算法的时间复杂度概念 常见的时间复杂度解析 平均时间复杂度和最坏时间复杂度 空间复杂度介绍 1. 排序算法的介绍和分类 排序算法的介绍 排序 ...

最新文章

  1. 一位年轻董事长给大学生的18条好建议
  2. 《 测试反模式:有效规避常见的92种测试陷阱》——1.3 什么是缺陷
  3. 【Spring注解驱动开发】自学java和三大框架要多久
  4. 七牛2018春季校园招聘后端开发工程师笔试经验
  5. 升级到Java SE 8 和Java EE 7
  6. 网络爬虫--27.csv文件的读取和写入
  7. VC 位图按钮CBitmapButton的使用
  8. 关店9000家,市值蒸发90%,女装巨头大崩溃的根源找到了
  9. 测试技术培训:如何测试磁盘写的速度
  10. 随想录(octave软件)
  11. python求高阶导数_Pythorch中的高阶梯度
  12. 基础集合论 第一章 3 集合论的公式和条件
  13. c语言怎么查找中文字符,C语言自学,汉字编码范围查询!
  14. 混凝土弹性波速计算公式_混凝土强度与应力波速相关性研究
  15. 阿里在职5年,一个女测试工师的坎坷之路
  16. 20220315_K近邻
  17. gamma分布python代码_python scipy stats.gamma用法及代码示例
  18. Navicat for mysql的相关教程
  19. 【Machine Learning 学习笔记】Stochastic Dual Coordinate Ascent for SVM 代码实现
  20. 神经网络与深度学习笔记(三)python 实现反向传播算法

热门文章

  1. echarts或vcharts的X轴设置
  2. Reac16+Monaco打造代码编辑器(前端部分)
  3. python对英雄皮肤进行图片采集~
  4. 054.CSS网页布局
  5. 信息安全工程师学习笔记《第四章》
  6. CloudSim介绍与使用 云计算的建模与仿真
  7. EDIUS和Premiere两款视频剪辑软件哪个好
  8. PyCharm中的问题记录:failed to sync ide settings. click to sync
  9. 微信小程序添加emoji表情组件,雪碧图版本
  10. Vue全家桶学习笔记:Vue Router篇