在两个数组中找到不相交元素的有效方法是什么?

时间:2016-02-19 10:13:59

标签: arrays ruby

我有以下数组:

A = [1,2,3,4,5]
B = [2,6,7,1]

我想找到不相交的元素,如下:

output = [3,4,5,6,7]

我能够达到以下目的,

output = A + B - (A & B)

但效率很低,因为我正在添加两个数组,然后删除常用元素。它类似于寻找非交叉元素。我可以做得比这更好吗?如果是这样,怎么样?

3 个答案:

答案 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)