Ho un problema riguardante l'efficienza e gli algoritmi quando si tratta di trovare la differenza tra due array molto grandi. Spero che qualcuno con una buona conoscenza degli algoritmi possa indicarmi la giusta direzione su come risolverlo, poiché le mie attuali implementazioni richiedono una quantità di tempo estremamente lunga.Ruby - è un modo efficace per trovare la differenza tra due array molto grandi?
Problema:
Ho due molto grandi array. Uno contiene un elenco di e-mail con nomi di dominio non validi e l'altro è un elenco misto che devo controllare con il primo array.
accounts_with_failed_email_domains = [279,000 records in here]
unchecked_account_domains = [149,000 records in here]
Che cosa devo fare è passare attraverso la lista dei unchecked_account_domains
e quindi confrontare ogni voce per vedere se v'è una corrispondenza nel accounts_with_failed_email_domains
. Ho bisogno di inserire tutte le corrispondenze tra gli elenchi in un array separato per essere elaborato in seguito.
Come scrivere in modo efficiente qualcosa che possa controllare rapidamente questi account. Ecco cosa ho provato finora.
unchecked_account_domains = [really big array]
unchecked_account_domains = unchecked_account_domains.sort
accounts_with_failed_email_domains = [another huge array].sort
unchecked_account_domains.keep_if do |email|
accounts_with_failed_email_domains.any? { |failed_email| email == failed_email }
end
# Count to see how many accounts are left
puts unchecked_account_domains.count
Questa implementazione di cui sopra è stata eseguita per sempre. Ecco il secondo tentativo che non si è ancora dimostrato migliore.
unchecked_account_domains = [really big array]
unchecked_account_domains = unchecked_account_domains.sort
accounts_with_failed_email_domains = [another huge array].sort
unchecked_account_domains.each do |email|
accounts_with_failed_email_domains.bsearch do |failed_email|
final_check << email if email == failed_email
end
end
# Count to see how many accounts are left
puts final_check.count
bsearch
sembrava essere promettente, ma sono abbastanza sicuro che non sto usando questo modo corretto. Inoltre, ho provato a esaminare questa domanda comparing large lists ma questo è in python
e non riesco a trovare un equivalente Ruby per set
. Qualcuno ha qualche idea su come risolvere questo?
http://ruby-doc.org/stdlib-2.3.1/libdoc/set/rdoc/Set.html? –