Big o 大混乱

Big o 大混乱,big-o,Big O,我正在测试我制作的一些函数,并试图找出时间复杂度。 我的问题是,即使在阅读了一些关于Big O的文章后,我也无法理解以下内容: 1000个循环:15000个对象:时间6 1000个循环:30000个对象:时间9 1000个循环:60000个对象:时间15 1000个循环:120000个对象:时间75 前两次之间的差异是3毫秒,然后是6毫秒,然后是60毫秒,因此每次迭代的时间加倍。我知道这不是O(n),我想这不是O(logn) 当我尝试不同的数据集时,时间并不总是增加。例如,以这个序列(ms):1

我正在测试我制作的一些函数,并试图找出时间复杂度。 我的问题是,即使在阅读了一些关于Big O的文章后,我也无法理解以下内容:

1000个循环:15000个对象:时间6

1000个循环:30000个对象:时间9

1000个循环:60000个对象:时间15

1000个循环:120000个对象:时间75

前两次之间的差异是3毫秒,然后是6毫秒,然后是60毫秒,因此每次迭代的时间加倍。我知道这不是O(n),我想这不是O(logn)

当我尝试不同的数据集时,时间并不总是增加。例如,以这个序列(ms):11-17-26-90-78-173-300为例

78毫秒看起来不合适。这可能吗

编辑: NVM,我得和我的大学导师好好谈谈。 时间的输出因变量不同而相差太大。 谢谢那些试图帮助我的人

假设你不能仅从理论上得到O(n),那么我认为你需要研究O(n)中更多的数量级——至少三个,最好是六个或更多(你只需要进行实验,看看n中需要什么变化)。如果有必要的话,让它通宵运行。然后以对数方式绘制结果

基本上我怀疑你现在看到的是噪音

假设你不能从理论上得到O(n),那么我认为你需要研究O(n)中更多的数量级——至少三个,最好是六个或更多(你只需要实验看看n中需要什么变化)。如果有必要的话,让它通宵运行。然后以对数方式绘制结果


基本上我怀疑你现在看到的是噪音

大O表示法并不是一个操作完成所需的确切时间。这是一个(非常粗略的)估计,各种算法如何在输入大小变化时进行渐近比较,用一般的“步骤”表示。这就是“对于N个元素的输入,我的算法要执行多少步?”

说到这里,请注意,在大O表示法中,常量被忽略。因此,在每次迭代中对N个元素进行100次计算的循环将是100*N,但仍然等于O(N)。类似地,执行10000次计算的循环仍然是O(N)

因此,在您的示例中,如果您有以下内容:

for(int i = 0; i < 1000; i++)
   for(int j = 0; j < N; j++)
      // computations
for(int i=0;i<1000;i++)
对于(int j=0;j
它将是1000*N=O(N)


Big O只是一个简化的算法运行时间估计,它基本上表示如果一个算法有运行时间O(N),另一个算法有运行时间O(N^2)然后,对于某些值N,第一个值最终将比第二个值快。当然,这个估计没有考虑与底层平台相关的任何内容,如CPU速度、缓存、I/O瓶颈等。

大O表示法并不是指操作完成所需的确切时间。这是一个(非常粗略的)估计,各种算法如何在输入大小变化时进行渐近比较,用一般的“步骤”表示。这就是“对于N个元素的输入,我的算法要执行多少步?”

说到这里,请注意,在大O表示法中,常量被忽略。因此,在每次迭代中对N个元素进行100次计算的循环将是100*N,但仍然等于O(N)。类似地,执行10000次计算的循环仍然是O(N)

因此,在您的示例中,如果您有以下内容:

for(int i = 0; i < 1000; i++)
   for(int j = 0; j < N; j++)
      // computations
for(int i=0;i<1000;i++)
对于(int j=0;j
它将是1000*N=O(N)


Big O只是一个简化的算法运行时间估计,它基本上表示如果一个算法有运行时间O(N),另一个算法有运行时间O(N^2)那么,对于N的某个值,第一个最终将比第二个快。这个估计当然没有考虑任何与底层平台相关的因素,如CPU速度、缓存、I/O瓶颈等。

如果没有看到您的实际算法,我只能猜测: 如果您允许3ms的恒定初始化开销,则最终会导致

1000x15,000 = (OH:3) + 3
1000x30,000 = (OH:3) + 6
1000x60,000 = (OH:3) + 12
在我看来,这似乎是O(n)


不同数据集的时间戳差异可能是由许多因素造成的。

没有看到实际的算法,我只能猜测: 如果您允许3ms的恒定初始化开销,则最终会导致

1000x15,000 = (OH:3) + 3
1000x30,000 = (OH:3) + 6
1000x60,000 = (OH:3) + 12
在我看来,这似乎是O(n)


不同数据集的时间戳差异可能是由许多因素造成的。

Big O只有一个渐近意义。这与措施无关。这是一种表达理论行为的方式,用于增加程序或算法的大量输入。换句话说,它回答了一个问题——“这个规模有多大?”我知道什么是大O。我就是搞不懂这个数据输出的大O复杂性。你不能从数据输出中得到大O。您可以从算法中得到它。在这种情况下,数据输出是函数完成的时间(毫秒)。从这一点,我应该能够得出大O的结论,对吗?算法在此函数中执行。否则你会怎么做?大O只有一个渐进的意义。这与措施无关。这是一种表达理论行为的方式,用于增加程序或算法的大量输入。换句话说,它回答了一个问题——“这个规模有多大?”我知道什么是大O。我就是搞不懂这个数据输出的大O复杂性。你不能从数据输出中得到大O。您可以从算法中得到它。在这种情况下,数据输出是函数完成的时间(毫秒)。从这一点,我应该能够得出大O的结论,对吗?算法在此函数中执行。否则你会怎么做呢?这是一个非常简单的函数。对于这样一个大学作业来说,通宵运行它会有点过头。我将如何绘制这些数据?我是你