【发布时间】:2018-04-15 15:00:56
【问题描述】:
所以我有点不确定这个时间复杂度到底应该叫什么(我认为是O(N^2),但我不确定我是否可以这样称呼它)
void solve(int[] nums, int k){
int len = nums.length;
while(len > 0){
for(int i = 0; i < len; i++){ System.out.println("hello"); }
len-=k;
}
}
所以我意识到它是:n + n-k + n-2k + n-3k + ...
我知道我不会在每次迭代中将搜索空间减半,因此显然不是 n*log(n) 其中 n 是数组的大小。我确实意识到它类似于发散系列(1+2+3+4+...);,因此,我之前的假设是O(N^2) == n(n+1)/2,但我真的可以这样称呼它吗?谢谢。
【问题讨论】:
-
哇,这让我意识到它是 O(n*n/k),它只是 O(n^2/k),其中 k 是一些常数。谢谢。
-
注意,如果
k和你函数的参数一样,那么k不是常量,而是变量。您的复杂性分析必须依赖于 n(即nums的长度)和k。 -
len <= 0可能应该是len > 0。并且乘以一个常数不会改变 big-O 复杂度,所以 O(k*f(n)) = O(f(n)) - 但这仅当k实际上是一个常数,而不是输入。