問題在於,給出[1,2,3,4,5]
和[2,4,5]
,以確定第二個數組中的每個元素是否包含在第一個數組中。答案是真的。如何確定一個數組是否包含在另一個數組中
什麼是應該做的最簡潔有效的方式優於:
arr2.reject { |e| arr1.include?(e) } .empty?
問題在於,給出[1,2,3,4,5]
和[2,4,5]
,以確定第二個數組中的每個元素是否包含在第一個數組中。答案是真的。如何確定一個數組是否包含在另一個數組中
什麼是應該做的最簡潔有效的方式優於:
arr2.reject { |e| arr1.include?(e) } .empty?
壞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 } }
正如@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}>
Array subtraction應該工作,如在
(arr2 - arr1).empty?
描述的方法:
返回一個新數組,它是原始數組的副本,除去任何 項也出現在[第二陣列]。訂單從 原始數組中保留。
它使用它們的散列和eql比較元素?提高效率的方法。
我不認爲自己是效率方面的專家,但@Ryan在his answer的評論中指出,它在規模上合理高效。
如果數組有重複的項目,期望值是多少? –