网站首页 > 技术文章 正文
通常,我们衡量一个算法的优劣,从「 时间复杂度 」和「 空间复杂度 」两个维度去考量
● 时间复杂度
执行当前算法所消耗的时间
● 空间复杂度
执行当前算法需要占用多少内存空间
「 时间复杂度 」
我们先来看一个例子:
我们通过打印程序的执行时间来看算法的「时间复杂度 」。这种栗子存在弊端,受运行环境的影响,在性能高的机器上跑出来的结果与在性能低的机器上跑的结果相差会很大。
时间复杂度表示方法:「 大 O 符号表示法 」
公式:T [n] = O (f (n))
f (n) 表示每行代码执行次数之和,而 O 表示正比例关系,这个公式又叫“算法的渐进时间复杂度”。
通过「 大 O 符号表示法 」,图1 的时间复杂度为:O (n)
● 常数阶 O (1)
有时候在 Python 中看到存在 ++i 这种形式,这其实不是自增,只是简单的表示正负数的正号而已。正正得正,负负得正,所以 ++i 和 --i 都是 i 。(有Java基础的老铁注意啦)
无论代码执行了多少行,只要是没有循环等复杂结构,那这个代码的时间复杂度就都是 O (1)
图2代码在执行的时候,它消耗的时候并不随着某个变量的增长而增长,那么无论这类代码有多长,即使有几万几十万行,都可以用 O (1) 来表示它的时间复杂度。
● 线性阶 O (n)
从最开始图1 的栗子,for 循环里面的代码会执行 n 遍,因此它消耗的时间是随着 n 的变化而变化的,因此这类代码都可以用 O (n) 来表示它的时间复杂度。
● 平方阶 O (n2)
如果把 O (n) 的代码再嵌套循环一遍,它的时间复杂度就是 O (n2) 了。
● 对数阶 O (logN)
① 先回顾哈 log
② 举个栗子
从图3代码中,变量i从1开始, while 循环里面,每次都将 i 乘以 2,当 i 的值大于 n 时,推出循环
也就是说当循环 log(2)(n) 次以后,这个代码就结束了。因此这个代码的时间复杂度为:O(logN)
● 线性对数阶 O (nlogN)
线性对数阶 O (nlogN) 其实将时间复杂度为 O (logn) 的代码循环 N 遍的话,那么它的时间复杂度就是 n * O (logN),也就是了 O (nlogN)。
「 空间复杂度 」
● 常数阶 O (1)
如果算法执行所需要的临时空间不随着某个变量 n 的大小而变化,即此算法空间复杂度为一个常量,可表示为 O (1)
空间复杂度 S (n) = O (1)
● 线性阶 O (n)
第 3 行新建一个数组出来,这个数据占用的大小随着 for 循环的增加而增加。所以
S (n) = O (n)
● 平方阶 O (n2)
二维数组,双层 for 循环生成。空间复杂度 S (n) = O (n2)
小憩一下
只有程序猿才看的懂的图
- 上一篇: 「算法」几分钟时间让你彻底学会—空间复杂度
- 下一篇: 算法的时间和空间复杂度-程序员的噩梦
猜你喜欢
- 2024-09-25 评估算法及算法的时间复杂度 评估算法有哪些
- 2024-09-25 关于算法的时间复杂度和大O记号的简单理解
- 2024-09-25 算法001:O(1)时间复杂度的底层原理,什么是时间复杂度?来看
- 2024-09-25 面试官:说说你对算法中时间复杂度,空间复杂度的理解?如何计算
- 2024-09-25 排序算法时间复杂度、空间复杂度分享
- 2024-09-25 数据结构与算法-时间复杂度 数据结构中时间复杂度的定义
- 2024-09-25 算法的时间和空间复杂度-程序员的噩梦
- 2024-09-25 「算法」几分钟时间让你彻底学会—空间复杂度
- 2024-09-25 五分钟带你理解Java算法的时间复杂度
- 2024-09-25 「算法」什么是冒泡排序 冒泡排序的算法原理
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)