java - for循环内while循环的时间复杂度

标签 java time-complexity

我正在编写一个算法,需要找到其总和大于给定 k 参数的最小子数组的长度。

这是我到目前为止编写的函数:

    public static int smallestSub (int [] a, int k) {
        int currSum = a[0];
        int start = 0;
        int minLen = a.length + 1;
        int currLen = 1;
        
        for (int i = 1; i < a.length; i++) {
            currSum += a[i];
            currLen++;

            while (currSum - a[start] > k && start < i) {
                currSum -= a[start];
                start++;
                currLen--;
            }

            if (currSum > k) {
                minLen = Math.min(currLen, minLen);
            }
        }

        return minLen;
    }

我的问题是:这个算法的复杂度是O(n^2)吗? 我问是因为 while 循环依赖于 for 循环。

最佳答案

is the complexity of this algorithm is O(n^2)?

不,不是。

首先,让我们注意 i来自1n (我想 a.length 就是你所说的 n )。

内循环增量start直到达到i ,但它不会从 0 重新启动。因此,对于外循环的每次迭代,您都从某个 start' 开始。然后你达到了某个start'' (即最多为 i 的当前值)。请注意 start'等于 start'' 上一步

让我们调用delta_i区别(start'' - start')_i ,即 i 的迭代次数-第一个内循环。

算法的成本是内部循环的总体迭代次数。这可以计算为:

Σ_(i=1)^n {delta_i} = delta_1 + ... + delta_n
                    = (start'' - start')_1 + ... + (start'' - start')_n
                    = start''_1 - start'_1 + ... + start''_n - start')_n
                    = -start'_1 + start''_n

最后一步是因为每start'_i等于下一个start'_(i+1) (例如 start''_1 = start'_2 ),因此可以简化它们。但是start'_1 = 0 ,所以我们最终得到 start''_n ,最多为 n .

因此,总复杂度为 O(n) .

Q.E.D.

关于java - for循环内while循环的时间复杂度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68754393/

相关文章:

java - 如何在 Swing 中获取 JFrame

java - SpringLayout 中的组件大小

java - HashMap vs. ArrayList 插入性能混淆

c - 这个函数的复杂度/BIG O是什么 "loops"

algorithm - 这里的复杂性顺序是什么?

python - Python中字符串连接的时间复杂度

java - 使用Commons FileUpload的DiskFileItem上传大文件时如何避免OutOfMemoryErrors?

java - Java Swing/AWT 中的 Vista 玻璃边框效果

java - iOS 消费的 Web 服务(在 Amazon 上)安全

arrays - 一维数组中非相邻元素的最大总和