从向量数组中查找给定向量中公共元素的数量

Posted

技术标签:

【中文标题】从向量数组中查找给定向量中公共元素的数量【英文标题】:Find number of common elements in given vectors from an array of vectors 【发布时间】:2015-08-12 06:21:34 【问题描述】:

有一个给定的不同大小的向量数组,所有向量中的元素总数不会超过104。每个向量包含至少 1 个且最多 104 个唯一整数,每个整数的范围为 1 到 104

将有 105 个查询,其中每个查询要求查找某些给定向量中的公共整数的数量(最多 4 个)。

例如: 4 个向量:

1 2 5
3 5 6
1 3 6
6 7

1 个查询:

2 3 (vectors indexed 2 and 3)

回答:

2 (2 common integers 3,6)

我无法为这个问题想出一个有效的解决方案。什么算法/数据结构最适合这个问题?任何参考资料都会非常有帮助。

编辑:超过 4 个向量中不会出现整数

【问题讨论】:

【参考方案1】:

如果您的向量已排序,则可以这样做。您从所有第一个向量元素中的最大元素开始(因为之前不能有公共元素),然后尝试找到最小的最大公共元素。如果有,则从向量的其余部分重新开始。否则,您只需查看下一个可能的候选人。

v1, .., v4 表示四个选择的向量。

Let i1=i2=i3=i4=0
While (i1 < v1.length, i2 <v2.length, i3 < v3.length, i4 < v4.length)
    Let X = max(v1[i1],v2[i2],v3[i3],v4[i4])
    Increase i1, i2, i3, i4 such that v1[i1]>=X, v2[i2]>=X, v3[i3]>=X, v4[i4]>=X
    If v1[i1]=v2[i2]=v3[i3]=v4[i4]
        count++
        i1++

【讨论】:

【参考方案2】:

将向量存储在一个集合数据结构中,允许您在 O(1) 中进行查找并在 O(N) 中迭代所有元素。

对于每个查询,只需遍历其中一个向量中的元素,对于每个元素,检查它是否存在于另一个向量中。

【讨论】:

在最坏的情况下,每个查询将花费 O(n) 时间,这非常昂贵 是的,但是不接受的答案也是 O(N) 只是使用 O(N*logN) 预处理而不是这里的 O(N) 预处理,还是我误解了? 你是对的(鉴于数字,预处理很可能会被忽略——我不知道我们的哪个答案更快)。

以上是关于从向量数组中查找给定向量中公共元素的数量的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 find_if 在给定的对向量中查找元素

迭代数组并在索引处插入元素

查找向量中的第一个缺失元素

九. 常用类库向量与哈希6.哈希表及其应用

从向量集中修剪非公共元素

java中哈希表及其应用详解