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

Algorithm 循环内具有内部迭代器的时间复杂度,algorithm,Algorithm,我想用简单的线性搜索而不是二进制搜索来检查两个大小相似的排序数组中是否有重复的元素 因此,我将扫描第一个数组的元素,然后继续移动第二个数组上的迭代器(因为它已排序)。在每个循环中,迭代器可以移动1个或多个步骤,但所有步骤都受到第二个数组大小的限制 我可以说它是O(n)或O(n^2)吗?如果我已经很好地理解了这个问题,最坏的情况是搜索两个数组末尾的元素。 在这种情况下,O(2n)是最大数组的大小。 所以,是的,复杂性是线性的,O(n)。如果我已经很好地理解了这个问题,最坏的情况是搜索两个数组末尾的

我想用简单的线性搜索而不是二进制搜索来检查两个大小相似的排序数组中是否有重复的元素

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


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

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

如果我已经很好地理解了这个问题,最坏的情况是搜索两个数组末尾的元素。 在这种情况下,O(2n)是最大数组的大小。
是的,复杂性是线性的,O(n)。

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

描述 对于外部数组中的每个元素,您将进入内部数组并继续检查该元素是否存在于内部循环中。请注意,您没有为每个外部循环元素迭代所有内部循环元素。然而,
O(n^2)
是这样的情况:对于外循环中的每个元素,您迭代内部循环中的每个元素(或者至少是内部循环中的一些
O(n)
元素)

由于数组是经过排序的,因此本质上只需迭代内部循环元素一次。例如,如果外部数组有{1,3,7},而内部数组有{2,4,5},那么内外循环的迭代将如下所示

  • 对于outerPointer=1,当2>1时,innerPointer保持在2
  • 对于outerPointer=3,innerPointer触摸2,然后触摸4并停留在那里4>3
  • 对于outerPointer=7,innerPointer接触4,然后接触5,然后我们从两个循环中分离出来
对于外环,我们将以最大值转到
O(n)
。如果内环在外环之前完成,我们也可以提前中断,正如上面的例子中所发生的那样。当然,我们将迭代内部循环中的所有元素,但最大值为
O(2n)=O(n)
。我说的是
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
01。设置o=0,i=0,lastInnerArrayIndex=0
2对于从0到n-1的outerArrayIndex
3如果lastInnerArrayIndex==n,则中断;
4o=外部光线[外部光线索引]
5对于从lastInnerArrayIndex到n-1的innerPointer
6lastInnerArrayIndex++;
7如果o==innerArray[innerPointer]
8打印(“找到公共元素”)
9出口
10否则,如果o
  • 假设对于外部数组的第一个元素,我们移动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+…+千牛
  • 总运行时间=n。为什么?因为这里所有k的总和等于内部循环中的元素总数
案例-1:外部和内部数组中有一个公共元素

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

情况-2:最后一个内部元件比最后一个外部元件小

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

情况-3:最后一个内部元素>=最后一个外部元素

内环和外环将一直运行到最后一个值,但实际上只将n次运行作为求和(k)=O(n)

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

说明 对于外部数组中的每个元素,您将进入内部数组并继续检查该元素是否存在于内部循环中。请注意,您没有为每个外部循环元素迭代所有内部循环元素。然而,
O(n^2)
是这样的情况:对于外循环中的每个元素,您迭代内部循环中的每个元素(或者至少是内部循环中的一些
O(n)
元素)

由于数组是经过排序的,因此本质上只需迭代内部循环元素一次。例如,如果外部数组有{1,3,7},而内部数组有{2,4,5},那么内外循环的迭代将如下所示

  • 对于outerPointer=1,当2>1时,innerPointer保持在2
  • 外星