What’s the most efficient way to test if an array contains any element from a second array?
Two examples below, attempting to answer the question does foods contain any element from 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
As Marc-André Lafortune said in comments,
&works in linear time whileany?+include?will be quadratic. For larger sets of data, linear time will be faster. For small data sets,any?+include?may be faster as shown by Lee Jarvis’ answer — probably because&allocates a new Array while another solution does not and works as a simple nested loop to return a boolean.