2011-09-15 8 views
5

Dado un elemento y una matriz, el método Ruby # index devuelve la posición del elemento en la matriz. Implementé mi propio método de índice utilizando la búsqueda binaria esperando que el mío supere al de la versión incorporada. Para mi sorpresa, el built-in ejecutó aproximadamente tres veces más rápido que el mío en un experimento.Ruby # index Método VS Binary Search

Cualquier Rubyist sabe la razón por qué?

+2

¿Quién dijo que el método Ruby '# index' no estaba implementado con la búsqueda binaria? Y, además, ¿quién dijo que el método se implementó en Ruby en absoluto? :-) –

+0

@ Platinum Azure Oh, ya veo, podría implementarse en C con búsqueda binaria. ¡Muchas gracias! –

+0

¡Lo tienes! :-) –

Respuesta

10

El #index is not a binary search incorporado, es simplemente una búsqueda iterativa simple. Sin embargo, está implementado en C en lugar de Ruby, por lo que, naturalmente, puede ser varios órdenes de magnitud más rápido.

+0

Gracias. Eso es realmente extraño, sin embargo. ¿Hubo alguna razón por la cual no adoptaron el enfoque de búsqueda binaria? –

+1

Una búsqueda binaria implica poder comparar dos elementos, en lugar de poder ver si dos elementos son iguales. También observe que la documentación dice que devuelve el * primer * objeto igual al argumento - una búsqueda binaria no siempre devolvería ese elemento. Además, mi versión de #bsearch (suponiendo que la matriz esté ordenada) no parece más lenta que #index: https://gist.github.com/1220440 –

+0

Supongo que su implementación de #bsearch puede superar la diferencia entre Ruby y C con eso entre búsqueda binaria y búsqueda secuencial? –