web-dev-qa-db-fra.com

Existe-t-il une fonction de recherche binaire intégrée à Ruby?

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?

30
Jonah

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!

49

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 }

4
Yoav Epstein

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.

0
Ruto Collins