Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.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
Arrays 在两个排序的数组中查找公共元素_Arrays_Algorithm_Language Agnostic - Fatal编程技术网

Arrays 在两个排序的数组中查找公共元素

Arrays 在两个排序的数组中查找公共元素,arrays,algorithm,language-agnostic,Arrays,Algorithm,Language Agnostic,可能重复: 我们有两个排序数组A和B,除了将一个数组与其他数组中的所有元素进行比较外,如何设计一个最佳算法来查找具有公共元素的数组?包含两个指针:每个数组一个指针 i <- 0, j <- 0 repeat while i < length(arr1) and j < length(arr2): if arr1[i] > arr2[j]: increase j else if arr1[i] < arr2[j]: increase i

可能重复:


我们有两个排序数组A和B,除了将一个数组与其他数组中的所有元素进行比较外,如何设计一个最佳算法来查找具有公共元素的数组?

包含两个指针:每个数组一个指针

i <- 0, j <- 0
repeat while i < length(arr1) and j < length(arr2):
    if arr1[i] > arr2[j]: increase j
    else if arr1[i] < arr2[j]: increase i
    else : output arr[i], increase both pointers
i
此外,将一个数组与其他数组中的所有元素进行比较

您必须将A[]与B[]进行比较,才能知道它们是相同的——除非您非常了解它们可以保存哪些类型的数据。比较的性质可能有许多解决方案,可以根据需要进行优化

如果数组是非常严格地创建的,即只从已知模式的顺序值开始,并且总是从已知点开始,那么您只需查看每个数组的长度,就可以知道是否所有项目都是公共的


不幸的是,这听起来不像是一个非常真实或有用的数组,因此如果两个数组(例如,
a
具有
N
元素和
B
具有
M
元素)的长度相似,您将返回到B[]中检查a[i],然后最好的方法是在另一个数组中对一个数组的元素执行线性搜索。当然,由于数组已排序,下一次搜索应该从上一次搜索停止的位置开始。这是“排序数组合并”算法中使用的经典原则。
O(N+M)
上的复杂性


如果长度明显不同(例如,
M+1-用于提供伪代码解决方案,该解决方案可由OP转换为真实代码。(您可能还应该描述在边缘/末端情况下发生的情况。)当然,这类似于合并排序。@StephenC:你是说我假设一个数组被检查的情况吗?这基本上是停止条件…(我还假设如果一个元素在每个数组中出现两次,你想打印两次)这就是我的意思。你的更新涵盖了它。复杂性将是O(m+n)而不是O(n).m是第一个数组的大小,n是第二个数组的大小。我想知道,在“混合”算法中,为什么要对数组B进行二进制搜索,因为数组B的元素比A少?另外,您是否有该语句的引用:“这种‘混合’算法是现有两个排序数组的最渐近最优搜索/合并算法。”?@abc:如果我没记错的话,可以在“渐近有效就地合并”一文中找到一个正式的证明(或一个参考):