Búsqueda lineal contra binaria
Cuenta las comparaciones que necesita cada búsqueda en la misma lista ordenada.
- Nivel
- Intermedio
- Conceptos:
- Entrada y salida
- Arreglos
- Funciones
- Mientras
- Para
- Si
- Azar
- SubProcesos
Ejecuta, modifica y depura este ejemplo en el navegador.
Lo que aprenderás
Dos funciones buscan el mismo valor y devuelven cuántas comparaciones hicieron. La lineal revisa uno por uno: O(1) si está primero, O(n) si está al final o no está. La binaria nunca pasa de log n comparaciones. Prueba con n = 10 y con n = 500 para ver cómo se separan.
Código
// Muestra el arreglo completo solo si es corto (30 o menos)SubProceso MostrarDatos(titulo, datos, n) Definir i Como Entero Si n <= 30 Entonces Escribir Sin Saltar titulo Para i <- 1 Hasta n Hacer Escribir Sin Saltar datos[i], " " FinPara Escribir "" SiNo Escribir titulo, n, " números (el primero es ", datos[1], " y el último ", datos[n], ")" FinSiFinSubProceso// Revisa los elementos uno por uno; devuelve cuántas comparaciones hizoFuncion comparaciones <- BuscarLineal(datos, n, buscado) Definir comparaciones, i Como Entero Definir encontrado Como Logico comparaciones <- 0 encontrado <- Falso i <- 1 Mientras i <= n Y (NO encontrado) Hacer comparaciones <- comparaciones + 1 Si datos[i] = buscado Entonces encontrado <- Verdadero FinSi i <- i + 1 FinMientrasFinFuncion// Parte el rango a la mitad en cada paso; devuelve cuántas comparaciones hizoFuncion comparaciones <- BuscarBinaria(datos, n, buscado) Definir comparaciones, izquierda, derecha, medio Como Entero Definir encontrado Como Logico comparaciones <- 0 encontrado <- Falso izquierda <- 1 derecha <- n Mientras izquierda <= derecha Y (NO encontrado) Hacer medio <- Trunc((izquierda + derecha) / 2) comparaciones <- comparaciones + 1 Si datos[medio] = buscado Entonces encontrado <- Verdadero SiNo Si datos[medio] < buscado Entonces izquierda <- medio + 1 SiNo derecha <- medio - 1 FinSi FinSi FinMientrasFinFuncionAlgoritmo CompararBusquedas Definir datos, objetivos, n, i, mitades, resto Como Entero Escribir "¿Cuántos números tiene la lista? (1 a 512)" Leer n Dimension datos[n], objetivos[4] Para i <- 1 Hasta n Hacer datos[i] <- 2 * i FinPara MostrarDatos("Lista: ", datos, n) // Cuatro casos: el primero, uno al azar, el último y uno que no está (impar) objetivos[1] <- datos[1] objetivos[2] <- datos[Aleatorio(1, n)] objetivos[3] <- datos[n] objetivos[4] <- 2 * Aleatorio(1, n) - 1 Para i <- 1 Hasta 4 Hacer Escribir "Buscar el ", objetivos[i], " -> comparaciones: lineal ", BuscarLineal(datos, n, objetivos[i]), ", binaria ", BuscarBinaria(datos, n, objetivos[i]) FinPara // Cuántas veces se puede partir n a la mitad: el peor caso de la binaria mitades <- 0 resto <- n Mientras resto > 0 Hacer mitades <- mitades + 1 resto <- Trunc(resto / 2) FinMientras Escribir "Peor caso con ", n, " elementos: lineal ", n, ", binaria ", mitades, "."FinAlgoritmoDiagrama de flujo
Cada bloque del diagrama corresponde a una instrucción del código.
Ejemplo de ejecución
Esto muestra el programa al ejecutarlo. Las respuestas escritas por el usuario aparecen resaltadas.
¿Cuántos números tiene la lista? (1 a 512)Respuesta del usuario: 100Lista: 100 números (el primero es 2 y el último 200)Buscar el 2 -> comparaciones: lineal 1, binaria 6Buscar el 120 -> comparaciones: lineal 60, binaria 6Buscar el 200 -> comparaciones: lineal 100, binaria 7Buscar el 111 -> comparaciones: lineal 100, binaria 7Peor caso con 100 elementos: lineal 100, binaria 7.
Complejidad
Cuánto trabajo y memoria necesita según la cantidad de datos (n).
| Caso | Costo |
|---|---|
| Mejor | O(1) |
| Promedio | O(n) |
| Peor | O(n) |
| Memoria | O(1) |
Desafío
Calcula el promedio de comparaciones de cada búsqueda buscando todos los valores de la lista.
Ver pista
Recorre i de 1 a n, busca datos[i] con las dos funciones y acumula los resultados; al final divide por n.
Ejemplos relacionados
Ordenamiento burbuja
Ordena números al azar intercambiando vecinos, y se detiene apenas quedan ordenados.
IntermedioOrdenamiento por inserción
Inserta cada número entre los ya ordenados, como al acomodar cartas en la mano.
IntermedioOrdenamiento Shell
Una inserción entre elementos lejanos, con un salto que se achica en cada pasada.
Avanzado