向量中集合的并集
Union of collection of sets in vector
如果我有一个集合向量,比如说,
vec_of_sets = [Set(vec1), Set(vec2), ..., Set(vecp)]
如何获得等于向量中集合并集的集合?也就是我怎样才能高效的写出下面的内容?
S1 = Set(vec1);
union!(S1, Set(vec2))
union!(S1, Set(vec3))
...
union!(S1, Set(vecp))
我真的不知道从哪里开始!
提前致谢。
编辑:我试过使用生成函数的解决方案,但它不起作用:
union(j for j in vec_of_sets)
我想你应该使用 reduce
:
reduce(union, vec_of_sets)
但你也可以使用 splatting(使用 ...
):
union(vec_of_sets...)
FWIW,您也可以在尝试中使用拆分:
union((j for j in vec_of_sets)...)
最好最快的方法是:
Set(Iterators.flatten(vec_of_sets))
它的速度大约是另一个 post 提出的其他可能方法的两倍,并且分配了一半以上的内存。
以下是一些基准:
julia> v = [Set(1:3), Set(2:6), Set(4:8)];
julia> @btime Set(Iterators.flatten($v));
270.492 ns (4 allocations: 400 bytes)
julia> @btime reduce(union, $v);
550.000 ns (11 allocations: 1.25 KiB)
julia> @btime union($v...);
506.250 ns (11 allocations: 944 bytes)
julia> @btime union((j for j in $v)...);
699.286 ns (15 allocations: 1.03 KiB)
如果我有一个集合向量,比如说,
vec_of_sets = [Set(vec1), Set(vec2), ..., Set(vecp)]
如何获得等于向量中集合并集的集合?也就是我怎样才能高效的写出下面的内容?
S1 = Set(vec1);
union!(S1, Set(vec2))
union!(S1, Set(vec3))
...
union!(S1, Set(vecp))
我真的不知道从哪里开始!
提前致谢。
编辑:我试过使用生成函数的解决方案,但它不起作用:
union(j for j in vec_of_sets)
我想你应该使用 reduce
:
reduce(union, vec_of_sets)
但你也可以使用 splatting(使用 ...
):
union(vec_of_sets...)
FWIW,您也可以在尝试中使用拆分:
union((j for j in vec_of_sets)...)
最好最快的方法是:
Set(Iterators.flatten(vec_of_sets))
它的速度大约是另一个 post 提出的其他可能方法的两倍,并且分配了一半以上的内存。
以下是一些基准:
julia> v = [Set(1:3), Set(2:6), Set(4:8)];
julia> @btime Set(Iterators.flatten($v));
270.492 ns (4 allocations: 400 bytes)
julia> @btime reduce(union, $v);
550.000 ns (11 allocations: 1.25 KiB)
julia> @btime union($v...);
506.250 ns (11 allocations: 944 bytes)
julia> @btime union((j for j in $v)...);
699.286 ns (15 allocations: 1.03 KiB)