最近看到 各种付费推送 所以去找找资源 写写笔记 😳感觉应该有人会需要
在 B站 看到一个 关于Python 面试算法的教程视频,本着复习加学习的态度,😏我就结合我自己所知的,边看边把它写了下来并补充。
就看了一半 😑感觉这视频比较适合新手(😒可能老手也不会找视频看吧。。。)之后会不会补完再说。。。
为什么分析算法
- 为了创建更有效的方程去解决方案
- 那么如何去对比哪个算法更好的?
- 时间复杂度 时间消耗
- 空间复杂度 内存消耗
Time T T T
Space S S S
代价 Cost c c c
- 首先我们创建一个简单的等差数列加法方程
sum1
def sum1(n):
"""
输入: n
从 0 加到 n
输出: 和
"""
final_sum = 0 # 次数 = 1, 代价 =c1
for x in range(n+1): # 次数 = n+1, 代价 =c2
final_sum += x # 次数 = n, 代价 =c3
return final_sum
sum1(100)
5050
T ( n ) = c 1 ⋅ 1 + c 2 ⋅ ( n + 1 ) + c 3 ⋅ n = ( c 2 + c 3 ) ⋅ n + ( c 1 ) = a ⋅ n + b = Θ ( n ) \begin{aligned}T(n) &= c_1\cdot 1+ c_2\cdot (n+1) + c_3\cdot n \\ &= (c_2+c_3) \cdot n + (c_1) \\&= a\cdot n +b \\&= \Theta(n)\end{aligned} T(n)=c1⋅1+c2⋅(n+1)+c3⋅n=(c2+c3)⋅n+(c1)=a⋅n+b=Θ(n)
-
它是 n n n 的线性函数
-
在我们忽略最低项与最高项的常数时(因为当n很大时,最低项与常数不太重要),我们使用 Θ \Theta Θ 表示运行时间,即它的运行时间为 Θ ( n ) \Theta(n) Θ(n)。(用 Θ \Theta Θ表达是在算法导论里看到的,数学里普遍还是使用 O O O)
-
时间复杂度 Θ \Theta Θ
- Θ \Theta Θ 的上界 用 O O O 表示
- Θ \Theta Θ 的下界 用 Ω \Omega Ω 表示
-
由于我们普遍考虑最困难的情况 所以一般都使用 大 O O O 来表示复杂度
-
接下来 来运用小学时学过的等差数列求和算法:
- 首项 0 加末项 n 乘以项数 (n+1) 除以 2
def sum2(n):
"""
输入: n
从 0 加到 n
输出: 和
"""
return (n*(n+1))/2 # 次数 = 1, 代价 =c1
sum2(100)
5050.0
-
时间复杂度 O ( 1 ) O(1) O(1)
-
在 Jupyter Notebook 可以使用魔术命令 (Maigc Commands)
- %timeit 将会执行一个语句100,000次(默认情况下),然后给出运行最快3次的平均值。
- %%time 将会给出cell的代码运行一次所花费的时间。
- %time 将会给出当前行的代码运行一次所花费的时间。
-
时间换算
- Micro 微妙 μ s = 1 0 − 6 s = \mu s= 10^{-6}s= μs=10−6s=
1e-6s 秒 - Nano 纳妙 n s = 1 0 − 9 s = ns = 10^{-9}s= ns=10−9s=
1e-9s 秒
- Micro 微妙 μ s = 1 0 − 6 s = \mu s= 10^{-6}s= μs=10−6s=
%timeit sum1(100)
4.32 µs ± 271 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
%timeit sum2(100)
131 ns ± 3.68 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
-
时间换算
- Micro 微妙 μ s = 1 0 − 6 s = \mu s= 10^{-6}s= μs=10−6s=
1e-6s 秒 - Nano 纳妙 n s = 1 0 − 9 s = ns = 10^{-9}s= ns=10−9s=
1e-9s 秒
- Micro 微妙 μ s = 1 0 − 6 s = \mu s= 10^{-6}s= μs=10−6s=
-
显而易见 第二个更快
-
时间复杂度排序:
| 符号 | name | 名称 |
|---|---|---|
| O ( 1 ) O(1) O(1) | constant | 常数 |
| O ( log log ( n ) ) O(\log \log (n)) O(loglog(n)) | double logarithmic | 双重对数 |
| O ( log ( n ) ) O(\log (n)) O(log(n)) | logarithmic | 对数 |
| O ( n c ) , 0 < c < 1 O(n^c),\ 0<c<1 O(nc), 0<c<1 | fractional power | 分数幂 |
| O ( n ) O(n) O(n) | linear | 线性 |
| O ( n log ∗ n ) O(n \log^* n) O(nlog∗n) | n log-star n, iterated logarithm, (log(log(log(…log(N))))) | 多重对数 |
| O ( n log ( n ) ) = O ( log ( n ! ) ) O(n \log(n))= O(\log(n!)) O(nlog(n))=O(log(n!)) | linearithmic, loglinear, quasilinear | 线性对数 |
| O ( n 2 ) O(n^2) O(n2) | quadratic | 二次方 |
| O ( n c ) , c > 1 O(n^c),\ c>1 O(nc), c>1 | polynomial or algebraic | 多项式 |
| L n [ α , c ] = e ( c + O ( 1 ) ) ( ln n ) α ( ln ln n ) 1 − α , 0 < α < 1 L_n[\alpha,c]= e^{(c+O(1))(\ln n)^\alpha(\ln\ln n)^{1-\alpha}},\ 0<\alpha<1 Ln[α,c]=e(c+O(1))(lnn)α(lnlnn)1−α, 0<α< |

最低0.47元/天 解锁文章
1634

被折叠的 条评论
为什么被折叠?



