所以我前几天在我的测试中得到了这个问题并回答了错误的问题,但我不知道我的'新'答案是否真的是正确的。我所有的同学都无法给我一个直接的答案,所以这就是我在这里问你们的原因。
所以基本上这个问题说,“出于不同的测试,下一张桌子已经编好了,这个算法的大O会是什么?”。在此示例中,表格的左侧是元素的数量,右侧是处理所需的时间。
所以我的新答案实际上是O(n),因为大约两倍的元素数量需要花费的时间翻倍。但在这里,我想知道这究竟是正确的吗?我的big-O符号应该更具体吗?可以忽略时间上的微小差异,并且它的时间不是两倍吗?
答案 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)