Te has topado con un grupo de matemáticos que también son cantautores. Han escrito una canción para cada uno de sus números favoritos y, como puedes imaginar, tienen muchísimos números favoritos (como el 0, el 73 o el 6174).
Sientes curiosidad por escuchar la canción de tu número favorito, pero con tantas canciones entre las que rebuscar, encontrar la canción adecuada podría llevarte un buen rato. Por suerte, han organizado sus canciones en una lista de reproducción ordenada por el título, que no es más que el número sobre el que trata la canción.
Te das cuenta de que puedes usar un algoritmo de búsqueda binaria para encontrar rápidamente una canción a partir de su título.
Tu tarea consiste en implementar un algoritmo de búsqueda binaria.
Un algoritmo de búsqueda binaria encuentra un elemento en un array dividiéndolo repetidamente por la mitad y conservando solo la mitad que contiene el elemento que buscamos. Nos permite acotar rápidamente las posibles ubicaciones de nuestro elemento hasta que lo encontremos o hasta que hayamos descartado todas las posibles ubicaciones.
La búsqueda binaria solo funciona cuando un array está ordenado.
El algoritmo funciona así:
Aquí tienes un ejemplo:
Supongamos que buscamos el número 23 en el siguiente array ordenado: [4, 8, 12, 16, 23, 28, 32].
[23, 28, 32].[23].Tu solución debe coincidir con el comportamiento de las funciones searchsorted integradas de Julia para los casos de prueba.
Esto significa que, en lugar de devolver el índice del primer elemento coincidente que encuentres en el array, devolverás un rango cuyo límite inferior es el índice del primer elemento coincidente del array y cuyo límite superior es el índice del último elemento coincidente del array.
No obstante, para simplificar tu solución puedes suponer que el elemento objetivo no se repite, salvo en el conjunto de pruebas de la tarea adicional sobre coincidencias múltiples.
Si el elemento buscado no está en el array, debes devolver un rango vacío cuyo límite inferior sea el índice en el que podría insertarse el elemento en el array ordenado. Un rango vacío es cualquier rango en el que el límite superior sea menor que el límite inferior.
Lee la documentación y los ejemplos de la función searchsorted para obtener más detalles:
searchsorted(a, x; by=<transform>, lt=<comparison>, rev=false)
Return the range of indices of a which compare as equal to x (using binary
search) according to the order specified by the by, lt and rev keywords,
assuming that a is already sorted in that order.
Return an empty range located at the insertion point if a does not contain
values equal to x.
See also: insorted, searchsortedfirst, sort, findall.
Examples
julia> searchsorted([1, 2, 4, 5, 5, 7], 4) # single match
3:3
julia> searchsorted([1, 2, 4, 5, 5, 7], 5) # multiple matches
4:5
julia> searchsorted([1, 2, 4, 5, 5, 7], 3) # no match, insert in the middle
3:2
julia> searchsorted([1, 2, 4, 5, 5, 7], 9) # no match, insert at end
7:6
julia> searchsorted([1, 2, 4, 5, 5, 7], 0) # no match, insert at start
1:0
by, lt y rev, de modo que by especifique una transformación aplicada a todos los elementos del array, lt especifique una comparación y rev especifique si el array está ordenado en orden inverso. Cuando se usan estos parámetros, debes suponer que el array ya se ha ordenado con ellos. Consulta la documentación de sort para obtener más detalles.Regístrate en Exercism para aprender y dominar Julia con 35 conceptos128 ejercicios y mentoría humana real, todo gratis.