Algorithm 时间复杂度为O(logn^3/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

我正在尝试编写一个时间复杂度为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(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