是否有一个程序化操作Big-O复杂性的库?

时间:2013-01-24 20:33:49

标签: python complexity-theory time-complexity asymptotic-complexity sympy

我对可以推断自己时间复杂性的编程语言感兴趣。为此,以某种方式以编程方式表示时间复杂度将非常有用,这将允许我执行以下操作:

f_time = O(n)
g_time = O(n^2)
h_time = O(sqrt(n))

fastest_asymptotically = min(f_time, g_time, h_time)  # = h_time
total_time = f_time.inside(g_time).followed_by(h_time)  # = O(n^3)

我目前正在使用Python,但我并没有特别依赖语言。我已尝试sympy,但我无法在那里找到我需要的东西。

是否有提供此功能的库?如果没有,是否有一种简单的方法可以使用符号数学库进行上述操作?

编辑:我根据a simple library的建议写了@Patrick87,似乎有效。不过,如果还有其他解决方案,我仍然感兴趣。

3 个答案:

答案 0 :(得分:3)

SymPy目前仅支持0的扩展(您可以通过执行移位来模拟其他有限点)。它不支持无穷大的扩展,这是算法分析中使用的。

但它对它来说是一个很好的基础包,如果你实现它,我们很乐意接受一个补丁(nb:我是一个SymPy核心开发人员)。

请注意,一般来说问题很棘手,特别是如果你有两个变量,甚至是符号常量。如果你想支持振荡功能,这也很棘手。编辑:如果您对振荡功能感兴趣,this SymPy邮件列表讨论会提供一些有趣的论文。

编辑2:我建议不要在不使用计算机代数系统的情况下自己从头开始构建。你最终将不得不编写自己的计算机代数系统,这是一项很多工作,如果你想做正确的事情并且不要慢,那就更需要工作。已经存在大量已经存在的系统,其中包括许多可以作为代码构建库的库(例如SymPy)。

答案 1 :(得分:1)

如果您只使用big-O表示法并且对一个函数是否比另一个函数增长更快或更快感兴趣,那么渐渐地说...

  1. 给定函数f和g
  2. 使用计算机代数包将n计算为f(n)/ g(n)的无穷大时计算限制
  3. 如果限制偏离+无穷大,则f> g - 在g = O(f)的意义上,但f!= O(g)。
  4. 如果极限偏离0,则g < F。
  5. 如果极限收敛到有限数,则f = g(在f = O(g)和g = O(f)的意义上)
  6. 如果限制未定义......打败我!

答案 2 :(得分:1)

实际上你正在构建/找到一个可以处理的表达式简化

  • + (根据您的条款:followed_by
  • *****(以您的条件:inside
  • ^,log,!(代表复杂性)
  • 变量(例如nm
  • 常数(与2^n中的相似)

例如,正如您给出的f_time.inside(g_time).followed_by(h_time),它可能是一个表达式:

n*(n^2)+(n^(1/2))

,您希望处理者将其输出为:n^3

所以一般来说,你可能想要使用common expression simplifier(如果你想让它变得有趣,去检查Mathemetica如何做到这一点)来获得像{{1}这样的简化表达式然后你需要一个额外的处理器来从表达式中选择具有最高复杂度的术语并去掉其他术语。这很容易,只需使用表格来定义每种符号的复杂性顺序。

请注意,在这种情况下,表达式只是符号,您应该将其写为n^3+n^(1/2)(对于您的示例:string),而不是函数。