如何找到两个系列相交?

时间:2013-07-01 10:50:45

标签: algorithm

考虑到我有两个系列2,3,4,5,6和4,5,6,7,8,9。这些系列中有一些共同点。我应该使用什么算法来编写计算机程序来查找两个给定的序列是否相交。

4 个答案:

答案 0 :(得分:3)

我发现你有2个独特的已排序列表。 我们的想法是在同一个循环中抛出排序列表/数组并比较元素。迭代将仅在非匹配情况下递增一个索引,并且如果存在匹配则跳过两个索引。 Algorythm约为O(N + M),其中N和M是2个阵列的大小。 以下是JavaScript中的示例:

var l1 = [2,3,4,5,6];
var l2 = [4,5,6,7,8,9];
var intersection = [];
for (var i1=0,i2=0; i1<l1.length || i2<l2.length;) {
    if (l1[i1] == l2[i2]) {
        intersection.push(l1[i1]);
        ++i1;
        ++i2;
    } else {
        if (l1[i1] < l2[i2]) {
            ++i1;
            if (i1 >= l1.length)
                break;
        } else {
            ++i2;
            if (i2 >= l2.length)
                break;
        }
    }
}
console.log(intersection);

答案 1 :(得分:2)

<强>决策

IF (A.START >= B.START AND A.START <= B.END)
OR (A.END >= B.START AND A.END <= B.END)
OR (B.START >= A.START AND B.START <= A.END)
OR (B.END >= A.START AND B.END <= A.END)

示例

A = { 2,3,4,5,6 }
B = { 4,5,6,7,8,9 }

A.START = 2
A.END = 6

B.START = 4
B.END = 9

(A.END >= B.START AND A.END <= B.END)
6 >= 4 AND 6 <= 9 ~ TRUE

答案 2 :(得分:1)

在Python中,您可以在另一个序列中检查一个序列:

>>> str(seq1)[1:-1] in str(seq2)

它的工作原理是从seq1的字符串表示中删除[],然后查看它是否出现在seq2中:

>>> str([1,2,3])
'[1, 2, 3]'
>>> str([1,2,3,4])
'[1, 2, 3, 4]'

答案 3 :(得分:0)

OP问题是只知道如果两个列表相交。我的答案给出了两个列表之间更常见的常用数字,但它只需要添加一个布尔值和一个中断来改变它。

首先,我假设列表已排序,但数字可能不连续

C中的解决方案

#include <stdio.h>

int main() {
    int l1[] = {2, 3, 4, 5, 6};
    int l2[] = {4, 5, 6, 7, 8, 9};

    int i1 = 0;
    int i2 = 0;

    while (i1 < 5 && i2 < 6) {
        if (l1[i1] == l2[i2]) {
            printf("%d\n", l1[i1]);
            i1++;
            i2++;
        } else if (l1[i1] < l2[i2]) {
            i1++;
        } else {
            i2++;
        }
    }

    return 0;
}

<强>验证

 % ./a.out 
4
5
6

Python解决方案:

l1 = [2, 3, 4, 5, 6]
l2 = [4, 5, 6, 7, 8, 9]
i1 = 0
i2 = 0

while i1 < len(l1) and i2 < len(l2):
    if l1[i1] == l2[i2]:
        print(l1[i1])
        i1 += 1
        i2 += 1
    elif l1[i1] < l2[i2]:
        i1 += 1
    else:
        i2 += 1

现在,如果列表未排序,您有三种解决方案:

  • 您可以遍历2个列表并检查两个元素何时相同:O(n * m)
  • 您可以先对它们进行排序,以便使用第一种算法:O(n log n)+ O(m log m)+ O(n + m)
  • 您使用哈希集(见下文):O(n + m)

请参阅:

l1 = [5, 6, 4, 2, 3]
l2 = [8, 6, 5, 7, 4, 9]
i1 = 0
i2 = 0

s1 = set(l1)

for v in l2:
    if v in s1:
        print(v)

可以说该集合不是强制性的,因为我可以直接写v in l1但是使用列表它是第一个解决方案(in在时间上是线性的),而使用集in 1}}应该在时间上几乎不变。这可能对大型列表很有用。

也验证了

 % python inter.py 
6
5
4

总而言之,如果列表都是排序连续,您可以通过比较边界来判断它们是否相交(参见Khaled A Khunaifer的答案) :https://stackoverflow.com/a/17420402/1787973):

在Python中:

(l1[0] >= l2[0] and l1[0] <= l2[-1]
or l1[-1] >= l2[0] and l1[-1] <= l2[-1]
or l2[0] >= l1[0] and l2[0] <= l1[-1]
or l2[-1] >= l1[0] and l2[-1] <= l1[-1])