给出概率界限的大O符号?

时间:2017-09-07 14:14:53

标签: python algorithm runtime complexity-theory

我试图估算以下算法的运行时复杂性:

for i in range(0, len(arr)):
    for j in range(i+1, len(arr)):
        if distance(arr[i], arr[j]) > 2:
            pass

距离函数的复杂性为min(len(arg1), len(arg2))。从理论上讲,参数的最大长度可以达到N,但实际上它通常超过N的20%。

由此,我可以将运行时函数估计为:

f(N)= N *(N / 2)*(N * .2)

O O(N ^ 2)是大O符号还是O(N ^ 3)?如果它是O(n ^ 3),那么在实践中如何证明运行时总是更接近O(n ^ 2)而不是O(n ^ 3)?

由于

3 个答案:

答案 0 :(得分:2)

你问:

  

如果它是O(n ^ 3),那么在实践中如何证明运行时总是更接近O(n ^ 2)而不是O(n ^ 3)?

答案是"更近"无所谓。只有"大于"和"小于"物。

Big O给出上限

如果过程的运行时复杂度最终超过c * n ^ 2,对于任何常数c或更大且n值足够大,那么它不可能是O(n ^ 2)。

那是因为big-O运算符没有给出估计值;它给出了上限。即使是在恒定时间内运行的程序仍然是O(n ^ 3)。 (它也是O(n ^ 2),O(log(n)),O(n!)等等)。这是因为它比某些常数乘数c和大值n的所有运行时间要小。

一个具体的例子

为了具体考虑,请考虑以下事项:

>>> def fa(n):
...     return n * n * n // 10
... 
>>> def f2(n):
...     return n * n
... 
>>> def f3(n):
...     return n * n * n
... 

对于上述运行时和小nfa仍然小于或等于f2

>>> fa(10), f2(10), f3(10)
(100, 100, 1000)

但如果我们将n乘以10,fa超过f2

>>> fa(100), f2(100), f3(100)
(100000, 10000, 1000000)

即使我们通过常数乘数f2提升c也不难看出,我们仍然可以找到n的值{{1}更大。

fa(n)

为什么要使用常数乘数?

您可能仍会觉得令人困惑的是,运行时为n ^ 3 * 0.1的过程与运行时为1000 * n ^ 3的过程属于同一大O类别。毕竟,这两个运行时间之间的绝对差异是巨大的!

这有点难以解释,但当你提醒自己大O符号应该描述缩放行为时,它就开始变得有意义了。或者,换句话说,当我们更改用于测量的单位的大小时,大O符号应该描述运行时的变化。

让我们举一个具体的例子:想象你想知道建筑物的高度。并且假设有人说"哦,它大约300米。"你可能会对这种反应感到满意;你可能不在乎它真的是315米; 300是一个足够好的估计。但是,如果相反,他们说"哦,它大约300米......或者是300英尺?"您可能会感到不那么满意,因为300米将是300英尺的三倍多。

在计算机科学中,我们在测量时间时确实存在这个问题。事实上,情况更糟。不同的计算机可能比其他计算机更快或更慢。如果我们在计算机执行的计算次数中测量时间,"然后对于某些计算机,我们将以百分之一秒的速度测量时间,而对于其他计算机,我们将以十亿分之一的速度测量时间。如果我们想要以不会被这个巨大差异扭曲的方式来描述算法的行为,那么我们需要一个"尺度不变的测量" - 也就是说,我们使用百分之几秒或十亿分之一秒作为我们的单位,给出相同答案的测量。

Big O表示法提供了这样的衡量标准。它为我们提供了一种测量运行时间的方法,而无需担心我们用于测量时间的单位的大小。从本质上讲,算法是O(n ^ 2)说,对于任何等于或大于某个值c的时间单位,n都有一个对应的值,这样我们的过程就会在c * n ^ 2之前完成对于所有较大的n值。

估算运行时

如果您想谈论估算运行时,那么您需要一个名为" big theta的测量。"有关详细信息,请查看this answer。简而言之,对于任意大的乘数c,大O给出上界;对于任意大的乘数c,大欧米茄给出下界;而big theta给出了一个定义上限和下限的函数,具体取决于乘数c的选择。

在你的情况下,大的theta值将是O(n ^ 3),因为你可以选择一个常数乘数c1,使得c1 * n ^ 3总是大于n ^ 3/10,你可以选择一个常数乘数c2使得c2 * n ^ 3总是小于n ^ 3/10。

答案 1 :(得分:1)

它仍然是O(n^3)。可能很容易认为O(0.0000001 * n^3)O(n^2)“更好”。但是,如果我们讨论algorythm的理论复杂性,那么只需假设n可以与10^100一样大,并且您将始终理解O(n^3)在性能方面“更差”。

答案 2 :(得分:1)

len(arr)= N

由于原始状态在第二个循环内部,让我们看看它运行了多少次。

内循环

第一次

N-1

N-2 第二次。

N-3 第三次。

... ... ...

N-1 )次

1 次。

显然总和将是=( N-1 )( N )/ 2 = X (说)。距离函数执行 X 次,在渐近分析中,我们考虑最坏情况,这意味着距离函数的复杂度为= O( N )。

因此T(N)=(( N-1 )( N )/ 2 N = Y (比如说)

使用 Big O

的定义

Y < = c N ^ 3),对于所有 n > = 1,和 c = 1。

因此T( N )= O( N ^ 3)