【问题标题】: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 个向量中不会出现整数

【问题讨论】:

    标签: algorithm data-structures


    【解决方案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) 预处理,还是我误解了?
      • 你是对的(鉴于数字,预处理很可能会被忽略——我不知道我们的哪个答案更快)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多