如何计算嵌套在 for 循环中的 while 循环的时间复杂度?

Posted

技术标签:

【中文标题】如何计算嵌套在 for 循环中的 while 循环的时间复杂度?【英文标题】:How to figure out time complexity for a while loop nested in a for loop? 【发布时间】:2022-01-22 07:45:18 【问题描述】:

所以我这里有这段代码,我只是想了解时间和空间的复杂性。

对于时间复杂度,我认为它的 O(n^2) 因为它在 while 循环中最多经历 n - 1 个循环,并且它将在 for 循环中经历 n 次,所以它将是 O(n(n -1)) 这是 O(n^2) 和空间复杂度我认为它是 O(n) 因为它是线性空间。

我不知道我是否正确,但如果我错了,有人可以纠正我的想法吗?提前致谢。

    // Write your code here
    let visited = new Array(s.length).fill(false);
    let count = 0;
    for (let i = 0; i < s.length; i++) 
        let j = i + 1;
        visited[i] = true;
        while (j < s.length && s[j] === s[i] && !visited[j]) 
            visited[j] = true;
            count++;
            j++;
        
    
    return count; 

【问题讨论】:

它的目的是什么?你有一些数据和结果吗? @NinaScholz 这只是我解决的一个黑客等级问题,所以我试图弄清楚面试准备的时间和空间复杂度 @user1599011 它可以运行 s 的长度,因为 s 可以在整个字符串中使用相同的字母 【参考方案1】:

这是O(n)的时间复杂度,因为:

while (j < s.length && s[j] === s[i] && !visited[j]) 

要满足这个条件,visited[j] 需要为 false,当它满足时,你就可以了

visited[j] = true;

因此,上述行只能运行与 visited 数组中的项目一样多的次数。如果while 循环运行到first 外部迭代的末尾(当i 为0 时),那么它将永远不会在任何其他外部迭代中运行。如果while 循环在visited 第一次迭代的中途运行,并且在第二次迭代的另一半中运行,则它将永远不会在其余的外部迭代中运行。所以,这部分代码:

    while (j < s.length && s[j] === s[i] && !visited[j]) 
        visited[j] = true;
        count++;
        j++;
    

总运行次数永远不会超过visited.length 次。

外部循环当然是O(n)。所以,你得到

outer loop: O(n)
+ inner loop: O(n) when summed over all iterations of the outer loop
= O(n)

【讨论】:

但是 j 每次都会递增,因此如果 s[j] === s[i] 始终为真,它可以运行 s 的整个长度 如果它第一次运行整个长度 - 当 i 为 0 时 - 那么它不会运行任何其他 is。在整个函数调用中,while 循环总共将运行不超过s.length 次。 啊,这很有意义.. 难怪我的算法运行得非常快,尽管 s 本来可以大到 100k。谢谢!

以上是关于如何计算嵌套在 for 循环中的 while 循环的时间复杂度?的主要内容,如果未能解决你的问题,请参考以下文章

Java for 嵌套循环

Python打破嵌套的for循环并重新启动while循环

Java 中,如何跳出当前的多重嵌套循环,循环标记(for循环,while循环)Java面试题

python中的if循环怎么样?

Python中的嵌套循环

第八讲,循环结构,for循环,while循环