作业:我如何计算这个函数的时间复杂度?
Posted
技术标签:
【中文标题】作业:我如何计算这个函数的时间复杂度?【英文标题】:Homework: How do i calculate the time complexity of this function? 【发布时间】:2020-03-14 08:44:39 【问题描述】:void func(int n)
int i=1, k=n;
while (i<=k)
k=k/2;
i = i*2;
我如何计算这个函数的时间复杂度?我知道 i=1, k=n 的赋值需要两个基本步骤,将 k 的值除以 i 的值也需要两个基本步骤,但是因为 i 和 k 的值呈指数增长和下降,时间复杂度是O(log base 4 N)还是O(log base 2 sqrt(N))?
【问题讨论】:
我认为它是 O(log2(n)/2)。如果您忽略k=k/2
,那么它是 log2(n),因为 i
本质上是 2^m
,其中 m 是从 0 开始的迭代次数。
您必须考虑它必须执行多少步骤。您可以放心地忽略分配变量所需的恒定时间。您从 i = 1 和 k = n 开始,并且在每个循环中,您将 i 加倍并使 k 减半,本质上您会发现 x 其中函数 n/(2^x) 和 1 * (2^x) “满足在中间”。对此持保留态度,但我觉得它应该是 O(log4(n)) (我建议你在纸上写几个迭代)
或者换句话说,它是 O(log n),因为上面的两个 cmets 是用不同的方式编写的。
【参考方案1】:
你的答案是 O(log √n),在 cmets 中 @Eraklon 说是 O((log2 n)/2),@matri70boss 说是 O(log4 n)。你们三个都是正确的,但最简单的答案是 O(log n)。
log √n = log n0.5 = 0.5 log n,当我们用大 O 表示法书写时,我们舍弃了常数因子 0.5。 (log2 n)/2 = (log n)/(2 log 2) by change of base identity,而 1/(2 log 2) 是我们可以丢弃的另一个常数因子。 同样,log4 n = (log n)/(log 4),我们可以丢弃常数因子 1/(log 4)。【讨论】:
以上是关于作业:我如何计算这个函数的时间复杂度?的主要内容,如果未能解决你的问题,请参考以下文章