Python|使用Python可视化 O(n)
介绍
算法复杂性可能是一个难以掌握的概念,即使提出了令人信服的数学论据。本文介绍了一个小型Python程序,该程序显示了几个典型函数的相对复杂性。它可以很容易地适应其他功能。
复杂。为什么重要?
计算复杂性是计算机科学中一个古老的学科。它可以定义为算法解决问题实例所需的时间和空间量。
计算复杂性的基础是数学,但其含义非常实用。有些问题是“棘手的”。它们并非不可能(即不可判定),但没有已知的有效算法。那就是:它们很难用今天的技术解决,甚至用可预见的技术也是如此。
通常,最坏的情况是最好的
计算复杂性中最流行的分析是最坏情况。尽管它很悲观,但它是非常有道理的:愿意解决的问题的规模随着时间的推移而增加。我们想要处理 PB 级的数据,而不是兆字节。因此,大小是算法复杂度中最重要的因素。
将输入大小视为自变量,增长率为因变量,并尝试分析其随着输入大小增长到无穷大时的性能。这种分析称为big-Oh并且有许多规则,您可以在任何好的算法教科书中查阅。最重要的一点是常量不会影响大输入的算法性能。再次,原因是输入的大小是最重要的因素,常数不依赖于输入的大小。
比较Python中的函数增长
计算理论的新手经常对指数函数像这样的事实感到困惑比多项式函数差,比如 .从 Big-Oh函数的数学定义中可以清楚地看出这一点,但除非我们认为我们占很大,否则不容易看出 .
以下Python代码可视化了随着问题实例 (N) 增加几个函数时的增长: .注意被认为是一个糟糕的表现,因为它需要处理 1000 个输入的操作。一般来说, k>=2 时被认为是不好的。
该代码使用库 NumPy 和 MatPlotLib 并采用称为柯里化的函数式编程技术来计算对于常数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,其他函数与指数函数相比微不足道。
对数以青色显示,多项式以蓝色、洋红色和黄色显示,指数以红色显示。