【问题标题】:Is there a library for programmatic manipulation of Big-O complexities?是否有用于对 Big-O 复杂性进行编程操作的库?
【发布时间】:2013-01-24 20:33:48
【问题描述】:

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

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 进行了试验,但我无法在那里找到我需要的开箱即用的东西。

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

编辑:我按照@Patrick87 的建议写了a simple library,它似乎有效。不过,我仍然对这个问题是否有其他解决方案感兴趣。

【问题讨论】:

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


    【解决方案1】:

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

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

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

    编辑 2:我建议不要尝试在不使用计算机代数系统的情况下自己从头开始构建它。您最终将不得不编写自己的计算机代数系统,这是一项繁重的工作,如果您想把它做好并且不让它变慢,甚至需要更多的工作。已经有大量系统已经存在,包括许多可以充当在它们之上构建代码的库(例如 SymPy)。

    【讨论】:

      【解决方案2】:

      实际上,您正在构建/寻找一个表达式简化器,它可以处理:

      • +(用你的话来说:followed_by
      • *****(用你的话来说:inside
      • ^, log, !(表示复杂度)
      • 变量(如n,m
      • 常数(如2^n中的那个)

      例如,你给f_time.inside(g_time).followed_by(h_time),它可能是这样的表达式:

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

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

      所以一般来说,你可能想用common expression simplifier(如果你想让它有趣,去看看Mathemetica是怎么做的)得到一个像n^3+n^(1/2)这样的简化表达式,然后你需要一个额外的处理器从表达式中选择具有最高复杂性的术语并去除其他术语。这很简单,只需使用一个表格来定义每种符号的复杂度顺序。

      请注意,在这种情况下,表达式只是符号,你应该把它写成string(例如:f_time = "O(n)"),而不是函数。

      【讨论】:

        【解决方案3】:

        如果您只使用大 O 表示法并且对一个函数的增长速度是否比另一个函数感兴趣,渐近地说...

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

        【讨论】:

        • “发散到0”是什么意思?
        • @Anonymous Nothing - 不知道我为什么这么写。我想我的意思是“收敛到 0”。
        猜你喜欢
        • 1970-01-01
        • 2017-02-01
        • 2011-02-28
        • 1970-01-01
        • 2014-11-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多