[英]What will be time complexity for the given algorithm?
我们得到了我想出解决方案的问题。 有人可以帮我确定给定解决方案的时间复杂度吗? 应该是 O(n) 还是 O(n^2)? 在我看来,它应该是 O(n)。
问题
编写一个程序,按照以下给定的条件打印数组元素的总和。
如果数组依次为 6 和 7,则忽略 6 和 7 之间的数字,并考虑其他数字进行总和计算。
Eg1) 数组元素 - 10,3,6,1,2,7,9 O/P: 22 [即 10+3+9]
Eg2) 数组元素 - 7,1,2,3,6 O/P:19
Eg3) 数组元素 - 1,6,4,7,9 O/P:10
解决方案
outer: for (i = 0; i < elementsCount; ++i) {
if (arr[i] == 6) {
int sumBetweenBounds = arr[i];
for (j = i + 1; j < elementsCount; ++j) {
if (arr[j] == 7) {
i = j;
continue outer;
}
sumBetweenBounds += arr[j];
}
sum += sumBetweenBounds;
continue;
}
sum += arr[i];
}
在谈论时间复杂度时,我们应该区分最佳情况、最坏情况或平均情况( https://en.wikipedia.org/wiki/Best,_worst_and_average_case )。 当未提及时,通常会考虑最坏的情况。
在最坏的情况下,您的算法是 O(n^2),因为当数组元素为 6 时运行内部循环。在最坏的情况下,所有数组元素都可能是这个值。
在最好的情况下,它是 O(n),但这通常并不有趣。
对于平均情况分析,您需要知道将运行您的算法的所有数组中的值分布。
首先,您的算法不适用于只有 6 个的数组。
其次,你的算法复杂度是 O(n^2),检查只有 6 的数组的情况。
如果只有 6 个,您将继续进入每个元素的内部循环,这将为您提供提到的复杂性,并继续总结您之前已经总结过的 6 个。
例如:
int[] arr = new int[]{6,6,6,6};
会给:
//1st iteration
sum += 6+6+6+6;
//2nd iteration
sum += 6+6+6;
//3rd
sum += 6+6;
//4th
sum += 6;
总共给出sum=60
而不是 24。
您使解决方案比实际问题更复杂,您应该使用单个 for 循环,并且您可以使用布尔值来检查是否要添加元素的天气
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.