2011-12-29 20 views
26

Estoy buscando un método incorporado de Ruby que tenga la misma funcionalidad que index, pero utiliza un algoritmo de búsqueda binario, y por lo tanto requiere una matriz ordenada previamente.¿Hay una búsqueda binaria incorporada en Ruby?

Sé que podría escribir mi propia implementación, pero de acuerdo con "Ruby#index Method VS Binary Search", la búsqueda iterativa simple incorporada utilizada por el índice es más rápida que una versión pura de Ruby de la búsqueda binaria, ya que el método incorporado está escrito en C.

¿Proporciona Ruby algún método integrado que realice la búsqueda binaria?

+0

No hay necesidad de escribir su propia: [Tyler/binary_search] (https: // github .com/tyler/binary_search). El autor también se ha tomado el tiempo para ejecutar algunos puntos de referencia. – sczizzo

+0

Hola sczizzo, soy nuevo en ruby, así que esta es una pregunta bastante nueva, pero ¿cómo puedo agregar esta funcionalidad a mi instalación de ruby? ¿Es solo una cuestión de ejecutar el archivo de rastreo? Gracias. – Jonah

+2

Podría ser más fácil usar la gema 'bsearch', como sugirió Marc-André. Entonces es más o menos tan simple como 'gem install bsearch' en la línea de comando, y' require 'bsearch'' en tu Ruby. Es posible que desee [consulte la documentación sobre el uso] (http://rubydoc.info/gems/bsearch/1.5.0/frames). – sczizzo

Respuesta

43

Ruby 2.0 presentó Array#bsearch y Range#bsearch.

Para Ruby 1.9, debe buscar en las gemas bsearch y binary_search. Otra posibilidad es utilizar un conjunto diferente de una matriz, como using rbtree

bsearch está en mi backports gem, pero esta es una versión pura de Ruby, por lo que un poco más lento. Tenga en cuenta que una búsqueda binaria pura de Ruby seguirá siendo más rápida que una búsqueda interna lineal como index o include? para matrices/rangos suficientemente grandes (o comparaciones costosas), ya que no es el mismo orden de complejidad O(log n) contra .

Para jugar con él hoy, puede require 'backports/2.0.0/array/bsearch' o require 'backports/2.0.0/range/bsearch'.

¡Buena suerte!

+0

Hola Marc, gracias por la respuesta. ¿Hay alguna biblioteca de terceros (escrita en C) que pueda usar? – Jonah

+0

Parece que hay uno. Respuesta actualizada –

+0

Y @sczizzo vinculado a otra gema también. –

Cuestiones relacionadas