面试的Python算法 Python Algorithms for Interviews

最近看到 各种付费推送 所以去找找资源 写写笔记 😳感觉应该有人会需要
在 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)=c11+c2(n+1)+c3n=(c2+c3)n+(c1)=an+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=106s= 1e-6 s 秒
    • Nano 纳妙 n s = 1 0 − 9 s = ns = 10^{-9}s= ns=109s= 1e-9 s 秒
%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=106s= 1e-6 s 秒
    • Nano 纳妙 n s = 1 0 − 9 s = ns = 10^{-9}s= ns=109s= 1e-9 s 秒
  • 显而易见 第二个更快

  • 时间复杂度排序:

符号 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(nlogn) 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<α<
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值