while循环更改时算法的复杂性

时间:2017-03-19 13:23:42

标签: algorithm code-complexity

此算法将数组作为输入。

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循环。我需要知道这个算法的复杂度是如何计算的?

2 个答案:

答案 0 :(得分:1)

while循环迭代 i 值,但它可以使用相同的值执行多次迭代。然后,辅助变量 j 会递增,并且它会运行到相同的最大值。

这意味着实际上这个算法从给定数组 A中的每个(unordered) combination 2个值( i j )循环(包括相同值的两倍)。例如,如果 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)// {记住添加汽车和自行车}