Algorithm 时间复杂度为O(logn^3/M)的算法
我正在尝试编写一个时间复杂度为O(logn^3/M)的算法。但是,我不确定日志N/M部分。如果有人能确认我的算法是否正确,我将不胜感激Algorithm 时间复杂度为O(logn^3/M)的算法,algorithm,time-complexity,Algorithm,Time Complexity,我正在尝试编写一个时间复杂度为O(logn^3/M)的算法。但是,我不确定日志N/M部分。如果有人能确认我的算法是否正确,我将不胜感激 for (int i = 1; i < N; i = i*2) // log N for (int i = 1; i < N; i = i*2) // log N *for (int i = 1; i < N; i += M+i*2) // log N/M for(int i=1;i
for (int i = 1; i < N; i = i*2) // log N
for (int i = 1; i < N; i = i*2) // log N
*for (int i = 1; i < N; i += M+i*2) // log N/M
for(int i=1;i
*如果(for(inti=1;i
具有O(N/M)时间复杂度,并且O(logn)要求将i
乘以一个常数,那么得出的结论是,如果我们将该常数与i
相加,同时将其乘以另一个常数,就可以得到O(logn/M)
O(N/logn)时间复杂度的算法是什么?我认为:
for(int i=1;i
不是O(log(N/M))
因为假设循环将运行k次,那么我们有:
k*M+2^k>=N->这不会导致k=O(log(N/M))
相反,你可以写:
for (int i = 1; i < N/M; i =i*2)
for(int i=1;i
这显然是O(log(N/M))。你是指log(N^3/M)还是log(N^3)/M?问题的最后一部分。O(log(N^3/M))是正确的。你反复使用相同的索引(总是
i
),因此代码不会编译。另外,中间的循环是在i
时迭代的,我想你的意思是i
。我知道代码不会编译。我在所有三个循环中都使用了I
,以使其尽可能简单。我的意思是I
。如果我正确理解大O符号,那么O(logn^3/M)等于O(logn)+O(logn)+O(logn/M)。这个方程应该是类似于3^k+M*3^k=N的,这应该导致k=O(logn/M))。但我同意你建议的循环更好!你确定i+=i*2
正确吗?它不应该是i=i*2
?