关于大O符号和复杂性

时间:2014-11-13 03:19:18

标签: algorithm big-o

我目前正在学习Big O Notations,但我根据不同的复杂程度对时间/迭代计算感到困惑。

我解决了这个问题:

  

通过所有可能的解决方案的算法每次测试需要10 ^( - 7)秒。   如果解决方案的数量是以下函数:logn,n,nlog。 n ^ 2,我可以计算的最大n是什么,例如,小于1秒?

我认为(对于案例登录)10 ^ -7次登录必须花费不到1秒:

10^(-7) * logn < 1 <=> n = 10^(1/10^-7)

难以置信的大(如果没错,那该死的 - &#39;)。但是n ^ 2呢?

10^(-7) * n^2 < 1 <=> n = square_root(1/10^-7)

但是,如果复杂性更大,n ^ 2情况下的解决方案数量如何能够小于n中的数量?这让我很困惑......?

3 个答案:

答案 0 :(得分:2)

“这在很多层面都很糟糕。”

首先,O(f(n))与f(n)不同。

复杂性通常用于表示解决问题所需的时间,作为输入的 size 的函数。

当然如果你可以使用X对Y在相同的时间内解决更多的问题,X会在比Y固定的时间内解决更多的问题。但是因为你没有使用以正确的方式表达复杂性一词,你得到(看似)矛盾的答案就不足为奇了。

答案 1 :(得分:1)

您只需将算法上限为10 ^( - 7)秒的实际世界时间,这意味着您的算法将保证在10 ^( - 7)秒内完成所有复杂性。

让我们不要讨论这是否可能实际存在。但是,由于您刚刚定义了算法以在10 ^( - 7)中通过所有可能的解决方案,这意味着无论n是什么,它都将在那个时间内完成。所以你的n是正无穷大。

此外,我不认为您应该使用大O来表示解决方案的数量

答案 2 :(得分:0)

好消息首先没有什么&#34;错误&#34;与你的计算结果。

当然,如果算法的复杂性更高(如O(n ^ 2)复杂度高于O(log n)),那么你仍然可以处理的问题的大小可以接受&#34;可接受的&#34 ;时间会更小,总计根据你的计算。

尽管如此,这个例子看起来有点扭曲,我不得不承认,我并没有完全明白目的,你发明了10 ^ -7因素,因而怀疑,你没有得到这个概念O符号权利。

基本上O符号的主要思想是,在比较两种算法时,你并不关心任何线性因素(比如你在计算中发明的10 ^ 7因子),而只关心计算时间有多快随着问题的大小而增长,因为与问题规模导致的计算时间的增长相比,不变(因此不会增长)的因素迟早会变得无关紧要。

以身作则:

使用O(n ^ 2)算法A,花费时间t = 2 * n ^ 2毫秒和O(log n)算法B,在特定机器上取t = 200 * log(n)毫秒给定问题大小,事情将如下所示:

对于一个非常小的问题,比如n = 10,算法A可能比算法B更快:

2*10^2 = 2*100 = 200 ms
400*log10 = 400*1 = 400 ms

但是随着问题规模越来越大,比如n = 100,算法B迟早会超速算法A:

2*100^2 = 2*10,000 = 20,000 ms
400*log100 = 400*2 = 800 ms

虽然对于更大的问题规模,比如n = 1,000,000,等待A完成可能需要很大的耐心。

2*1,000,000^2 = 2*10^12 ms = 2*10^9 s = 33333333 min = 555555 h = 23148 days = 63 years

算法B可能仍然在可接受的时间内运行。

400*log1,000,000 = 400*6 = 2,400 ms = 2.4 s

随着问题规模不断扩大,不变因素的作用越来越小,越来越大的问题变得越来越无关紧要,因此(与低阶条款一样,遵循相同的规则)在O中遗漏了符号

因此&#34;对&#34;查看O表示法给出的复杂性的方法不是试图查看固定n的固定值,或者甚至重新发明常数因子和已经抽象出来的低阶附加项,而是看看计算时间随着问题大小的增长有多快。

所以,再次举例说明&#34;对&#34;查看O(n ^ 2)和O(log10)的复杂性的方法是比较它们的增长。

如果问题大小增加10倍算法A的计算时间将增加100倍,因此需要100倍的时间,如下:

(n*10)^2 = n^2 * 10^2 = n^2 * 100

虽然算法B的计算时间只会以恒定的数量增长,但是:

log(n*10) = log(n) + log(10) = log(n) + 1