bidimensionales arreglos array ruby arrays

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)