此算法将数组作为输入。
i=1
j=1
m=0
c=0
while i<=|A|
if A[i] == A[j]
c=c+1
j=j+1
if j>|A|
if c>m
m=c
c=0
i=i+1
j=i
return m
据我所知,虽然循环的复杂性是O(n)。但我无法理解这个算法和while循环。我需要知道这个算法的复杂度是如何计算的?
答案 0 :(得分:1)
while
循环迭代 i 值,但它可以使用相同的值执行多次迭代。然后,辅助变量 j 会递增,并且它会运行到相同的最大值。
这意味着实际上这个算法从给定数组 A中的每个(unordered) combination 2个值( i 和 j )循环/ em>(包括相同值的两倍)。例如,如果 A 是[1,2,3,4],则 i 和 j 每次迭代{{{{{ 1}}循环:
while
如果我们将 n 定义为 A 中的值的数量,那么 i | j
-----+-----
1 | 1
1 | 2
1 | 3
1 | 4
2 | 2
2 | 3
2 | 4
3 | 3
3 | 4
4 | 4
循环迭代 n(n + 1)/ 2 < / em>次。在上面的例子中:4 * 5/2 = 10次。
这是½n²+½n = O(n²)。
请注意,代码中变量 c 和 m 的操作不会影响时间复杂度,只会影响函数的结果。
答案 1 :(得分:0)
最慢的过程决定了任何过程所花费的时间。
通过一个例子理解这一点; 我想买一辆车和一辆自行车。 汽车的价格约为100000美元,自行车的价格为1000美元 当我添加它们时,我得到了101000美元 这里出现了一个问题;什么决定两者的成本? 当然汽车是决定性因素。在这种情况下,我们经常会忽略自行车的价格。
循环中所花费的时间多于声明某些变量或某些算术运算,因为此循环可能会运行数十亿次。
i=1
j=1
m=0
c=0
这部分将花费一个单位时间。
然而,整个代码 - &gt;
while i<=|A|
if A[i] == A[j]
c=c+1
j=j+1
if j>|A|
if c>m
m=c
c=0
i=i+1
j=i
将运行N次,其中N是数组的长度。
类似地,这些分配和条件操作将花费O(1)时间。
添加它们会给你
O(1)+ O(N)= O(N)// {记住添加汽车和自行车}