Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sorting 比较两个阵列_Sorting - Fatal编程技术网

Sorting 比较两个阵列

Sorting 比较两个阵列,sorting,Sorting,如何在二进制算法中比较两个排序内容为整数的数组?如果知道它们已排序,则可以使用指向每个数组开头的指针,在两个数组上移动,并在每次比较后上下移动其中一个指针。那就可以了。不确定你能把任何东西一分为二,因为你不知道公共数字在哪里 仍然比2上的蛮力更好。如果知道第二个数组已排序,则可以使用二进制搜索在第二个数组中查找第一个数组中的元素。这可以通过两种方式完成。 二进制搜索b线性搜索 对于二进制搜索-对于数组A中的每个元素,使用二进制搜索查找B中的元素,在这种情况下,复杂性在log n上 对于线性搜索-

如何在二进制算法中比较两个排序内容为整数的数组?

如果知道它们已排序,则可以使用指向每个数组开头的指针,在两个数组上移动,并在每次比较后上下移动其中一个指针。那就可以了。不确定你能把任何东西一分为二,因为你不知道公共数字在哪里


仍然比2上的蛮力更好。

如果知道第二个数组已排序,则可以使用二进制搜索在第二个数组中查找第一个数组中的元素。

这可以通过两种方式完成。 二进制搜索b线性搜索

对于二进制搜索-对于数组A中的每个元素,使用二进制搜索查找B中的元素,在这种情况下,复杂性在log n上

对于线性搜索-它是OM+n-其中m,n是数组的大小。在你的例子中,m=n

线性搜索:

有两个索引i,j指向数组A,B 比较A[i],B[j] 如果A[i]B[j],则增加j,因为只有在B的后续索引中才能找到任何匹配项If存在。 如果A[i]==B[j],你找到了答案。 代码:


就像在任何情况下一样:这要看情况而定

假设数组是有序的或散列的,则时间复杂度最多为+m

您没有提到任何语言,所以它是伪代码

function SortedSequenceOverlap(Enumerator1, Enumerator2)
{ while (Enumerator1 is not at the end and Enumerator2 is not at the end)
  { if (Enumerator1.current > Enumerator2.current)
      Enumerator2.fetchNext()
    else if (Enumerator2.current > Enumerator1.current)
      Enumerator1.fetchNext()
    else
      return true
  }
  return false
}
如果排序顺序是降序的,则需要为此数组使用反向枚举器

然而,这并不总是最快的方式

如果其中一个数组的大小明显不同,则对较短数组中的几个元素使用二进制搜索可能会更有效

这可以得到更大的改进,因为当您从小数组的中间元素开始时,不需要对任何其他元素进行完整搜索。中间元素之前的任何元素都必须位于未找到中间元素的位置之前的范围内,中间元素之后的任何元素都必须位于大数组的上限范围内。这可以递归应用,直到找到所有元素。一旦你被击中,你可以中止

这种方法的缺点是,在最坏的情况下,即在log m上,需要花费更多的时间,并且需要对阵列进行随机访问,这可能会影响缓存效率

另一方面,与一个小的logm相乘可能比添加一个大的logm更好。与上述算法相比,通常只需访问大型阵列的少数元素

当log m小于m/n时,盈亏平衡大约为,其中n是较小的数字

你认为就这样吗没有

如果对较大阵列的随机访问导致更高的延迟(例如,由于缓存效率降低),则最好做相反的操作,即从大阵列的中位数开始,在小阵列中查找大阵列的元素

为什么要更快?你必须查找更多的元素

答复:

不,没有更多的查找。一旦大数组中一系列元素所在的边界崩溃,您就可以停止搜索这些元素,因为您再也找不到任何命中。 事实上,比较的次数是完全相同的

不同之处在于,在第一步中,将大型阵列的单个元素与小型阵列的不同元素进行比较。这只需要一次缓慢的访问就可以进行一系列比较,而另一种方式则需要多次访问同一个元素,而其他一些元素则需要在这两者之间进行访问。 因此,访问速度较慢,而访问速度较快


大约30年前,当您以这种方式键入时,我实现了搜索,而访问大型索引需要磁盘I/O。

复杂性是怎么回事,在排序数组中查找元素需要使用二进制搜索进行OlogN,您只需执行两次,我是否遗漏了什么?您如何知道要查找的数字?如果你知道是哪一个,是的,它是Ologn,但你必须尝试一个数组的所有数字,所以这取决于任务,但假设你正在寻找数组A中的每个数字,如果它存在于数组B中,那么它只需要很长的时间,但我认为你无法击败它。两个数组都已排序,因此您最多只能进行2n次比较或n+m次比较,如其他重要答案中所述。欢迎使用Stack Overflow,请阅读文档,了解如何提出一个好问题,因为这个问题需要大量工作才能被接受。为什么要删除问题的内容?
for (int i = 0, j = B.length - 1; i < A.length && j >= 0; ) {
   if ( A[i] < B[j] ) {
       i++;
   } else if ( A[i] > B[j] ) {
       j--;
   }
   return A[i];
}
function SortedSequenceOverlap(Enumerator1, Enumerator2)
{ while (Enumerator1 is not at the end and Enumerator2 is not at the end)
  { if (Enumerator1.current > Enumerator2.current)
      Enumerator2.fetchNext()
    else if (Enumerator2.current > Enumerator1.current)
      Enumerator1.fetchNext()
    else
      return true
  }
  return false
}