Búsqueda: lineal y binaria
Para encontrar un nombre en una lista ordenada de un millón, la búsqueda binaria nunca necesita más de 20 comprobaciones.
Buscar un valor
Buscar es el problema de encontrar dónde está un valor en una colección, o saber que no está. Tu celular lo hace cuando escribes el nombre de un contacto, una tienda lo hace cuando revisa si un artículo está en existencia, y un corrector ortográfico lo hace con cada palabra que escribes. La entrada es una lista y un valor objetivo. La salida es la posición del objetivo, o una señal como -1 que significa "no encontrado".
Búsqueda lineal: de uno en uno
El método más simple es empezar por la izquierda y revisar cada valor por turno hasta encontrar el objetivo o quedarse sin lista. Esto es la búsqueda lineal. Funciona con cualquier lista, ordenada o no. Su costo depende de la suerte: si el objetivo es el primero, basta con una comprobación; si es el último o no está, revisas todos los valores. Para una lista de n valores, el peor caso son n comprobaciones. Una lista del doble de larga puede llevar el doble de comprobaciones, y de ahí viene el nombre de "lineal": el trabajo crece en línea recta con el tamaño.
function linearSearch(list, target) {
for (let i = 0; i < list.length; i++) {
if (list[i] === target) return i; // lo encontramos
}
return -1; // se revisó todo
}Búsqueda binaria: partir por la mitad lo que queda
Si la lista está ordenada, se puede hacer mucho mejor. Piensa en el juego de adivinar un número: alguien elige un número del 1 al 100 y solo responde "más alto" o "más bajo". Un jugador sensato dice primero 50. Sea cual sea la respuesta, la mitad de las posibilidades desaparecen. El siguiente intento es el medio de lo que queda, y así sucesivamente. La búsqueda binaria hace exactamente esto con una lista ordenada. Guarda dos marcadores, lo y hi, alrededor de la parte donde todavía podría estar el objetivo. Revisa el valor del medio. Si es el objetivo, termina. Si el valor del medio es menor que el objetivo, todo lo que está a su izquierda también es menor, así que lo pasa más allá del medio. Si es mayor, hi pasa a antes del medio. Cuando lo rebasa a hi, ya no queda nada y el objetivo no está en la lista.
function binarySearch(list, target) {
let lo = 0, hi = list.length - 1;
while (lo <= hi) {
const mid = Math.floor((lo + hi) / 2);
if (list[mid] === target) return mid;
if (list[mid] < target) lo = mid + 1; // el objetivo está a la derecha
else hi = mid - 1; // el objetivo está a la izquierda
}
return -1;
}Arrastra para girar. Desplaza o pellizca para acercar.
¿Cuántas comprobaciones?
Cada comprobación de la búsqueda binaria reduce al menos a la mitad la parte que queda. Empezando con n valores, después de una comprobación quedan como mucho unos n/2, después de dos unos n/4, y así hasta que queda un solo valor. El número de mitades necesarias para pasar de n a 1 es el logaritmo en base 2 de n, que se escribe log₂ n. Contando también la última comprobación, la búsqueda binaria necesita como máximo ⌊log₂ n⌋ + 1 comprobaciones, donde ⌊ ⌋ significa redondear hacia abajo. Para 100 valores son 7 comprobaciones, y por eso el juego de adivinar siempre se puede ganar en 7 intentos. Para 1000 valores son 10, para un millón 20 y para mil millones 30.
| Tamaño de la lista n | Búsqueda lineal, peor caso | Búsqueda binaria, peor caso |
|---|---|---|
| 7 | 7 | 3 |
| 100 | 100 | 7 |
| 1,000 | 1,000 | 10 |
| 1,000,000 | 1,000,000 | 20 |
| 1,000,000,000 | 1,000,000,000 | 30 |
La trampa: la lista debe estar ordenada
La búsqueda binaria solo funciona porque, en una lista ordenada, una comparación te dice de qué lado tiene que estar el objetivo. En una lista sin ordenar, el valor del medio no dice nada sobre sus vecinos, así que vuelves a la búsqueda lineal. Ordenar lleva su propio trabajo (de eso tratan las dos unidades siguientes), así que la elección depende del uso. Si buscas en una lista una sola vez, la búsqueda lineal puede ser lo más barato. Si buscas en la misma lista miles de veces, ordenarla una vez y luego usar la búsqueda binaria compensa enseguida. Este equilibrio entre preparar los datos y responder preguntas sobre ellos recorre toda la materia.
lo = mid en lugar de lo = mid + 1 puede hacer que el bucle no termine nunca cuando quedan dos valores, porque mid no cambia. El valor del medio ya se revisó, así que se puede dejar fuera del rango siguiente.| búsqueda lineal | Revisar los valores uno por uno desde el principio |
| búsqueda binaria | Revisar el medio de un rango ordenado y descartar la mitad que no puede contener el objetivo |
| peor caso | La entrada que hace que el algoritmo trabaje más |
| log₂ n | Cuántas veces se puede partir n por la mitad antes de llegar a 1 |
| lo y hi | Los dos extremos del rango donde todavía podría estar el objetivo |
| -1 | Un valor de retorno habitual que significa "no encontrado" |
- ¿Cuántas comprobaciones necesita como máximo la búsqueda binaria para una lista ordenada de 1000 valores?
- ¿Cuántas comprobaciones necesita como máximo la búsqueda lineal para una lista de 1000 valores?
- La búsqueda binaria necesita que la lista esté
- ordenada
- corta
- formada por números enteros
- sin valores repetidos
- En la lista [2, 5, 8, 12, 16, 23, 38, 56, 72, 91], ¿cuántas comprobaciones hace la búsqueda binaria para encontrar 23?
- En la misma lista, ¿cuántas comprobaciones hace la búsqueda lineal para encontrar 23?
- La búsqueda binaria revisa un valor del medio, 40, mientras busca 25. ¿Qué pasa después?
- hi pasa a justo antes del medio
- lo pasa a justo después del medio
- la búsqueda se detiene: 25 no está
- revisa el valor siguiente a la derecha
- Puedes adivinar un número del 1 al 100 y te dicen "más alto" o "más bajo". Con la mejor estrategia, ¿cuántos intentos bastan siempre?
- Una lista duplica su tamaño. ¿Qué pasa con el número de comprobaciones de la búsqueda binaria en el peor caso?
- Se duplica
- Crece más o menos en uno
- Sigue exactamente igual
- Se eleva al cuadrado
- Vas a buscar un solo valor en una lista sin ordenar, una sola vez. ¿Qué es más barato?
- Búsqueda lineal
- Ordenar la lista y luego hacer búsqueda binaria
- ¿Por qué
lo = mid(en lugar demid + 1) puede hacer que la búsqueda binaria no termine nunca?- Con dos valores restantes, mid puede quedarse igual en cada vuelta
- mid se vuelve negativo
- JavaScript no lo permite
- La lista se alarga
- ¿Cuántas comprobaciones necesita como máximo la búsqueda binaria para 1 000 000 de valores?
- La búsqueda lineal revisa un valor cada vez: hasta n comprobaciones.
- La búsqueda binaria parte por la mitad el rango que queda: hasta ⌊log₂ n⌋ + 1 comprobaciones.
- La búsqueda binaria solo funciona en una lista ordenada.
- Un millón de valores: 20 comprobaciones como máximo.
- Actualiza con mid + 1 y mid − 1 para que el rango siempre se reduzca.
Fuentes de este curso (11)
- MIT OpenCourseWare 6.006 Introduction to Algorithms, Spring 2020 (Demaine, Ku, Solomon)
- lecture notes 1 Introduction, 3 Sorting, 9 Breadth-First Search, 10 Depth-First Search (ocw.mit.edu/courses/6-006-introduction-to-algorithms-spring-2020/pages/lecture-notes) and Fall 2011 lecture 13 BFS notes (ocw.mit.edu/courses/6-006-introduction-to-algorithms-fall-2011)
- Cormen, Leiserson, Rivest, Stein, Introduction to Algorithms (MIT Press)
- with the CLRS-based Khan Academy algorithms unit by Thomas Cormen and Devin Balkcom of Dartmouth (khanacademy.org/computing/computer-science/algorithms: binary search, selection sort analysis, merge sort, quicksort overview and analysis)
- MacTutor History of Mathematics, Al-Khwarizmi (mathshistory.st-andrews.ac.uk/Biographies/Al-Khwarizmi: word algorithm from the Latin title Algoritmi de numero Indorum)
- D. E. Joyce, Euclid's Elements Book VII Propositions 1 and 2 (mathcs.clarku.edu/~djoyce/elements/bookVII)
- Wolfram MathWorld, Merge Sort (mathworld.wolfram.com/MergeSort.html: proposed by John von Neumann in 1945, after Knuth 1998 p. 159)
- Stanford CS "Tony Hoare: Quicksort" (cs.stanford.edu/people/eroberts/courses/soco/projects/2008-09/tony-hoare/quicksort.html: devised while a student at Moscow State University for Russian-English machine translation with a tape dictionary, programmed in Algol 60 and published 1961; the year 1959 from the Wikipedia Quicksort article and its cited sources)
- Bodleian Libraries, Ada Lovelace (blogs.bodleian.ox.ac.uk/adalovelace: 1843 paper, Note G Bernoulli numbers)
- Fourmilab text of Menabrea's Sketch with Lovelace's notes (fourmilab.ch/babbage/sketch.html)
- Seven Bridges of Konigsberg (Euler 1736) and Tower of Hanoi (Edouard Lucas, 1883) checked against the Wikipedia articles and their cited sources.
Fecha de consulta: 2026-10-17