“通过某个常数乘以函数不会改变它的渐近行为”的含义

时间:2016-05-26 07:13:05

标签: algorithm big-o

如果我将它乘以一些常数“K”&,我已经大致将其理解为函数f(n)。 f(n)= O(g(n)):: f(n)< = cg(n)对于某些n> = n1然后如果我使f(n)为K f(n)那么那里必须是一些其他常数c1,通过它我们可以将g(n)和上限(设置一个更高的限制)乘以K f(n)。

我发现难以理解的是书中给出的正确的数学解释:

enter image description here

2 个答案:

答案 0 :(得分:2)

我们假设我们知道函数f(n)位于O(g(n)。这意味着,存在n0c,以便:

f(n) <= c * g(n) \forall n >= n0

现在,如果我们分析K * f(n),则从上面的定义得出:

K * f(n) <= K * c * g(n) \forall n >= n0

我们观察到K * c再次成为常数。因此,我们可以引入另一个常量c' = K * c并写入:

K * f(n) <= c' * g(n) \forall n >= n0

这正是上面的大O定义。最后:

K * f(n) \in O(g(n))

这只是另一个常数。

答案 1 :(得分:0)

它只是意味着无论恒定时间是什么,渐近行为保持不变。例如:

int fact;
for (fact=1;n>1;n--)  fact*=n;

是简单的O(n)阶乘,具有恒定时间c,由循环的单次迭代和乘法fact*=n给出。将此乘以常数意味着c已更改,例如:

int fact;
for (fact=1;n>1;n--)  
 if (bits(fact)+bits(n)<32)
  fact*=n;

现在c更大了,因为我将条件添加到循环中需要一些时间。但是O(n)仍然存在。运行时有什么变化。另一方面,如果我改变这样的代码:

int fact;
for (fact=1;n>1;n--)  
 if (bits(fact)+bits(n)<32) fact*=n;
  else break;

然后我不仅更改了常量时间c,还更改了O(1)的基本渐近上限,因为无论有多大n,当结果达到32位限制时,这将停止这将是足够大的n步长的恒定时间,但这不会乘以粗常数。