这个循环的时间复杂度乘法

时间:2018-04-24 03:01:49

标签: time-complexity big-o

我想知道这个循环在n

方面的复杂性
for (int i = 1; i <= n; i++) {
   for (int j = 1; j * i <= n; j++) {
     minHeap.offer(arr1[i - 1] + arr2[j - 1]);
   }
}

我所做的是遵循Big-O的概念并给它一个上限 - O(n ^ 2)。

1 个答案:

答案 0 :(得分:2)

这将涉及一些数学,所以准备好了:)

让我们首先计算调用行minHeap.offer(arr1[i - 1] + arr2[j - 1]);的次数。对于外循环中的每个i,内循环的迭代次数为n/i,因为条件j * i <= n等同于j <= n/i。因此,内循环的迭代总数为n/1 + n/2 + n/3 + .. + 1,或者正式编写,

enter image description here

这个总和有一个很好的近似值,例如详细说明。 here,所以看一看。由于我们只对渐近复杂度感兴趣,因此我们只能采用最高阶项n * logn。如果有一些O(1)操作而不是minHeap.offer(arr1[i - 1] + arr2[j - 1]);,则可以解决您的问题。但是,Java中offer方法的复杂性为O(logk),其中k表示优先级队列的当前大小。在我们的例子中,优先级队列越来越大,因此总运行时间为log1 + log2 + ... + log(n * logn) = log(1 * 2 * ... * nlogn) = log((nlogn)!)

我们可以使用Stirling's approximation进一步简化此操作,因此最终的复杂性为O(n * logn * log(n * logn))