hashmap时间和空间复杂度_Python算法 00--时间复杂度和空间复杂度

本文介绍了衡量算法效率的两个关键指标——时间复杂度和空间复杂度,通过实例详细阐述了常见的时间复杂度阶别,如O(1)、O(n)、O(n²)、O(logN)以及O(nlogN),并简单提及了空间复杂度的不同阶别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

7390663cb328e162dfa61c418d7ba545.gif
3b9a6725e59f13a1e867f8cfe39f540c.png

39772551244f9078a242399d29874f84.png

通常,我们衡量一个算法的优劣,从时间复杂度空间复杂度两个维度去考量

● 时间复杂度

执行当前算法所消耗的时间

● 空间复杂度

执行当前算法需要占用多少内存空间


「 时间复杂度 」

我们先来看一个例子:

887459383ecb597e79d9c9f77b3b08eb.png

图1

我们通过打印程序的执行时间来看算法的「时间复杂度 」。这种栗子存在弊端,受运行环境的影响,在性能高的机器上跑出来的结果与在性能低的机器上跑的结果相差会很大。


c90fb2dcad7c59a8e70fb7f8bf98dc7d.png

时间复杂度表示方法:「 大 O 符号表示法

公式:T [n] = O (f (n))

f (n) 表示每行代码执行次数之和,而 O 表示正比例关系,这个公式又叫“算法的渐进时间复杂度”。

通过「 大 O 符号表示法 」,图1 的时间复杂度为:O (n)

8e4d0e8e6ad2a3948362d72fe3f06c58.png

● 常数阶 O (1)

41f02ba6760ae613f83dc721e827b4d2.png

图2

有时候在 Python 中看到存在 ++i 这种形式,这其实不是自增,只是简单的表示正负数的正号而已。正正得正,负负得正,所以 ++i 和 --i 都是 i 。(有Java基础的老铁注意啦)

无论代码执行了多少行,只要是没有循环等复杂结构,那这个代码的时间复杂度就都是 O (1)

图2代码在执行的时候,它消耗的时候并不随着某个变量的增长而增长,那么无论这类代码有多长,即使有几万几十万行,都可以用 O (1) 来表示它的时间复杂度。


● 线性阶 O (n)

从最开始图1 的栗子,for 循环里面的代码会执行 n 遍,因此它消耗的时间是随着 n 的变化而变化的,因此这类代码都可以用 O (n) 来表示它的时间复杂度。


● 平方阶 O (n²)

如果把 O (n) 的代码再嵌套循环一遍,它的时间复杂度就是 O (n²) 了。

290141ec413ea0973b9258bf0bd5c2b1.png

e5322b8ca7982d666d5c637d5da7f258.png

● 对数阶 O (logN)

① 先回顾哈 log

8b03911bd61ed3133f6214ccc4d50e96.png

② 举个栗子

d1a692280c59139115733ca6c5a184ee.png

图3

从图3代码中,变量i从1开始, while 循环里面,每次都将 i 乘以 2,当 i 的值大于 n 时,推出循环

bbe7f1c9d86f7d4e8936af08441b5d0f.png

也就是说当循环 log(2)(n) 次以后,这个代码就结束了。因此这个代码的时间复杂度为:O(logN)


● 线性对数阶 O (nlogN)

线性对数阶 O (nlogN) 其实将时间复杂度为 O (logn) 的代码循环 N 遍的话,那么它的时间复杂度就是 n * O (logN),也就是了 O (nlogN)。

5e55487503bece5216a989aec843ee09.png

「 空间复杂度 」

● 常数阶 O (1)

如果算法执行所需要的临时空间不随着某个变量 n 的大小而变化,即此算法空间复杂度为一个常量,可表示为 O (1)

空间复杂度 S (n) = O (1)

● 线性阶 O (n)

59885390ad906e2b51461b7f9966e611.png

第 3 行新建一个数组出来,这个数据占用的大小随着 for 循环的增加而增加。所以

S (n) = O (n)

● 平方阶 O (n²)

69b03d27bbfc910da17a1a5d985fd16e.png

二维数组,双层 for 循环生成。空间复杂度 S (n) = O (n²)


小憩一下

只有程序猿才看的懂的图

eba317651766ca78c3c16bd6d7dfc65d.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值