大哦类之间的数学关系

时间:2018-10-09 23:36:46

标签: algorithm big-o complexity-theory

我的教科书将这种关系描述如下:

  

有一个非常好的数学直觉,它也描述了这些类。假设我们有一个算法,当给定大小为n的输入时,运行时间为N0,而大小为2n的输入,运行时间为N1。我们可以用N0和N1之间的关系来描述增长率:

Big-Oh      Relationship

O(log n)    N1 ≈ N0 + c
O(n)        N1 ≈ 2N0
O(n²)       N1 ≈ 4N0
O(2ⁿ)       N1 ≈ (N0)²

这是为什么?

3 个答案:

答案 0 :(得分:2)

这是因为如果f(n)位于O(g(n))中,那么对于某些k * g(n)来说,它可以像k那样起作用。

例如,如果f(n) = O(log(n)),则其行为类似于k log(n),现在类似于f(2n) ≈ k log(2n) = k (log(2) + log(n)) = k log(2) + k log(n) ≈ k log(2) + f(n),这就是您期望的c = k log(2)等式。

请注意,这只是的直觉。发生故障的一个示例是f(n) = (2 + sin(n)) log(n) = O(log(n))。摆动的2 + sin(n)位意味着f(2n)-f(n)基本上可以是任何东西。

我个人认为这种粗略的直觉是令人误解的,因此比没有用的还糟。其他人觉得这很有帮助。自己决定要给它多少重量。

答案 1 :(得分:1)

由于O(f(n)) ~ k * f(n)(几乎是定义),您想看看将2n放入n时会发生什么。在每种情况下:

N1 ≈ k*log 2n = k*(log 2 + log n) = k*log n + k*log 2 ≈ N0 + c where c = k*log 2

N1 ≈ k*(2n) = 2*k*n ≈ 2N0

N1 ≈ k*(2n)^2 = 4*k*n^2 ≈ 4N0

N1 ≈ k*2^(2n) = k*(2^n)^2 ≈ N0*2^n ≈ N0^2/k

所以最后一个不是很正确。请记住,这些关系只是渐近地成立,因此随着n的增大,近似值将更加准确。此外,f(n) = O(g(n))仅表示g(n)f(n)的上限,足以容纳n。因此,f(n) = O(g(n))不一定表示f(n) ~ k*g(n)。理想情况下,您希望这是真实的,因为在这种情况下,big-O的约束会很严格。

答案 2 :(得分:0)

基本上,他们试图显示的只是函数中的2n代替n之后的基本代数。

O(log n)    
log(2n) = log(2) + log(n)
N1 ≈ c + N0

O(n)
2n = 2(n)        
N1 ≈ 2N0

O(n²)       
(2n)^2 = 4n^2 = 4(n^2)
N1 ≈ 4N0

O(2ⁿ)       
2^(2n) = 2^(n*2) = (2^n)^2
N1 ≈ (N0)²