确定这个例子的 big-o

Determening the big-o of this example

所以前几天我在考试中遇到了这道题,但我答错了,但我不知道我的 'new' 答案是否真的正确。我所有的同学也不能直接给我一个答案,所以我才在这里问你们。

所以问题基本上是 "Out of different tests, the next table has been made up, what would the big-O of the alghorithm be?"。在此示例中,table 的左侧是元素的数量,右侧是处理所需的时间。

所以我的新答案实际上是 O(n),因为经过两倍数量的元素所需的时间大约翻了一番。但在这里我想知道这真的是正确的吗?我应该在我的大 O 符号中更具体吗?忽略时间上的微小差异是否可以,而且时间不完全是原来的两倍?

正如你说的那样"O(n), because the time it takes to go through twice the amount of elements aproximately is doubled"因为O(n)中的"n"是一个函数,并不表示时间上正好是1比1的关系,是O(n)如果速度呈线性,并且如果时间按时间元素为 (n * 1/2 + 1) 或 (n * 2) 或 (n + 1) 则可能是线性的。所以你现在的回答是正确的。

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

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

如果您实际划分连续项,数据看起来像 n 翻倍时,相应的运行时间增加了一个徘徊在 2.2 左右的因子。如果这不仅仅是意外,而是表明运行时的真实渐近行为,那么它确实 几乎 线性,但不完全是。即函数可能更像这样:

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

Table 个值:

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)) - 可能会更充分地利用所有可用数据。

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