一尘不染

确定两组是否相交的算法

algorithm

假设我有两个数组:

int ArrayA [] = {5,17,150,230,285};

int ArrayB [] = {7,11,57,110,230,250};

两个数组都已排序,并且可以是任意大小。我正在寻找一种有效的算法来查找数组之间是否包含任何重复的元素。我只想要一个对/错的答案,我不在乎共享哪个元素或共享多少元素。

天真的解决方案是遍历ArrayA中的每个项目,然后在ArrayB中进行二进制搜索。我相信这种复杂度是O(m * log n)。

由于两个数组都已排序,因此似乎应该有一个更有效的算法。

我还想要一个通用的解决方案,该解决方案不假定数组包含数字(即该解决方案也应适用于字符串)。但是,比较运算符定义良好,并且两个数组的排列顺序从最小到最大。


阅读 234

收藏
2020-07-28

共1个答案

一尘不染

假设您正在执行合并排序,但不要将结果发送到任何地方。如果到达任一源的末尾,则没有交集。每次比较每个元素的下一个元素时,如果它们相等,就会有一个交集。

例如:

counterA = 0;
counterB = 0;
for(;;) {
    if(counterA == ArrayA.length || counterB == ArrayB.length)
        return false;
    else if(ArrayA[counterA] == ArrayB[counterB])
        return true;
    else if(ArrayA[counterA] < ArrayB[counterB])
        counterA++;
    else if(ArrayA[counterA] > ArrayB[counterB])
        counterB++;
    else
        halt_and_catch_fire();
}
2020-07-28