如何做这个嵌套的for循环时间复杂度?

How to do this nested for loop time complexity?

我正在尝试计算这个时间复杂度:

for(i=0; i<=(n/2)-1; i++){
    for (j=i+1; j<=(n/2)-1; j++){
        --some O(1) thing--                
    }   
} 

我理解的外循环是独立的 O(n/2.) 但是对于内循环我也无法思考如何分解多少次 O(1)执行。

如果里面的人盯着 j=0 我可以做 n/2(inner) * n/2(outer) = O(n^2) 时间复杂度对吗?然而,由于 j 取决于 i,我认为从 i+1 到 n/2 涉及某种类型的求和,但我不知道如何设置它...

基本上我需要帮助来可视化它循环了多少次,以及如何设置总和。谢谢! :)

假设 m = n/2。您会看到在内循环中,j 将遍历范围 m-1、m-2、m-3、... 1。将所有这些加起来将是 1+2+..+m-1 = (m- 1)*m/2 = O(m^2)

前提

为简单起见,我们称m = n / 2 - 1。外循环从 0 运行到 m。从 i + 1m.

的内部循环

迭代计数

我们需要计算您标记为 O(1) 的内部语句的执行频率。也就是说,内部循环运行的总频率与外部循环执行的频率相同。那么让我们一起来看看吧。

外循环的第一次迭代生成内循环的 m - 1 次迭代。第二个生成 m - 1,然后 m - 2m - 3m - 4、...、210

这意味着 O(1) 语句总共执行了:

(m - 1) + (m - 2) + (m - 3) + ... + 2 + 1 + 0

这是从 0m - 1

的总和
sum_{i = 0}^{m - 1} i

可以简化为

(m^2 - m) / 2

替补回来

现在让我们代入m = n / 2 - 1,我们得到

((n / 2 - 1)^2 - (n / 2 - 1)) / 2

简化后就是

n^2/8 - 3n/4 + 1

大O

对于Big-O,我们观察到它小于

  n^2 - 0 + n^2
= 2n^2

根据定义,O(n^2)

如您所见,这个界限也很紧。所以我们也收到 Omega(n^2) 也得出结论 Theta(n^2).