循环内部迭代器的时间复杂度

时间:2015-09-16 02:32:40

标签: algorithm

我想通过简单的线性搜索检查两个排序数组中是否存在重复元素,而不是二元搜索。

所以我将扫描第一个数组的元素,然后继续在第二个数组上移动迭代器(因为它已经排序)。在每个循环中,迭代器可以移动1个或更多个步骤,但是完全步骤受第二个数组的大小限制。

我可以说它是O(n)还是O(n ^ 2)?

3 个答案:

答案 0 :(得分:2)

描述

对于外部数组中的每个元素,您将转到内部数组并向前移动以检查内部循环中是否存在此元素。请注意,不是为每个外部循环元素迭代所有内部循环的元素。然而,O(n^2)是外部循环中的每个元素的情况,您遍历内部循环中的每个元素(或内循环的至少一些O(n)元素)。

由于数组是排序的,基本上你只会迭代内部循环元素一次。例如,如果外部数组有{1,3,7},而内部数组有{2,4,5},则内部和外部循环的迭代看起来像

  • 对于outerPointer = 1,innerPointer保持为2为2> 1
  • 对于outerPointer = 3,innerPointer触摸2,然后触摸4并保持4> 3
  • 对于outerPointer = 7,innerPointer触及4,然后触及5,然后我们从两个循环中断开。

对于外循环,我们将最多转到O(n)。如果内循环在外循环之前完成,我们也可以提前中断,就像在上面的例子中发生的那样。我们肯定会迭代内部循环中的所有元素,但最大值将是O(2n) = O(n) only。我说O(2n)因为当你触摸内部数组的每个元素两次时会出现这种情况。

因此,对于外部循环中的所有元素,您将仅移动内部循环,共计O(n)。因此,总的最大触摸等于3n(外部为n,内部最大为2n),或者我们可以说运行时间为O(3n),等于为O(n)即可。

数学证明

  • 让两个数组都有n个元素

如果存在重复元素,则测试的伪代码为:

01. set o = 0, i = 0, lastInnerArrayIndex = 0

02. for outerArrayIndex going from 0 to n - 1

03.     if lastInnerArrayIndex == n, break;
04.     o = outerArray[outerArrayIndex]

05.     for innerPointer going from lastInnerArrayIndex to n - 1
06.         lastInnerArrayIndex++;
07.         if o == innerArray[innerPointer]
08.             print ("common element found")
09.             exit;
10.         else if o < innerArray[innerPointer] break;

11.     end inner for

12. end outer for
  • 假设对于外部数组的第一个元素,我们移动了k1个元素,第二个移动了k2,依此类推,直到我们移动了kn的外环的第n个元素。
  • 因此,n = 10的一个样本值可以是:
      元素0到4的
    • k1 = 5
    • 元素5和6
    • k2 = 2
    • 元素7到9
    • k3 = 3
    • 因此,求和(k)= 5 + 2 + 3 = 10 = O(n)

现在,

  • 总运行时间= k1 + k2 + k3 + k4 + ... + kn
  • 总运行时间= n。为什么?因为这里所有k的总和等于内循环中的总元素。

案例 - 1:外部和内部数组中有一个共同的元素

在这种情况下,在某个km处,我们将满足if条件,并且从k(m + 1)到kn的所有k值将为0,因此运行时间将在O(n)之下。< / p>

案例 - 2:最后一个内部元素小于最后一个外部元素

在这种情况下,假设数组按递增顺序排序,内部循环将再次以某个km结束,因此运行时间将是内部循环元素计数的顺序,即O( n)中。

案例 - 3:最后一个内部元素是&gt; =最后一个外部元素

内循环和外循环将一直到最后一个值,但实际上只有n次运行才能得到Summation(k)= O(n)。

因此,此迭代的运行时间为 O(n)。

答案 1 :(得分:1)

如果我已经很好地理解了这个问题,最糟糕的情况是你搜索一个位于两个数组末尾的元素。 在这种情况下,你将有O(2n),是最大数组的大小。 所以是的,复杂性应该是线性的,O(n)。

答案 2 :(得分:1)

假设您的第一个数组大小为n,第二个数组的大小为m。在最坏的情况下,您需要n+m迭代器移动和n+m比较。因此,复杂性为O(n+m)