

详解时间、空间复杂度(内含彩蛋~~)
source link: http://www.cnblogs.com/Qpgshare/p/12632688.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

目录
- 一、时间复杂度:执行算法所需要的计算工作量
- (一)时间复杂度的理解
- 2.(渐进)时间复杂度定义
- (二)时间复杂度的计算
- (一)时间复杂度的理解
- 二、 空间复杂度:执行这个算法所需要的内存空间
学习算法我们首先需要清楚的概念就是时间复杂度和空间复杂度
接下来我们就详细讲解一下时间复杂度和空间复杂度,为大家后面的学习打好基础!
算法入门书籍挑选点这里~ 帮你快速找到适合自己的算法书籍(详细,内含彩蛋哦~)
一、时间复杂度:执行算法所需要的计算工作量
(一)时间复杂度的理解
1.时间频度定义
我们需先明白:
一个 算法花费的时间 是与 算法中语句的执行次数 成 正比 的
(也就是说一个算法中语句执行次数越多,花费的时间也就越多)
时间频度:T(n):一个算法中的语句执行次数,记为T(n)
2.(渐进)时间复杂度定义
T(n):算法中基本操作重复执行的次数是问题规模n的某个函数。
f(n):某个辅助函数
算法的(渐进)时间复杂度O(f(n)):
若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f (n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数。
记作T(n)=O(f(n)),称O(f(n)) 为算法的渐进时间复杂度,简称时间复杂度。
O(f(n)) 表示方法称为大O表示法
注意: T(n)不同,但时间复杂度可能相同。
(二)时间复杂度的计算
计算攻略:
- 用常数1代替运行时间中的所有 加法常数 。
- 修改后的运行次数函数中,只保留最高阶项。
- 去除最高项系数
注意:
(1)循环的时间复杂度 = 循环体的复杂度 × 该循环运行次数
(2)单纯的分支结构(不包括在循环结构中)其时间复杂度为O(1)
常见的算法时间复杂度由小到大排序:
常见的算法时间复杂度由小到大依次为: O(1):常数阶 O(log a n)【O(log 2 n)】:对数阶 O(n):线性阶 O(nlog a n)【O(nlog 2 n)】:线性对数阶 O(n 2 ):平方阶 O(n 3 ):立方阶 O(n k ):k次方阶 O(2 n ):指数阶 随着问题规模n的不断增大,上述时间复杂度越来越大大,算法的执行效率也越来越低大O表示法推导实例:
1.常数阶 ⇒ O(1)
int n =100;//执行1次 int sum =n*2;//执行1次 System.out println(sum);//执行1次
你可能会问代码一共执行了3次鸭,为什么时间复杂度不是O(3)呢?
这是因为用到了 第一条攻略 :用常数1代替运行时间中的所有 加法常数 。
本题中:T(n)=3根据第一条攻略:
(1) T(n)=3 ⇒ T(n)=1 (2) T(n)=1 ⇒ O(1)
2.线性阶 ⇒ O(n)
int i= 0,sum=0; for(i=0;i<n;i++){//for循环执行n次 sum=2*i;//执行一次for循环此语句执行一次 System.out.println(sum);//执行一次for循环此语句执行一次 }
所以:T(n)=2n
第三条攻略:去除最高项系数
本例中根据 第三条攻略可得 :
(1) T(n)=2n ⇒ T(n)=n (2) T(n)=n ⇒ O(n)
3.平方阶 ⇒ O(n 2 )
例1:
int i,j=0; for(i=0;i<n;i++){//执行n次 for(j=0;j<n;j++){//执行n次 System.out.println(i + " " + j ); } }
所以:T(n)=n 2
T(n)=n 2 ⇒ O(n 2 )
例2:
int i,j=0; for(i=0;i<n;i++){//执行n次 for(j=i;j<n;j++){//注意j=i System.out.println(i + " " + j ); } }
当i=0,第二个for循环执行n次
当i=1,第二个for循环执行n-1次
当i=2,第二个for循环执行n-2次
当i=n-1,第二个for循环执行1次
执行总数T(n)=n+(n-1)+(n-2)+……1= +
= (n 2 +n)
根据第二条攻略、第三条攻略可得:
第二条攻略:修改后的运行次数函数中,只保留最高阶项。
第三条攻略:去除最高项系数 T(n)= (n 2 +n) ⇒ T(n)= n 2 T(n)= n 2 ⇒ O(n 2 )
二、 空间复杂度:执行这个算法所需要的内存空间
空间复杂度:
对一个算法在运行过程中临时占用存储空间大小的量度,记做S(n)=O(f(n))。
n为问题的规模,f(n)为算法所占存储空间的函数。
空间复杂度分类:
O(1)情况:
当算法的存储空间大小固定,与输入规模没有直接的关系时,空间复杂度记作O(1)。
O(n)情况:
当算法分配的空间和输入规模n成正比时,空间复杂度记作O(n)。
三、彩蛋
我将入门算法书中时间复杂度、空间复杂度讲解部分为大家截出来了,有需要的宝宝可以自取。
链接: https://pan.baidu.com/s/1mrMeuLv11Bf09zrE-DhFLA
提取码:yw8d
欢迎大家来公号“小乔的编程内容分享站”来找小乔玩~
一起学习Java基础+算法~
还有更多资源等你来拿哦~
Recommend
-
50
点击蓝色“ 乔志勇笔记 ”关注我哟 加个“ 星标 ”,第一时间获取推送...
-
42
1. 博客背景 今天有同事在检查代码的时候,由于函数写的性能不是很好,被打回去重构了,细思极恐,今天和大家分享一篇用js讲解的时间复杂度和空间复杂度的博客 2. 复杂度的表示方式 之前有看过的,你可能...
-
17
本文是覃超老师的《算法训练营》的学习笔记,此笔记的内容包含了学习后的个人记录、个人总结、理解和思想。从而更好的学习算法。 前言 学习任何一门知识的时...
-
9
各种排序算法时间复杂度和空间复杂度表 各种排序算法时间复杂度和空间复杂度表: 各种排序算法时间复杂度和空间复杂度表 比较时间复杂度函数的情况如下图: 比较时间复杂度函数的情况...
-
13
关注公众号「五分钟学算法」,回复关键字 算法,获取谷歌工程师的 LeetCode 算法笔记。...
-
5
针对某一类问题的解决,我们可能需要借助算法来实现,实现的手段也可能是各式各样的。虽然最终都解决了问...
-
14
在使用当中,算法效率分为两种,一是时间效率(时间复杂度),二是空间效率(空间复杂度)。时间复杂度是指程序运行的速度。空间复杂度是指一个算法所需要的额外的空间。 时间复杂度 什么是时间复杂度 计算程序运行的时间不能拿简单的...
-
5
作为一名“程序猿”,大家应该都听过这么一句话:程序=数据结构+算法。 这句话是由瑞士计算机科学家尼古拉斯·沃斯(Niklaus Wirth)在 1984 年获得图灵奖时说的一句话,这位大佬还以这句话为名出了一本书《Algorithms + Data Structures=Programs》,从此...
-
4
那些年忽略的知识:时间复杂度和空间复杂度详解 尴尬,学妹问我...
-
6
我们都知道,对于同一个问题来说,可以有多种解决问题的算法。尽管算法不是唯一的,但是对于问题本身来说相对好的算法还是存在的,这里可能有人会问区分好坏的标准是什么?这个要从「时效」和「存储」两方面来看。 人总是贪婪的,在做一件事的时候,我们...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK