标题基本上,我们可以设计一个输入另一个代码文件的程序,例如Python程序,并且可以告诉你它的时间复杂度吗?
程序可以逐字逐句地读取程序,并可以缩进程序,还可以计算遇到的或while
语句的数量。然后它可以看到它们是否嵌套了二次时间。我觉得这不像暂停问题,因为我们不想看它是否会结束,只是看它的时间复杂性。但是,实现递归的算法呢?这样的程序还能写吗?
抱歉,如果这看起来像一个愚蠢的问题,我正在考虑这个问题,并想自己写。
大部分不是。
“没有结束”只是另一个时间复杂度。因此,您无法编写一个程序来确定事物停止的速度,而不先确定它们是否停止。
此外,进入非常困难的问题并不需要很长时间。例如,考虑以下函数:
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问题。
也就是说,可以为一些有用的代码生成一个上限。然而,对于很多代码来说,所说的上限必须是无穷大的。
您可以通过测量不同大小的数据集的运行时来做到这一点,然后像这样拟合复杂性:
但是,您仍然需要创建有意义的输入数据,以便可靠地工作,您还需要足够精确的时间测量,并且不要忘记刷新缓存,以防重复使用相同的输入数据...
所以你要注意:
我推荐看看这些:
此外,算法通常仅在某个阈值数据集大小之后才遵循复杂性曲线,因此您可能希望添加某种检测...然后仅使用更大的数据集。
但是请注意,获得的复杂度并不是所用算法的原始复杂度,而是算法和所用计算架构特性的累积,因此结果可能与您预期的不同。