Hoy vamos a hablar de binary search (búsqueda binaria) con #Javascript!
[1/x]
Binary Search nos ayuda a encontrar elementos en una lista de una forma super optimizada.
Imaginemos que tenemos esta lista, y tenemos que encontrar el número "36"
Qué formas se te ocurren para encontrarlo?
Mmm, se me ocurre usar:
- indexOf
- filter
- includes
- incluso un for común y corriente.
El problema de todas estas soluciones, es que tienen un costo en Big O lineal. Big O(n), donde n es el tamaño de la lista.
Podemos hacerlo mucho mejor!
Binary Search (BS) es un algoritmo que nos ayuda a encontrar elementos descartando pedazos de la lista que no necesitamos.
Para usarlo, hay una regla importantísima: la lista tiene que estar ordenada!
Si ves una lista ordenada, es un indicador para resolver el algoritmo con BS!
Entendamos como funciona BS con un ejemplo visual.
Vamos a necesitar 3 variables.
- Un mínimo, que empezará en 0
- Un máximo, cuyo valor será el tamaño de la lista - 1
- Un pivote, que se calcula redondeando (min + max) / 2
pivote es el punto medio entre los rangos min y max!
En esta ocasión, pivote tiene un valor de 4. Este será el indice a buscar en esta ocasión.
array[4] -> 15
Estamos buscando el 36, y 15 es menor. La variable min es reemplaza por pivote + 1, y es hora de calcular pivote de nuevo!
Esto descarta la lista a la izquierda de pivote.
Ahora pivote vale 7!
array[7] -> 54
Uhm, aún no encontramos el 36. 54 es mayor, entonces la variable max es reemplaza por pivote - 1.
Todos los números a la derecha pivote son descartados, y calculamos pivote otra vez.
Ya casi nos acercamos!
pivote ahora vale 6!
array[6] -> 36
Al fin encontramos el número! Estaba en el índice 6.
Si hubieras hecho un for, habriamos hecho 6 INTENTOS!
Con BS, solo fueron 3.
Ahora imagina este problema con un millón de números. O con un billón de datos.
Este es el poder de BS!
Hora de codear!
Como vimos, primero necesitamos una función binary search que va a declarar una variable min, max y pivote.
Luego nos toca hacer el ciclo para mover el pivote por la lista!
Y como vamos a movernos por la lista?
Un while nos va ayudar. Este ciclo se va a repetir una y otra vez mientras min y max no se encuentren. Si lo hacen, es porque el número a buscar no está en la lista.
Y al inicio de cada ciclo, calculamos el punto medio de min y max.
Ahora tocan las condiciones!
Recuerda: si el número que vemos en este ciclo es menor al número a buscar, reducimos max, lo que va a descartar la lista a su derecha.
Si es menor, incrementamos min y nos deshacemos de la lista a la izquierda.
Si corremos el código, podemos ver que si encuentra el número 36!
En términos algorítmicos, que complejidad tiene binary search?
Un indexOf es Big O(n).
BS es Big O(logn)
Qué significa esto?
Big O(n) significa que dependiendo la cantidad de elementos, es la cantidad de acciones que harás en el peor de los casos. Si tienes un millón de datos y el que buscas está al final, buscarás un millón de veces hasta encontrarlo.
Bastante lento!
Big O(logn) significa que podemos resolver un problema con solo una parte de los datos que tenemos a la mano.
Matemáticamente es algo un poco más complejo de explicar, pero quedemos con esta definición por ahora!
Binary search es un algoritmo bastante común de encontrar en entrevistas. Normalmente se pregunta como un problema enfocado a esto, o como una forma para buscar una optimización al problema que estas realizando.
Conocerlo te da una ventaja para pasar la entrevista!
Y esto es todo! Nos vemos en un próximo ⚡️ thread de "como enfrentar la entrevista de algoritmos para entrar a #SiliconValley/#FAANG"!
• • •
Missing some Tweet in this thread? You can try to
force a refresh
Antes que nada, tenemos que saber que curry es un concepto de functional programming (uno de mis temas favoritos!)
Imagina que tienes una función suma.
Suma recibe 3 argumentos y regresa la suma de ellos.
Es un caso super común! Pero qué tal si queremos tener la opción de enviarle los argumentos 1 a 1, en diferentes tiempos, y que se ejecute "mágicamente" hasta que tenga todos?
Esto es el concepto de curry, y en este caso es una "curried function"
Varios de estos recursos los sigo leyendo cada cierto tiempo, y son excelentes para prepararse en la entrevista especializada de Front End de las empresas grandes en Silicon Valley / #FAANG
[1/x]
Eloquent Javascript: mi biblia de JS enfocado al browser. Desde APIs del DOM hasta técnicas para mejorar el performance de las aplicaciones web.
Si tuvieras que elegir un libro de esta lista, que sea este.
Marca un antes y después como developer.
#CSS Secrets: Cuando empecé mi carrera como front end, odiaba CSS.
Este libro me abrió la mente para descubrir que no lo odiaba, sino que no lo entendía. Y va mucho más allá: no solo ser técnico, pero creativo al crear una UI.
En lo que tengo mi break del segundo día de on boarding en #Google, les dejo uno de mis tools favoritos para codear: hablemos de terminales.
lightning #thread ⚡️🧵