作业:我如何计算这个函数的时间复杂度?

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)。

【讨论】:

以上是关于作业:我如何计算这个函数的时间复杂度?的主要内容,如果未能解决你的问题,请参考以下文章

计算递归函数的时间复杂度

这个计算向量中值的最小差的函数的算法复杂度是多少?

如何计算函数的空间复杂度?

复杂数据流作业的架构

如何计算以下函数的时间复杂度?

计算给定递归函数的精确运行时间(时间复杂度)