我有以下数组:
A = [1,2,3,4,5]
B = [2,6,7,1]
我想找到不相交的元素,如下:
output = [3,4,5,6,7]
我能够达到以下目的,
output = A + B - (A & B)
但效率很低,因为我正在添加两个数组,然后删除常用元素。它类似于寻找非交叉元素。我可以做得比这更好吗?如果是这样,怎么样?
答案 0 :(得分:6)
如何只选择A中不在B中的元素和B中不在A中的元素。
(A - B) + (B - A)
答案 1 :(得分:6)
您可以使用Set
A = Set[1,2,3,4,5]
=> #<Set: {5, 1, 2, 3, 4}>
B = Set[2,6,7,1]
=> #<Set: {6, 1, 7, 2}>
C = A ^ B
=> #<Set: {5, 6, 7, 3, 4}>
C.to_a
=> [5, 6, 7, 3, 4]
答案 2 :(得分:5)
另一个:
(A | B) - (A & B)
但您可能想要使用自己的版本:
require 'benchmark'
n = 50000
A = (1..1000).to_a
B = [2,6,7,1]
Benchmark.bm do |x|
x.report { n.times do; (A + B) - (A & B); end }
x.report { n.times do; (A - B) + (B - A); end }
x.report { n.times do; (A | B) - (A & B); end }
x.report { n.times do; (Set[*A] ^ Set[*B]).to_a; end }
end
user system total real
2.200000 0.000000 2.200000 ( 2.208357)
9.600000 0.010000 9.610000 ( 9.591845)
10.630000 0.000000 10.630000 ( 10.621927)
31.420000 0.000000 31.420000 ( 31.418155)