我在思考一个问题:有两个数组,我需要找到它们之间不共同的元素,例如:
a = [1,2,3,4]
b = [1,2,4]
我将期望的答案翻译为[3]
。
迄今为止,我一直是这样做的:
a.select { |elem| !b.include?(elem) }
但它给出了O(N ** 2)
的时间复杂度。我确信可以更快地完成它 ;)
另外,我一直在思考如何将其获取为此类形式(使用某种与&
相反的方法,它给出了2个数组的公共元素):
a !& b #=> doesn't work of course
另一种方法可能是将两个数组相加,并使用类似于uniq
的某种方法查找唯一元素,使其变为:
[1,1,2,2,3,4,4].some_method #=> would return 3
(a-b) | (b-a) # => [3]
意思是取两个集合 a-b 和 b-a 的并集,得到的结果是包含元素 3 的数组。请参考 http://www.ruby-doc.org/core-1.9.3/Array.html#method-i-2D ,注意这个运算不满足交换律,即通常情况下a-b != b-a
。 - Reinstate Monica -- notmaynardSet
s,然后使用Set#^
函数,因为它使用哈希表,所以时间复杂度可能是 O(n log n) 或 O(n)。 - Reinstate Monica -- notmaynard