【发布时间】:2020-05-29 09:53:09
【问题描述】:
作为一名非计算机科学家,我发现理解时间复杂度及其计算方式有点困难,所以我的问题是,某个算法/程序的时间复杂度是否可以通过越来越多地运行而得出大输入数据,然后看看运行时相对于输入大小的增加如何变化n。
我问这个是因为我用 C++ 编写了一个算法,它基本上使用单个 cpu 内核和单个线程(3GHZ 处理器)对 2D 图像进行像素着色。我测量了从2^4 到2^30 的输入大小的运行时间,这是一个大小为32,768 ** 2 的矩阵。现在我有了这个关于我的运行时如何作为输入大小的函数n 的图表:
所以对于n = 2^4 to 2^30 的输入大小,确切的运行时间是(按行):
[1] 0.000 0.000 0.000 0.000 0.000 0.000 0.000
[8] 0.000 0.000 0.000 0.000 0.001 0.000 0.000
[15] 0.002 0.004 0.013 0.018 0.053 0.079 0.231
[22] 0.358 0.963 1.772 4.626 9.713 25.582
现在这有点奇怪,因为当 2 的幂从奇数变为偶数时,运行时间仅增加了 1.5,但当它从偶数变为奇数时,运行时间增加了三倍。因此,当我将输入加倍时,我的运行时间平均增加了(3 + 1.5) / 2 = 2.25 的倍数。事实上,似乎当 n 变得任意大时,来自Odd to even 和even to Odd 的幂参数的变化都会导致运行时间乘以常数 2.25,换句话说:随着 n 变大,运行时间乘数收敛到 2.25。
如果我的算法相当复杂,有没有办法从这个分析中说明它的时间复杂度?
【问题讨论】:
-
时间复杂度是一个数学指标,通常独立于实现来考虑,所以我想说你不能用实验结果来得出关于算法的时间复杂度的结论。不过,您可以使用这些结果得出关于某些用例中当前实现的可扩展性和通常行为的结论。它仍然是一个非常重要的度量,例如在矩阵乘法方面,我们不使用最快的算法,而是使用最有效的实现。
-
我认为这只是将曲线拟合到某些数据点的问题。奇怪的时间可能是由于缓存效应。
标签: algorithm time-complexity runtime big-o