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:如果我没记错的话,可以在“渐近有效就地合并”一文中找到一个正式的证明(或一个参考):