Big o 寻找算法运行时间的常数部分

Big o 寻找算法运行时间的常数部分,big-o,time-complexity,Big O,Time Complexity,我有一个运行在O(n logn)中的算法实现,对于n=10^7,该算法需要570 ms。有人知道如何找到我的算法运行时间的常数部分(C)吗?我想要这个,这样我就可以计算出对于任意输入大小,算法“应该”需要多长时间。如果你知道算法的渐进复杂性是O(n log n),那么,仅仅一个数据点,你就无法(准确地)确定未来操作的运行时间。例如,假设你有一个算法,你知道它在时间O(n)内运行,在大小为n的输入上,运行时间是T。你无法准确预测在大小为2T的输入上运行时间是什么,因为不清楚有多少T是由线性函数的斜

我有一个运行在O(n logn)中的算法实现,对于n=10^7,该算法需要570 ms。有人知道如何找到我的算法运行时间的常数部分(C)吗?我想要这个,这样我就可以计算出对于任意输入大小,算法“应该”需要多长时间。

如果你知道算法的渐进复杂性是O(n log n),那么,仅仅一个数据点,你就无法(准确地)确定未来操作的运行时间。例如,假设你有一个算法,你知道它在时间O(n)内运行,在大小为n的输入上,运行时间是T。你无法准确预测在大小为2T的输入上运行时间是什么,因为不清楚有多少T是由线性函数的斜率解释的,有多少是由截距解释的

如果假设N“足够大”,大部分运行时T来自斜率,则可以对未来输入的算法运行时做出合理估计。具体地说,由于函数是线性增长的,因此可以假设如果将输入的大小乘以某个常数k,那么运行时应该是Tk。在您的例子中,函数n logn基本上是线性增长的。由于原木生长非常缓慢,对于足够大的氮来说,它的生长非常平坦。因此,如果您认为N“足够大”,您可以通过将大小N上的运行时缩放系数k来估计大小为kN的输入上的运行时

为了更加准确,您还可以尝试收集更多关于运行时的数据点并进行回归。在线性情况下,如果您知道两个精确的数据点,则可以恢复实际的线性函数,然后进行外推以获得非常精确的运行时预测。对于形式为n log n的某些内容,假设运行时的形式为c0 n log n+c1n+c2n可能是好的。如果你收集了足够的数据点,你可能会将其插入Excel并恢复系数,从中你可以非常准确地推断


希望这有帮助

我认为您无法精确计算它,但是如果您确定复杂性为
O(n log n)
,那么我建议您使用一个简单的比例来估计运行时间:

10^10 log 10^10   unknown run time
--------------- = ----------------
10^7 log 10^7           570 ms
在这种情况下,应该是大约
1428.6*570 ms=~814秒


这在数学上并不完全正确,但如果没有多个数据点来拟合曲线以计算各种常数,这不是一个不合理的起点。

你能测试一下不同的n值吗,差应该给你C?@smk我认为你甚至不需要不同的值。我想我问错了问题,假设我们知道算法需要O(n log n)核心运算,如何计算一个核心操作的成本?你指的是n logn前面的常数,还是某个低阶项的常数?基本上给定了算法的复杂度及其在特定输入大小下的运行时间。我如何估计任何其他输入大小的运行时间。例如,我的算法是O(n logn),输入大小为10^7需要570ms。例如,如果输入大小为10^10,我如何估计它的运行时间而不实际尝试它?这实际上给了我一个不错的近似值