for i := 1 to n do
j := 2;
while j < i do
j := j^4;
当谈到Big-O符号时我真的很困惑,所以我想知道它是否是O(n log n)。这是我的直觉,但我无法证明这一点。我知道while循环可能比log n快,但我不知道多少!
编辑:插入符号表示指数。
答案 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。