确定这个例子的重要性

时间:2018-01-25 20:14:42

标签: big-o computer-science

所以我前几天在我的测试中得到了这个问题并回答了错误的问题,但我不知道我的'新'答案是否真的是正确的。我所有的同学都无法给我一个直接的答案,所以这就是我在这里问你们的原因。

所以基本上这个问题说,“出于不同的测试,下一张桌子已经编好了,这个算法的大O会是什么?”。在此示例中,表格的左侧是元素的数量,右侧是处理所需的时间。

enter image description here

所以我的新答案实际上是O(n),因为大约两倍的元素数量需要花费的时间翻倍。但在这里,我想知道这究竟是正确的吗?我的big-O符号应该更具体吗?可以忽略时间上的微小差异,并且它的时间不是两倍吗?

4 个答案:

答案 0 :(得分:2)

正如你所说" O(n),因为花费大约两倍的元素所花费的时间加倍了#34;因为" n"在O(n)中是一个函数,并且它并不意味着时间上的1到1的关系,如果速度变为线性则它是O(n),如果时间是,则它可以是线性的( n * 1/2 + 1)或(n * 2)或(n + 1)按时间元素。所以现在你的答案是正确的。

答案 1 :(得分:1)

对于O(n),它不必线性地完全 。只是结果图大致呈线性这一事实强烈表明我们确实在处理O(n)的复杂性。

查看the plot of the data,这使得线性特性非常明显!

答案 2 :(得分:0)

如果您实际划分了连续的术语,那么当n加倍时,数据看起来就像那样,相应的运行时间会增加一个徘徊在2.2左右的因子。如果这不仅仅是一次事故,而是指示运行时的真正渐近行为,那么它确实几乎线性,但并不完全。也就是说,函数可能更像是这样:

T(n) = 10 * 2.2 ^ (log_2(n/5000))

价值表:

n      T(n)
5000   10
10000  22
20000  48
40000  106
80000  234
160000 515

在这种情况下,一些快速代数显示

T(n) = 10 * 2.2 ^ (log_2(n/5000))
     = 10 * 2 ^ (log_2(2.2)log_2(n/5000))
     = 10 * (n/5000)^log_2(2.2)
     ~ 10 * (n/5000)^1.1375

也许这是一个更好的答案,也许更糟。无法说出任何有限样本的渐近行为是什么,但这个答案 - O(n ^ log(2.2)) - 可能会更充分地利用所有可用数据。

答案 3 :(得分:0)

我不太确定,但我会将其计算为O(n ^ 0.26)