Qual é a maneira mais eficiente de testar se uma matriz contém algum elemento de uma segunda matriz?
Dois exemplos abaixo, a tentativa de responder à pergunta foods
contém qualquer elemento de 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
any?
: O método retorna true se o bloco sempre retorna um valor diferente de false ou nil.empty?
: Retorna true se self não contém elementos.(cheeses & foods).any?
é a pergunta do OP: se existem alimentos em queijos? No exemplo dele, "feta" está nos dois, então o resultado deve ser verdadeiro, certo? Então, por que verificar.empty?
no cruzamento?[false, false, false]
, embora obviamente não esteja vazio.Que tal o Enumerable # any?
Script de benchmark:
Resultado:
fonte
cheeses
- se em um conjunto.any?, include?
foi o mais rápido, o conjunto desmembrou o mais lento: gist.github.com/jaredmoody/d2a1e83de2f91fd6865920cd01a8b497Você pode verificar se o cruzamento está vazio.
fonte
fonte
disjoint?
é muito elegante, especialmente em comparação com "any ?, include?". A pergunta original perguntou sobre elegante e eficiente..to_set
método pode ser útil aquicheeses.to_set.disjoint?(foods.to_set)
fonte