标签: set-intersection

找到多组交集的最佳方法是什么?

我有一套套装:

setlist = [s1,s2,s3...]
Run Code Online (Sandbox Code Playgroud)

我想要s1∩s2∩s3...

我可以通过执行一系列成对s1.intersection(s2)等来编写一个函数来完成它.

有推荐的,更好的或内置的方式吗?

python set set-intersection

232
推荐指数
5
解决办法
14万
查看次数

高效的列表交集算法

给定两个列表(不一定排序),找到这些列表的交集的最有效的非递归算法是什么?

algorithm list set-intersection

71
推荐指数
6
解决办法
7万
查看次数

Python:基于交叉点的简单列表合并

考虑有一些整数列表:

#--------------------------------------
0 [0,1,3]
1 [1,0,3,4,5,10,...]
2 [2,8]
3 [3,1,0,...]
...
n []
#--------------------------------------
Run Code Online (Sandbox Code Playgroud)

问题是合并具有至少一个共同元素的列表.因此,仅给定部分的结果如下:

#--------------------------------------
0 [0,1,3,4,5,10,...]
2 [2,8]
#--------------------------------------
Run Code Online (Sandbox Code Playgroud)

在大数据上执行此操作的最有效方法是什么(元素只是数字)?tree结构一些思考?我现在通过将列表转换为sets迭代并迭代交叉来完成工作,但它很慢!而且我有一种如此初级的感觉!此外,实现缺少一些东西(未知),因为有些列表有时会保持未合并!话虽如此,如果你提出自我实现,请慷慨并提供一个简单的示例代码[显然Python是我的偏爱:)]或pesudo代码.
更新1: 这是我使用的代码:

#--------------------------------------
lsts = [[0,1,3],
        [1,0,3,4,5,10,11],
        [2,8],
        [3,1,0,16]];
#--------------------------------------
Run Code Online (Sandbox Code Playgroud)

功能是(越野车!!):

#--------------------------------------
def merge(lsts):
    sts = [set(l) for l in lsts]
    i = 0
    while i < len(sts):
        j = i+1
        while j < len(sts):
            if len(sts[i].intersection(sts[j])) > 0:
                sts[i] = sts[i].union(sts[j])
                sts.pop(j)
            else: j += 1                        #---corrected
        i …
Run Code Online (Sandbox Code Playgroud)

python tree merge equivalence-classes set-intersection

39
推荐指数
5
解决办法
6777
查看次数

java.util.Map的交集

是否有一个方法java.util.Map或任何工具在两个地图上执行交集?(通过"键"交叉两个地图)

我找不到任何东西.我总是可以实现自己的交集逻辑,但我希望在其中一个java.util.*类中已经有一些操作可以执行此操作.

java collections dictionary set-intersection

35
推荐指数
2
解决办法
2万
查看次数

计算线性时间的交集?

是否存在一个算法,给定两组,在线性时间内计算它们的交集?

我可以运行两个for循环来检查所有元素对,记录我在两个集合中找到的元素.但是,运行时间将为O(n 2).我如何在O(n)时间内完成此操作?

algorithm math big-o set-intersection data-structures

33
推荐指数
3
解决办法
4万
查看次数

我可以检查一个列表是否包含另一个列表中的任何项目吗?

使用Python,我想检查一个列表是否包含另一个列表中也存在的项目/值。例如,这是我正在尝试做的事情:

list1 = ['item1','item2','item3']
list2 = ['item4','item5','item3']

if list1 contains any items also in list2:
    print("Duplicates found.")
else:
    print("No duplicates found.")
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,list2 包含一个在 list1 中也可以找到的项目,即“item3”。有什么方法可以检测是否发生这种情况吗?

谢谢。

python list set-intersection

24
推荐指数
2
解决办法
7万
查看次数

西方最快的集合运营

我无法在一个地方找到任何令人满意的关于这个主题的报道,所以我想知道:什么是最快的交集,联合和分离算法?
有限域名是否有任何有趣的?
任何人都可以击败O(Z),其中Z是交叉点的实际大小?

如果您的方法依赖于排序集,请注意,但不要将其视为不合格因素.在我看来,必须有一个真正的微妙优化仓库来分享,我不想错过任何一个.

我知道的一些算法依赖于vanilla之外的按位运算,因此您可以假设存在SSE4并访问popcount等内在函数.请注意这个假设.

有趣的是: BY Intersect的实现

更新
我们有一些非常好的部分答案,但我仍然希望对这个问题有更完整的攻击.我特别感兴趣的是看到更明确地使用布隆过滤器来解决这个问题.

更新
我已经完成了一些关于将bloom过滤器与cuckoo哈希表相结合的初步工作.它看起来几乎令人讨厌,因为它们有非常相似的需求.我已经接受并接受了答案,但此刻我并不满意.

language-agnostic algorithm set-intersection

16
推荐指数
1
解决办法
3233
查看次数

包含对象的两个数组的差异和交集

我有两个数组list1,list2其中包含具有某些属性的对象; userId是Id还是唯一属性:

list1 = [
    { userId: 1234, userName: 'XYZ'  }, 
    { userId: 1235, userName: 'ABC'  }, 
    { userId: 1236, userName: 'IJKL' },
    { userId: 1237, userName: 'WXYZ' }, 
    { userId: 1238, userName: 'LMNO' }
]

list2 = [
    { userId: 1235, userName: 'ABC'  },  
    { userId: 1236, userName: 'IJKL' },
    { userId: 1252, userName: 'AAAA' }
]
Run Code Online (Sandbox Code Playgroud)

我正在寻找一种简单的方法来执行以下三个操作:

  1. list1 operation list2 应该返回元素的交集:

    [
        { userId: 1235, userName: 'ABC'  },
        { userId: 1236, userName: 'IJKL' …
    Run Code Online (Sandbox Code Playgroud)

javascript arrays set-difference set-operations set-intersection

16
推荐指数
4
解决办法
2万
查看次数

在Python中成对设置交集

如果我有一个变量多套(我们称之为数Ñ),其中最多有元件分别,什么是计算成对交叉将所有对套最有效的方法是什么?请注意,这与所有n个集合的交集不同.

例如,如果我有以下几组:

A={"a","b","c"}
B={"c","d","e"}
C={"a","c","e"}
Run Code Online (Sandbox Code Playgroud)

我希望能够找到:

intersect_AB={"c"}
intersect_BC={"c", "e"}
intersect_AC={"a", "c"}
Run Code Online (Sandbox Code Playgroud)

另一种可接受的格式(如果它使事情变得更容易)将是给定集合中的项目映射到包含相同项目的集合.例如:

intersections_C={"a": {"A", "C"},
                 "c": {"A", "B", "C"}
                 "e": {"B", "C"}}
Run Code Online (Sandbox Code Playgroud)

我知道,这样做的一个方法是创建一个字典映射中的所有工会的每个值ñ套在它出现的集列表,然后通过所有这些值来创建列表如重复intersections_C以上,但我不确定n的增加是如何增加的,并且该组的大小变得太大.

一些额外的背景信息:

  1. 每一组都大致相同的长度,但也非常大(足够大,使得将它们存储在所有存储器是一个现实的关注,从而避免了将被虽然优选的算法是不必要的)
  2. 与集合本身的大小相比,任何两个集合之间的交叉点的大小非常小
  3. 如果它有帮助,我们可以假设我们需要关于输入集的排序.

python set set-intersection

15
推荐指数
1
解决办法
2573
查看次数

如何检查一个向量是否是另一个向量的子集?

目前,我认为我最好的选择是使用std :: set_intersection,然后检查较小输入的大小是否与set_intersection填充的元素数相同.

有更好的解决方案吗?

c++ subset set-intersection

14
推荐指数
1
解决办法
1万
查看次数