【问题标题】:How to calculate O(n, x) for a given algorithms by examples? [closed]如何通过示例计算给定算法的 O(n, x)? [关闭]
【发布时间】:2012-11-25 17:30:55
【问题描述】:

我想根据 n 和 x 计算给定算法的运行时间 O(n, x) = Theta(n, x) 大量(> 100)个示例(算法需要多长时间n 和 x)。 真的有办法做到这一点吗?

我知道运行时间会随着 n 和 x (!) 的增加而增加,但我认为连贯性太复杂而无法通过“手动”计算出 O(n, x),因为 n 或 x mac 会像 n 一样增加 ^ x,甚至更糟。

顺便说一句。我最喜欢解决这个问题的语言是 Python 或 PHP。

【问题讨论】:

  • 我认为通过经验而不是分析来做这件事的希望不大。
  • Big-O 符号不一定与实际运行时间相关。并且运行时间不一定随着 n 增加。您应该能够通过分析来确定算法的 Big-O 效率;你不应该尝试根据实际的数值数据来计算它。
  • 与您通过实验确定任何事物的方式相同——在许多不同的n 处测量常数 x(或少数几个)的时间。查看图表并将其拟合为合理的值,看看它是否增加为nn**2 等。对x 执行相同的操作。希望你做对了。必要时重新评估。当然,你也没有排除交叉项的可能性(O(n*x))。对此你无能为力...
  • 什么是O(n, x)?我熟悉 Big-Oh 的常见定义,但我以前从未见过这种表示法。
  • @phant0m -- 我认为这只是 Big-Oh,但在功能依赖性未知的 2 个变量中。例如O(n*m) => Theta(n,m) ...(但我只是在这里猜测)

标签: python algorithm computer-science asymptotic-complexity


【解决方案1】:

有一个名为Eureqa 的免费工具可能会让您感兴趣。你可以给它数据,它会找到适合你数据的候选方程。例如,您在不同的输入大小上运行算法并记录每个的执行时间,然后将这些数据提供给 Eureqa。然后它会为您提供适合您数据的数学方程式。

许多算法的运行时间高度依赖于输入数据中的特定值。因此,这并不总是用于进行渐近分析的好方法,因为您只是不知道您的数据是否将算法推向了极限。

但是,我们使用渐近分析作为达到目的的一种手段 - 我们经常希望选择一种算法,该算法可能在现实世界中对现实世界的数据运行良好。而且,这就像基准测试,但你会获得额外的数学洞察力。另外,请记住,渐近分析本身有点让步,我们需要简化并降低我们的期望以获得一些简单到有用的答案。

观看他们的 youtube 视频http://www.youtube.com/watch?v=NhC1Qb-PQ5Q

【讨论】:

  • 我一定要试试这个,非常感谢!
【解决方案2】:

最好的方法是仔细查看算法并分析每个步骤以计算平均和最坏情况运行时类。

如果这不可行,您可以使用相对较小的数字运行算法,并将它们相互比较。如果运行时间按任何参数的顺序是指数的,那么即使相差 10 或 20,它也应该是显而易见的。简单地绘制运行时间,比如说

  • x = 10 和 y 在范围内 (50)
  • y = 10 且 x 在范围内 (50)
  • x 在范围内(50),y=x

应该给你一个粗略的想法。当运行时间变大时,您可以提前中止,例如大于 (1,1) 运行时间的 10000 倍。

这应该会给您一个粗略的估计,但您应该清楚它既不精确(您的测试数据可能不经意间遵循某些模式并遇到一个好的案例)也不足够(所涉及的因素可能非常小 - 您不会的) t 正确识别,例如,x + 0.0001 * 1.05^y)。幸运的是,在许多情况下,指数算法的基数明显大于 1。

在 Python 中,您可以使用 timeit 模块来正确测量运行时。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-06
    • 2014-04-30
    • 2021-07-04
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    相关资源
    最近更新 更多