【问题标题】:How to remove unrelated elements between 2 sets? Similar to SQL join如何删除两组之间不相关的元素?类似于 SQL 连接
【发布时间】:2013-02-22 08:16:48
【问题描述】:

假设我有 2 套像:

A = { 1, 4, 7, 10, 11, 12 }
B = { a, b, x, y, z }

我有一个函数可以确定 A 中的一个元素是否与 B 中的另一个元素相关:

bool isRelated(a, b)

我想从 A 和 B 中删除没有任何相关元素的元素。我怎样才能做到这一点?一种简单的方法是:

forEach a in A:
    related = 0
    forEach b in B:
        if isRelated(a, b):
            related++
            break
    if related == 0 
        A.remove(a)

// then I need to do something similar for B

在我看来效率很低。有没有更好的办法?一定会有更好的办法?

【问题讨论】:

    标签: algorithm join inner-join


    【解决方案1】:

    一般来说没有更好的方法。 SQL 数据库在识别连接子句中的特定条件时进行优化,它们可以使用索引(已经存在的索引或动态构建的数据结构)来查找所有匹配项,而无需扫描整个集合。并非所有可能的关系都与任何索引有关。

    您可以在第一个循环中记录BisRelated 返回true 的所有元素。然后在尚未编写的第二个循环中,您可以在循环您的(现在减少的)集合A 之前检查缓存。一旦这到位,也许您可​​以(在第一个循环中)不要总是从一开始就搜索B,以便让B 的后续元素更有可能进入缓存。

    除此之外,我认为这里没有任何大的节省。

    【讨论】:

      【解决方案2】:

      这在时间复杂度上非常相似,但由于 linq 的惰性,它也许可以为您节省一些时间。

      这是一个 C# 示例:

      var newA = A.Where(a=> B.Any(b=> IsRelated(a,b)).Select(a); //checks the desired condition
      var newB = B.Where(b=> A.Any(a=> IsRelated(a,b)).Select(b);
      A = newA;
      B = newB'
      

      【讨论】:

      • 修复了你提到的 A & B 类型的问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-11
      • 2017-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-27
      相关资源
      最近更新 更多