Je recherche une méthode Ruby intégrée qui présente les mêmes fonctionnalités que index
mais utilise un algorithme de recherche binaire et nécessite donc un tableau trié au préalable.
Je sais que je pourrais écrire ma propre implémentation, mais selon " Ruby # index, méthode VS VS Binary Search ", la recherche itérative simple intégrée utilisée par index est plus rapide que la version pure-Ruby de la recherche binaire, car méthode intégrée est écrite en C.
Ruby fournit-il des méthodes intégrées permettant la recherche binaire?
Ruby 2.0 introduit Array#bsearch
et Range#bsearch
.
Pour Ruby 1.9, vous devriez regarder dans bsearch
et binary_search
gems. Une autre possibilité consiste à utiliser une collection différente de celle d'un tableau, comme en utilisant rbtree
bsearch
est dans mon backports
gem , mais il s’agit d’une version pure de Ruby, donc un peu plus lente. Notez qu'une recherche purement binaire Ruby sera toujours plus rapide qu'une recherche linéaire intégrée telle que index
ou include?
pour des tableaux/plages assez grands (ou des comparaisons coûteuses), car ce n'est pas le même ordre de complexité O(log n)
vs O(n)
.
Pour jouer avec elle aujourd'hui, vous pouvez require 'backports/2.0.0/array/bsearch'
ou require 'backports/2.0.0/range/bsearch'
.
Bonne chance!
Beaucoup de choses ont changé depuis 2011, dans Ruby 2.3, vous pouvez utiliser bsearch_index
https://Ruby-doc.org/core-2.3.0/Array.html#method-i-bsearch_index
array.bsearch_index { |val| query <=> val }
J'utilise bsearch
. Voilà comment cela fonctionne:
array = ['one', 'two', 'three', 'four', 'five']
search = array.sort.bsearch { |value| 'four' <=> value }
Remarque: la recherche binaire nécessite un tableau trié. cela ajoute un léger surcoût mais c'est correct, comparé à la vitesse de la recherche.
search
renverra la valeur four
de la array
, sinon nil
si elle ne trouve pas la valeur.