我有一套套装:
setlist = [s1,s2,s3...]
Run Code Online (Sandbox Code Playgroud)
我想要s1∩s2∩s3...
我可以通过执行一系列成对s1.intersection(s2)等来编写一个函数来完成它.
有推荐的,更好的或内置的方式吗?
考虑有一些整数列表:
#--------------------------------------
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) 是否有一个方法java.util.Map或任何工具在两个地图上执行交集?(通过"键"交叉两个地图)
我找不到任何东西.我总是可以实现自己的交集逻辑,但我希望在其中一个java.util.*类中已经有一些操作可以执行此操作.
是否存在一个算法,给定两组,在线性时间内计算它们的交集?
我可以运行两个for循环来检查所有元素对,记录我在两个集合中找到的元素.但是,运行时间将为O(n 2).我如何在O(n)时间内完成此操作?
使用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”。有什么方法可以检测是否发生这种情况吗?
谢谢。
我无法在一个地方找到任何令人满意的关于这个主题的报道,所以我想知道:什么是最快的交集,联合和分离算法?
有限域名是否有任何有趣的?
任何人都可以击败O(Z),其中Z是交叉点的实际大小?
如果您的方法依赖于排序集,请注意,但不要将其视为不合格因素.在我看来,必须有一个真正的微妙优化仓库来分享,我不想错过任何一个.
我知道的一些算法依赖于vanilla之外的按位运算,因此您可以假设存在SSE4并访问popcount等内在函数.请注意这个假设.
有趣的是: BY Intersect的实现
更新
我们有一些非常好的部分答案,但我仍然希望对这个问题有更完整的攻击.我特别感兴趣的是看到更明确地使用布隆过滤器来解决这个问题.
更新
我已经完成了一些关于将bloom过滤器与cuckoo哈希表相结合的初步工作.它看起来几乎令人讨厌,因为它们有非常相似的需求.我已经接受并接受了答案,但此刻我并不满意.
我有两个数组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)
我正在寻找一种简单的方法来执行以下三个操作:
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
如果我有一个变量多套(我们称之为数Ñ),其中最多有米元件分别,什么是计算成对交叉将所有对套最有效的方法是什么?请注意,这与所有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的增加是如何增加的,并且该组的大小变得太大.
一些额外的背景信息:
目前,我认为我最好的选择是使用std :: set_intersection,然后检查较小输入的大小是否与set_intersection填充的元素数相同.
有更好的解决方案吗?
set-intersection ×10
python ×4
algorithm ×3
list ×2
set ×2
arrays ×1
big-o ×1
c++ ×1
collections ×1
dictionary ×1
java ×1
javascript ×1
math ×1
merge ×1
subset ×1
tree ×1