如何计算嵌套在 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 时 - 那么它不会运行任何其他 i
s。在整个函数调用中,while
循环总共将运行不超过s.length
次。
啊,这很有意义.. 难怪我的算法运行得非常快,尽管 s 本来可以大到 100k。谢谢!以上是关于如何计算嵌套在 for 循环中的 while 循环的时间复杂度?的主要内容,如果未能解决你的问题,请参考以下文章