这个小代码片段的大O是什么?

时间:2010-09-02 21:45:50

标签: algorithm complexity-theory big-o

for i := 1 to n do
  j := 2;
  while j < i do
    j := j^4;

当谈到Big-O符号时我真的很困惑,所以我想知道它是否是O(n log n)。这是我的直觉,但我无法证明这一点。我知道while循环可能比log n快,但我不知道多少!

编辑:插入符号表示指数。

2 个答案:

答案 0 :(得分:13)

问题是对给定i执行while循环的迭代次数。

在每次迭代j:= j^4和开始j := 2时,x次迭代后j = 2 4^x

j < i相当于x < log_4(log_2(i))

我冒险声明,复杂性为O(n * log_4(log_2(n)))

你可以摆脱Big O符号中的常数因素。 log_4(x) = log(x) / log(4)log(4)是常量。同样,您可以将log_2(x)更改为log(x)。复杂性可以表示为O(n*log(log(n)))

答案 1 :(得分:2)

关闭袖口,我猜是O( n slog 4 n {{3} } 表示slog的倒数。取幂是取幂后的下一个操作。就像乘法是迭代加法一样,取幂是迭代乘法,四分法是迭代求幂。

我的理由是,如果你在每次迭代时将 j 乘以4,那么函数将是O( n log 4 n 的)。但是由于你在每次迭代时对它进行取幂,你需要一个比log更强大的运算符:tetration operator