(Ruby) Si l'opérateur d'intersection du tableau (et) est inefficace, pourquoi est-il disponible?

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

  •  22-08-2019
  •  | 
  •  

Autres conseils

Le libellé de la question d'hier fait sonner comme vous calculez une condition binaire: ces plages se chevauchent? Les réponses données peuvent être calculées en temps constant, donc s'ils travaillent pour vous, il est logique de rester avec eux.

L'opérateur & serait approprié si vous avez besoin de connaître le étendue du chevauchement, mais ce ne fut pas ce que vous demandiez au sujet.

Quant à savoir pourquoi il existe, je ne peux que spéculer: Non seulement il ajouter la commodité, mais ce n'est pas difficile d'imaginer des façons dont une opération de liaison de tableau pourrait être optimisé par l'environnement linguistique - même si son calcul pourrait ou encore besoin linéaire n * log (n) dans le pire des cas. (Si chaque opération doit avoir un résultat à temps constant, il faudrait se débarrasser d'un bon nombre de méthodes!)

Les tableaux de Ruby ne sont pas typées: ils peuvent contenir un mélange de types, y compris hash, d'autres tableaux, symboles, peu importe. Dans un tableau typé de tri et la comparaison est beaucoup plus simple. En comparant les collections typées (en particulier des collections contenant des collections) est plus coûteux par nature.

Il ne semble pas trop mauvais en termes d'un test. Machine a été i7 (dual core 2.0Ghz)

#!/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