(Vermiglio) Se l'operatore matrice intersezione (e) è inefficiente, perché è disponibile?

StackOverflow https://stackoverflow.com/questions/701980

  •  22-08-2019
  •  | 
  •  

Altri suggerimenti

formulazione della domanda di ieri ha reso il suono come se stessi calcolare una condizione binaria: fanno questi intervalli si sovrappongono? Le risposte che sono state date può essere calcolato in tempo costante, in modo da se lavorano per voi, ha senso restare con loro.

L'operatore & sarebbe appropriato se avete bisogno di sapere il misura della sovrapposizione, ma che non era quello che stavi chiedendo circa.

Per quanto riguarda il motivo per cui esiste, posso solo fare delle ipotesi: Non solo aggiungere la convenienza, ma non è difficile immaginare i modi in cui un'operazione di matrice congiunzione potrebbe essere ottimizzata con l'ambiente di lingua - anche se il suo calcolo potrebbe richiedono ancora lineare o n * log (n) nel peggiore dei casi. (Se ogni operazione deve avere un risultato costante di tempo, avremmo dovuto sbarazzarsi di alcuni metodi abbastanza!)

Gli array in Ruby sono senza tipo: possono contenere una combinazione di tipi tra cui hash, altri array, simboli, qualsiasi cosa. In un array tipizzato l'ordinamento e il confronto è molto più semplice. Confrontando collezioni tipizzati (specialmente raccolte contenenti raccolte) risulta più costosa per natura.

Non sembra troppo male in termini di un test. Macchina era i7 (2.0Ghz dual core)

#!/bin/ruby
require 'benchmark'
n = []
1.upto(10_000_000) do |i|
  n << i
end

m = Array.new(1000000){ rand(10_000_000)+1 }

Benchmark.bm(10) do |x|
  x.report('array_intersection'){ n & m }
end

                    user     system      total        real
array_intersection  2.870000   0.040000   2.910000 (  2.895202)
scroll top