performance - 带平方根的 while 循环的运行时间/时间复杂度

标签 performance time-complexity code-analysis

这道题看起来比较简单,但是我好像找不到n的运行时间。

问题是:

j = n;
while(j >= 2) {
    j = j^(1/2)
}

我真的不需要总运行时间,我只需要知道如何计算第二行和第三行被命中的次数(它们应该相同)。我想知道是否也有某种公式可以找到这个。我可以看到上面的内容等同于:

for(j = n; n >= 2; j = j^(1/2)

请注意,操作的类型无关紧要,每次执行一行,都算作 1 个时间单位。所以第 1 行只是 1 个时间单位,第 2 行是:

  • 如果 n 为 1,则为 0 个时间单位,
  • 如果 n 为 2,则为 1 个时间单位,
  • 如果 n 为 4,则为 2 个时间单位,
  • 如果 n 为 16,则为 3 个时间单位,等等。

提前感谢提供帮助的任何人!非常感谢!

最佳答案

向后计算第 2 行的时间单位数:

                                   time
n              n       log_2(n)    units
1              1        0          0
2              2        1          1
4              4        2          2
16             16       4          3
16^2           256      8          4
(16^2)^2       65536    16         5
((16^2)^2)^2)  ...      32         6

换句话说,对于时间单位数tn除了t的情况外都是2^(2^(t-1)) = 0 在这种情况下 n = 1

要扭转这一点,你有

当 n < 2 时 t = 0

t = log2(log2(n)) + 1 当 n >= 2

其中 log2(x) 被称为 binary logarithm的 x。

关于performance - 带平方根的 while 循环的运行时间/时间复杂度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32798251/

相关文章:

javascript - $watch 与 ngChange

java - 在短时间内用 Java 执行数百万个任务?

performance - PHP MYSQL搜索引擎使用关键字

algorithm - 算法的大O

python - 在 python 中将列表转换为元组的时间复杂度,反之亦然

c++ - 在命令行或从 CMake 指定用于 Visual Studio 代码分析的规则集

java - 实现由二维数组中的值支持的模型类的最快、最简洁/正确的方法是什么?

algorithm - 如何解决这个递推关系

LLVM 获取加载指令的可能存储指令

C - 如何使用 grep 查找所有内部循环?