如果我将它乘以一些常数“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)。
我发现难以理解的是书中给出的正确的数学解释:
答案 0 :(得分:2)
我们假设我们知道函数f(n)
位于O(g(n)
。这意味着,存在n0
和c
,以便:
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
步长的恒定时间,但这不会乘以粗常数。