对算法的时间复杂度的理解
“算法(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)。
常见的时间复杂度
- 常数阶:O(1)
- 对数阶:O(logn)
- 线性阶:O(n)
- 线性对数阶:O(nlogn)
- 次方阶:O(nk)
- 指数阶: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++;}
}
平均时间复杂度和最坏时间复杂度
- 平均时间复杂度是指所有可能的输入实例均以等概率出现的情况下,该算法的运行时间
- 最坏情况下的时间复杂度称为最坏时间复杂度(大O记法)。一般讨论的时间复杂度均是最坏时间复杂度,因为最坏时间复杂度是算法在算法输入实例的上界,这样就保证了运行的时间不会比最坏情况更长。
- 平均时间复杂度和最坏时间复杂度是否一致,和算法有关。
举例:(八个著名的排序算法^ _ ^)
排序法 | 平均时间 | 最差时间 | 稳定性 | 额外空间 | 备注 |
---|---|---|---|---|---|
冒泡排序 | 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是所选分组 |
对算法的时间复杂度的理解相关推荐
- 算法时间复杂度lg是多少_时间复杂度入门理解
前言 当你编写完一个程序的时候,怎样对它进行算法最优的判断呢?效率又是怎样体现的呢?效率=总执行次数/总时间,一般来说,程序越庞大,其执行效率越低.因此,对于模块化程序,优化其算法的时间复杂度是非常重 ...
- 算法的时间复杂度(python版容易理解)+常用的时间复杂度、python代码--数据结构
https://blog.csdn.net/hanhanwanghaha宝藏女孩 欢迎您的关注! 欢迎关注微信公众号:宝藏女孩的成长日记 如有转载,请注明出处(如不注明,盗者必究) 目录 一.算法时间 ...
- 算法导论-时间复杂度理解-抽签
题目: 抽 签 你的朋友提议玩一个游戏:将写有数字的n 个纸片放入口袋中,你可以从口袋中抽取4 次纸 片,每次记下纸片上的数字后都将其放回口袋中.如果这4 个数字的和是m,就是你赢,否 则就是你的朋友 ...
- a*算法的时间复杂度_从经典算法题看时间复杂度
本文首发公众号:架构精进,排版比较清晰. 经常有同学在 LeetCode 的题解中问解法的复杂度是多少.作为一个懒人,我一直在「逃避」这个问题,毕竟这东西听起来就这么「复杂」. 但本着对题解认真负责 ...
- 简单分析算法的时间复杂度
目录 一.什么是算法的时间复杂度 二.如何分析一个算法的时间复杂度 1.有确定次数的算法 2.次数不确定的算法 一.什么是算法的时间复杂度 时间复杂度是一个函数 ,定性描述一个算法(程 ...
- 《大话数据结构》第2章 算法基础 2.9 算法的时间复杂度
2.9 算法的时间复杂度 2.9.1 算法时间复杂度定义 在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随n的变化情况并确定T(n)的数量级.算法的时间复杂度,也就 ...
- 时间复杂度为on的排序算法_排序算法amp;时间复杂度计算
对于排序算法而言,有几个重要的点: 理解此种排序算法是怎么运行的 理解算法的时间复杂度与空间复杂度计算 递推公式(关乎时间复杂度的计算) 递推公式主要为以下的形式(递归使用的复杂度也这么算): 具体推 ...
- 算法和时间复杂度概念(一级)
第一个内容什么是算法?什么是算法的复杂度?什么是算法的空间复杂度?我们的标题是数据结构和算法入门,这两个就是数据结构的入门,这三个就是算法的入门什么叫算法?算法就是指令的集合,是为解决特定问题而规定的 ...
- 数据结构与算法之时间复杂度详解
数据结构与算法之时间复杂度详解 目录 排序算法的介绍和分类 算法的时间复杂度概念 常见的时间复杂度解析 平均时间复杂度和最坏时间复杂度 空间复杂度介绍 1. 排序算法的介绍和分类 排序算法的介绍 排序 ...
最新文章
- 一位年轻董事长给大学生的18条好建议
- 《 测试反模式:有效规避常见的92种测试陷阱》——1.3 什么是缺陷
- 【Spring注解驱动开发】自学java和三大框架要多久
- 七牛2018春季校园招聘后端开发工程师笔试经验
- 升级到Java SE 8 和Java EE 7
- 网络爬虫--27.csv文件的读取和写入
- VC 位图按钮CBitmapButton的使用
- 关店9000家,市值蒸发90%,女装巨头大崩溃的根源找到了
- 测试技术培训:如何测试磁盘写的速度
- 随想录(octave软件)
- python求高阶导数_Pythorch中的高阶梯度
- 基础集合论 第一章 3 集合论的公式和条件
- c语言怎么查找中文字符,C语言自学,汉字编码范围查询!
- 混凝土弹性波速计算公式_混凝土强度与应力波速相关性研究
- 阿里在职5年,一个女测试工师的坎坷之路
- 20220315_K近邻
- gamma分布python代码_python scipy stats.gamma用法及代码示例
- Navicat for mysql的相关教程
- 【Machine Learning 学习笔记】Stochastic Dual Coordinate Ascent for SVM 代码实现
- 神经网络与深度学习笔记(三)python 实现反向传播算法