我想知道这个循环在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)。
答案 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
,或者正式编写,
这个总和有一个很好的近似值,例如详细说明。 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))
。