提问者:小点点

有没有可能创建一个程序,将另一段代码作为输入并告诉您它的Big O时间?


标题基本上,我们可以设计一个输入另一个代码文件的程序,例如Python程序,并且可以告诉你它的时间复杂度吗?

程序可以逐字逐句地读取程序,并可以缩进程序,还可以计算遇到的或while语句的数量。然后它可以看到它们是否嵌套了二次时间。我觉得这不像暂停问题,因为我们不想看它是否会结束,只是看它的时间复杂性。但是,实现递归的算法呢?这样的程序还能写吗?

抱歉,如果这看起来像一个愚蠢的问题,我正在考虑这个问题,并想自己写。


共2个答案

匿名用户

大部分不是。

“没有结束”只是另一个时间复杂度。因此,您无法编写一个程序来确定事物停止的速度,而不先确定它们是否停止。

此外,进入非常困难的问题并不需要很长时间。例如,考虑以下函数:

def hailstone(n):
    answer = 0
    while 1 < n:
        answer += 1
        if 0 == n % 2:
            n = n // 2
        else:
            n = 3*n + 1
    return answer

只是一段时间和一个如果。但是如果你能告诉我这是及时运行的O(n),那么你就解决了Collatz问题。

也就是说,可以为一些有用的代码生成一个上限。然而,对于很多代码来说,所说的上限必须是无穷大的。

匿名用户

您可以通过测量不同大小的数据集的运行时来做到这一点,然后像这样拟合复杂性:

  • 测量复杂性

但是,您仍然需要创建有意义的输入数据,以便可靠地工作,您还需要足够精确的时间测量,并且不要忘记刷新缓存,以防重复使用相同的输入数据...

所以你要注意:

    < li >数据集大小 < li >数据集内容 < li >测量的时间应该至少约为100毫秒

我推荐看看这些:

    < li >您系统上的高速缓存大小估计? < li >使用背靠背rdtsc进行负时钟周期测量?

此外,算法通常仅在某个阈值数据集大小之后才遵循复杂性曲线,因此您可能希望添加某种检测...然后仅使用更大的数据集。

但是请注意,获得的复杂度并不是所用算法的原始复杂度,而是算法和所用计算架构特性的累积,因此结果可能与您预期的不同。