2017-04-03 101 views
0

問題在於,給出[1,2,3,4,5][2,4,5],以確定第二個數組中的每個元素是否包含在第一個數組中。答案是真的。如何確定一個數組是否包含在另一個數組中

什麼是應該做的最簡潔有效的方式優於:

arr2.reject { |e| arr1.include?(e) } .empty? 
+2

如果數組有重複的項目,期望值是多少? –

回答

3

壞O(N²)一行程序應該是這樣的:

arr2.all? { |x| arr1.include? x } 
arr2.all? &arr1.method(:include?) # alternative 

如果你的對象是可哈希,

require 'set' 

arr2.all? &Set.new(arr1).method(:include?) 

如果你的對象是完全一樣:你可以通過一組出了第一陣列使這個爲O(n) ,有序的,你可以用一種和二進制搜索使其爲O(n log n)的:

arr1.sort! 
arr2.all? { |x| arr1.bsearch { |y| x <=> y } } 
+0

如果你使用Set,那麼爲什麼不這樣做: 'Set.new(arr2)<= Set.new(arr1)' – Tao

+0

@Tao:構建第二套沒有時間的好處,但如果你喜歡它的讀法,那也很重要。 – Ryan

+0

我想......如果你使用集合,你可以寫成:'arr1&arr2 == arr2'。 –

1

正如@Ryan提到你可以使用套。在這種情況下,Set#subset?是提供給你,這是相當可讀(需要注意:從數組一組的兩種不同的方式):

require 'set' 

s1 = Set.new([1, 2, 3]) 
s2 = [1, 2].to_set 
s3 = [1, 3].to_set 
s4 = [1, 4].to_set 

s1.subset? s1 #=> true 
s2.subset? s1 #=> true 
s3.subset? s1 #=> true 
s4.subset? s1 #=> false 

如果需要的話也可以考慮使用Set#proper_subset

s1.proper_subset? s1 #=> false 
s2.proper_subset? s1 #=> true 

NB一組不包含重複元素例如Set.new([1,2,3,3]) #=> #<Set: {1, 2, 3}>

4

Array subtraction應該工作,如在

(arr2 - arr1).empty? 

描述的方法:

返回一個新數組,它是原始數組的副本,除去任何 項也出現在[第二陣列]。訂單從 原始數組中保留。

它使用它們的散列和eql比較元素?提高效率的方法。

我不認爲自己是效率方面的專家,但@Ryan在his answer的評論中指出,它在規模上合理高效。

相關問題