[ruby] 배열에 다른 배열의 값이 포함되어 있습니까?

배열에 두 번째 배열의 요소가 포함되어 있는지 테스트하는 가장 효율적인 방법은 무엇입니까?

아래 질문에 대한 답변을 시도하는 두 가지 예 foods에는 다음과 같은 요소 가 포함됩니다 cheeses.

cheeses = %w(chedder stilton brie mozzarella feta haloumi reblochon)
foods = %w(pizza feta foods bread biscuits yoghurt bacon)

puts cheeses.collect{|c| foods.include?(c)}.include?(true)

puts (cheeses - foods).size < cheeses.size



답변

(cheeses & foods).empty?

Marc-André Lafortune이 논평에서 말했듯 &이 선형 시간으로 작동하지만 any?+ include?는 2 차입니다. 더 큰 데이터 세트의 경우 선형 시간이 더 빠릅니다. 작은 데이터 세트의 경우 Lee Jarvis의 답변에서 볼 수 있듯이 any?+ include?가 빠를 수 있습니다. 아마도 &다른 솔루션이 새 배열을 할당하지 않고 부울을 반환하는 간단한 중첩 루프로 작동 하기 때문일 수 있습니다.


답변

방법에 대한 Enumerable에서 번호 어떤?

>> cheeses = %w(chedder stilton brie mozzarella feta haloumi)
=> ["chedder", "stilton", "brie", "mozzarella", "feta", "haloumi"]
>> foods = %w(pizza feta foods bread biscuits yoghurt bacon)
=> ["pizza", "feta", "foods", "bread", "biscuits", "yoghurt", "bacon"]
>> foods.any? {|food| cheeses.include?(food) }
=> true

벤치 마크 스크립트 :

require "benchmark"
N = 1_000_000
puts "ruby version: #{RUBY_VERSION}"

CHEESES = %w(chedder stilton brie mozzarella feta haloumi).freeze
FOODS = %w(pizza feta foods bread biscuits yoghurt bacon).freeze

Benchmark.bm(15) do |b|
  b.report("&, empty?") { N.times { (FOODS & CHEESES).empty? } }
  b.report("any?, include?") { N.times { FOODS.any? {|food| CHEESES.include?(food) } } }
end

결과:

ruby version: 2.1.9
                      user     system      total        real
&, empty?         1.170000   0.000000   1.170000 (  1.172507)
any?, include?    0.660000   0.000000   0.660000 (  0.666015)


답변

교차점이 비어 있는지 확인할 수 있습니다.

cheeses = %w(chedder stilton brie mozzarella feta haloumi)
foods = %w(pizza feta foods bread biscuits yoghurt bacon)
foods & cheeses
=> ["feta"]
(foods & cheeses).empty?
=> false


답변

Set.new(cheeses).disjoint? Set.new(foods)


답변

require "benchmark"
N = 1_000_000
puts "ruby version: #{RUBY_VERSION}"

CHEESES = %w(chedder stilton brie mozzarella feta haloumi).freeze
FOODS = %w(pizza feta foods bread biscuits yoghurt bacon).freeze

Benchmark.bm(15) do |b|
  b.report("&, empty?") { N.times { (FOODS & CHEESES).empty? } }
  b.report("any?, include?") { N.times { FOODS.any? {|food| CHEESES.include?(food) } } }
  b.report("disjoint?") { N.times { FOODS.to_set.disjoint? CHEESES.to_set }}
end
                      user     system      total        real
&, empty?         0.751068   0.000571   0.751639 (  0.752745)
any?, include?    0.408251   0.000133   0.408384 (  0.408438)
disjoint?        11.616006   0.014806  11.630812 ( 11.637300)


답변