哪种算法更好?

时间:2013-12-08 01:41:38

标签: complexity-theory big-o

我有两种算法。

第一个的复杂性介于Ω(n ^ 2 *(logn)^ 2)和O(n ^ 3)之间。

第二个的复杂性是ω(n * log(logn))。

我知道O(n ^ 3)告诉我它不能比n ^ 3差,但我不知道Ω和ω之间的差异。有人可以解释一下吗?

2 个答案:

答案 0 :(得分:1)

Big-O:算法的渐近最坏情况性能。函数n恰好是最低值函数,其总是具有比算法的实际运行更高的值。 [常数因子被忽略,因为当n达到无穷大时它们毫无意义]

Big-Ω:与Big-O相反。算法的渐近最佳案例性能。函数n碰巧是最高值函数,其总是具有比算法的实际运行更低的值。 [常数因子被忽略,因为当n达到无穷大时它们毫无意义]

Big-Θ:算法运行良好,某些函数n可以描述算法在某个常数值c定义的范围内的上限和下限。一个算法就可以有这样的东西:BigTheta(n),O(c1n),BigOmega(-c2n),其中n == n。

Little-o:就像Big-O一样邋..当你走向无限时,Big-O和实际的算法性能实际上几乎相同。 little-o只是一些总是比实际性能更大的功能。示例:对于可能实际具有线性或O(n)性能的函数,o(n ^ 7)是一个有效的little-o。

Little-ω:恰恰相反。 w(1)[常数时间]对于相同的上述函数来说可能是一个有效的小欧米茄,可能实际上超过了BigOmega(n)的性能。

enter image description here

答案 1 :(得分:0)

大欧米茄(Ω)下限:

当且仅当存在c时,函数f是集Ω(g)的元素(通常写为 f(n)=Ω(g(n))) ; 0,并且存在n0> 0(可能取决于c),这样,对于每个n> = n0,以下不等式为真:

f(n) >= c * g(n)

小欧米茄(ω)下限:

函数f是集合ω(g)的元素(通常写为 f(n)=ω(g(n)))当且仅对于每个c> 1。 0我们可以找到n0> 0(取决于c),使得对于每个n> = n0,以下不等式为真:

f(n) >= c * g(n)

你可以看到它在两种情况下实际上都是相同的不等式,区别仅在于我们如何定义或选择常数c。这种微小的差异意味着ω(...)在概念上类似于小o(...)。甚至更多 - 如果f(n)=ω(g(n)),则g(n)= o(f(n)),反之亦然。

回到你的两个算法 - 算法#1受到双方的限制,所以看起来对我来说更有希望。对于任何(任意大的)c,算法#2的工作时间可能比c * n * log(log(n))长,因此对于某些n,它最终可能会松散到算法#1。请记住,它只是渐近分析 - 因此所有都取决于这些常数的实际值和具有一定实际意义的问题大小。