我想通过简单的线性搜索检查两个排序数组中是否存在重复元素,而不是二元搜索。
所以我将扫描第一个数组的元素,然后继续在第二个数组上移动迭代器(因为它已经排序)。在每个循环中,迭代器可以移动1个或更多个步骤,但是完全步骤受第二个数组的大小限制。
我可以说它是O(n)还是O(n ^ 2)?
答案 0 :(得分:2)
对于外部数组中的每个元素,您将转到内部数组并向前移动以检查内部循环中是否存在此元素。请注意,不是为每个外部循环元素迭代所有内部循环的元素。然而,O(n^2)
是外部循环中的每个元素的情况,您遍历内部循环中的每个元素(或内循环的至少一些O(n)
元素)。
由于数组是排序的,基本上你只会迭代内部循环元素一次。例如,如果外部数组有{1,3,7},而内部数组有{2,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
现在,
案例 - 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)
。