我正在尝试确定我编写的算法的运行时复杂度,该算法用于获取数组并确定数组最长连续子序列的长度,其中子序列的最大值和最小值之差小于或等于等于某个给定的值。
代码
input = [16,19,20,22,27,23]
compareValue = 3
tmp,length = 0,0
for i in range(0,n):
newArray = []
for j in range(i,n):
newArray.append(input[j])
if abs(max(newArray) - min(newArray)) <= compareValue:
tmp = len(newArray)
else:
if tmp > length
length = tmp
此示例的输出为3
我已经尝试通过阅读关于Big-O的示例来自行确定这一点,但我并不是100%确定其确切的复杂性,并且非常感谢您的澄清。
编辑:从阅读内容我认为这是在O(n ^ 2)中运行,但同样,我不完全确定
答案 0 :(得分:3)
你有2个循环。假设元素的数量为5.在每个父循环迭代中,第二次循环迭代将减少1:
外循环迭代:* * * * *
内循环迭代:5 4 3 2 1
通过对第二次(或内部)循环迭代求和,您可以计算“操作”或复杂性的总数。你在这里有简单的从1到n的自然数的总和(5)。该汇总的公式是:
n * (n + 1) / 2
或(n^2 + n) / 2
最后在每次迭代的内循环中,您要将元素添加到newArray
并在其上调用min
和max
。 min
和max
的复杂度为O(n),但数组长度减少:
min,j在0-4中的最大值:2 * (O(1)+O(2)+...+O(5))
min,max为j在0-3:2 * (O(1)+O(2)+...+O(4))
min,max为j在0-2:2 * (O(1)+O(2)+...+O(3))
最小值,最大值为0-1中的j:2 * (O(1)+O(2)+...+O(2))
min,max为j in 0:2 * O(1)
总体复杂度将为summ:O(n^2 + n) + O((n-1)^2 + (n-1)) + ... O(1)
我认为min + max的大致复杂度为O(2*n/2)
或O(n)
,因此总体而言:
(n^2 + n) / 2 * (n)
或(n^3 + n^2) / 2
或O(n^3)