ruby - arreglos - Array incluye cualquier valor de otra matriz?
array ruby (4)
¿Cuál es la mejor manera, la más elegante / eficiente para probar si una matriz contiene algún elemento de una segunda matriz?
A continuación, dos ejemplos que intentan responder a la pregunta, ¿los alimentos contienen algún elemento de los "quesos"?
cheeses = %w(chedder stilton brie mozzarella feta haloumi)
foods = %w(pizza feta foods bread biscuits yoghurt bacon)
puts cheeses.collect{|c| foods.include?(c)}.include?(true)
puts (cheeses - foods).size < cheeses.size
¿Qué hay de Enumerable#any?
>> 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
Script de referencia:
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
Resultado:
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)
Puedes verificar si la intersección está vacía.
cheeses = %w(chedder stilton brie mozzarella feta haloumi)
foods = %w(pizza feta foods bread biscuits yoghurt bacon)
foods & cheeses
=> ["feta"]
(foods & cheeses).empty?
=> false
(cheeses & foods).empty?
Hace lo mismo, lo que publicó inyectó, pero ya está compilado acciones en un idioma.
Como dijo Marc-André Lafortune en los comentarios, ¿ &
funciona en tiempo lineal mientras que any?
+ include?
será cuadrático Para conjuntos de datos más grandes, el tiempo lineal será más rápido. Para conjuntos de datos pequeños, any?
+ include?
puede ser más rápido como lo demuestra la respuesta de Lee Jarvis.
Set.new(cheeses).disjoint? Set.new(foods)