📜  Python|使用Python可视化 O(n)

📅  最后修改于: 2022-05-13 01:54:19.272000             🧑  作者: Mango

Python|使用Python可视化 O(n)

介绍

算法复杂性可能是一个难以掌握的概念,即使提出了令人信服的数学论据。本文介绍了一个小型Python程序,该程序显示了几个典型函数的相对复杂性。它可以很容易地适应其他功能。

复杂。为什么重要?

计算复杂性是计算机科学中一个古老的学科。它可以定义为算法解决问题实例所需的时间和空间量。

计算复杂性的基础是数学,但其含义非常实用。有些问题是“棘手的”。它们并非不可能(即不可判定),但没有已知的有效算法。那就是:它们很难用今天的技术解决,甚至用可预见的技术也是如此。

通常,最坏的情况是最好的

计算复杂性中最流行的分析是最坏情况。尽管它很悲观,但它是非常有道理的:愿意解决的问题的规模随着时间的推移而增加。我们想要处理 PB 级的数据,而不是兆字节。因此,大小是算法复杂度中最重要的因素。

将输入大小视为自变量,增长率为因变量,并尝试分析其随着输入大小增长到无穷大时的性能。这种分析称为big-Oh并且有许多规则,您可以在任何好的算法教科书中查阅。最重要的一点是常量不会影响大输入的算法性能。再次,原因是输入的大小是最重要的因素,常数不依赖于输入的大小。

比较Python中的函数增长

计算理论的新手经常对指数函数像这样的事实感到困惑e^{n}比多项式函数差,比如n^{100} .从 Big-Oh函数的数学定义中可以清楚地看出这一点,但除非我们认为我们占很大,否则不容易看出n .

以下Python代码可视化了随着问题实例 (N) 增加几个函数时的增长: log n, n, n^{3}, e^{n} .注意n^{3}被认为是一个糟糕的表现,因为它需要10^{9}处理 1000 个输入的操作。一般来说, n^{k} k>=2 时被认为是不好的。

该代码使用库 NumPy 和 MatPlotLib 并采用称为柯里化的函数式编程技术来计算n^{k}对于常数k 。通过修改列表FUNCTIONS很容易计算其他函数。

代码:解释几个函数的渐近行为的Python代码。

# Python code that compares the 
# asymptotic behaviour of several functions
  
import numpy as np
import matplotlib.pyplot as plt
  
# Returns a function that computes x ^ n for a given n
def poly(n):
    def polyXN(x):
        return x**n
    return polyXN
  
# Functions to compare and colors to use in the graph
FUNCTIONS = [np.log, poly(1), poly(2), poly(3), np.exp]
COLORS = ['c', 'b', 'm', 'y', 'r']
  
# Plot the graphs 
def compareAsymptotic(n):
    x = np.arange(1, n, 1)
    plt.title('O(n) for n ='+str(n))
    for f, c in zip(FUNCTIONS, COLORS):
        plt.plot(x, f(x), c)
    plt.show()
          
compareAsymptotic(3)
compareAsymptotic(5)
compareAsymptotic(10)
compareAsymptotic(20)

结果并不令人惊讶:指数函数的性能最差,因为它在输入大小的情况下增长得非常快。对于 N=20,其他函数与指数函数相比微不足道。

对数以青色显示,多项式以蓝色、洋红色和黄色显示,指数以红色显示。