Saltar al contenido
EjemplosEnglishEspacio →

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
Abrir en Codoritmo

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

search-comparison.psc · 79 líneas
// 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, "."FinAlgoritmo

Diagrama de flujo

Cada bloque del diagrama corresponde a una instrucción del código.

Algoritmo CompararBusquedas
Algoritmo CompararBusquedasSíNoAlgoritmo CompararBusquedasAlgoritmo CompararBusquedasDefinir datos, objetivos, n, i, mitades, resto Como EnteroDefinir datos, objetivos, n,i, mitades, resto Como EnteroEscribir "¿Cuántos números tiene la lista? (1 a 512)"Escribir "¿Cuántos númerostiene la lista? (1 a 512)"Leer nLeer nDimension datos[n], objetivos[4]Dimension datos[n],objetivos[4]Para i <- 1 Hasta n HacerPara i <- 1 Hasta ndatos[i] <- 2 * idatos[i] <- 2 * iMostrarDatos("Lista: ", datos, n)MostrarDatos("Lista: ",datos, n)objetivos[1] <- datos[1]objetivos[1] <- datos[1]objetivos[2] <- datos[Aleatorio(1, n)]objetivos[2] <-datos[Aleatorio(1, n)]objetivos[3] <- datos[n]objetivos[3] <- datos[n]objetivos[4] <- 2 * Aleatorio(1, n) - 1objetivos[4] <- 2 *Aleatorio(1, n) - 1Para i <- 1 Hasta 4 HacerPara i <- 1 Hasta 4Escribir "Buscar el ", objetivos[i], " -> comparaciones: lineal ", BuscarLineal(datos, n, objetivos[i]), ", binaria ", BuscarBinaria(datos, n, objetivos[i])Escribir "Buscar el ",objetivos[i], " ->comparaciones: lineal ",…mitades <- 0mitades <- 0resto <- nresto <- nMientras resto > 0 Hacerresto > 0mitades <- mitades + 1mitades <- mitades + 1resto <- Trunc(resto / 2)resto <- Trunc(resto / 2)Escribir "Peor caso con ", n, " elementos: lineal ", n, ", binaria ", mitades, "."Escribir "Peor caso con ", n," elementos: lineal ", n, ",binaria ", mitades, "."FinAlgoritmoFinAlgoritmo
SubProceso MostrarDatos
SubProceso MostrarDatosSíNoSubProceso MostrarDatos(titulo, datos, n)SubProceso MostrarDatos(titulo,datos, n)Definir i Como EnteroDefinir i Como EnteroSi n <= 30 Entoncesn <= 30Escribir Sin Saltar tituloEscribir Sin Saltar tituloPara i <- 1 Hasta n HacerPara i <- 1 Hasta nEscribir Sin Saltar datos[i], " "Escribir Sin Saltar datos[i]," "Escribir ""Escribir ""Escribir titulo, n, " números (el primero es ", datos[1], " y el último ", datos[n], ")"Escribir titulo, n, " números(el primero es ", datos[1], "y el último ", datos[n], ")"FinSubProcesoFinSubProceso
Funcion BuscarLineal
Funcion BuscarLinealSíNoSíNoFuncion comparaciones <- BuscarLineal(datos, n, buscado)Funcion comparaciones <-BuscarLineal(datos, n, buscado)Definir comparaciones, i Como EnteroDefinir comparaciones, i ComoEnteroDefinir encontrado Como LogicoDefinir encontrado Como Logicocomparaciones <- 0comparaciones <- 0encontrado <- Falsoencontrado <- Falsoi <- 1i <- 1Mientras i <= n Y (NO encontrado) Haceri <= n Y (NOencontrado)comparaciones <- comparaciones + 1comparaciones <- comparaciones+ 1Si datos[i] = buscado Entoncesdatos[i] = buscadoencontrado <- Verdaderoencontrado <- Verdaderoi <- i + 1i <- i + 1FinFuncion (devuelve comparaciones)FinFuncion (devuelvecomparaciones)
Funcion BuscarBinaria
Funcion BuscarBinariaSíNoSíNoSíNoFuncion comparaciones <- BuscarBinaria(datos, n, buscado)Funcion comparaciones <-BuscarBinaria(datos, n, buscado)Definir comparaciones, izquierda, derecha, medio Como EnteroDefinir comparaciones,izquierda, derecha, medio ComoEnteroDefinir encontrado Como LogicoDefinir encontrado Como Logicocomparaciones <- 0comparaciones <- 0encontrado <- Falsoencontrado <- Falsoizquierda <- 1izquierda <- 1derecha <- nderecha <- nMientras izquierda <= derecha Y (NO encontrado) Hacerizquierda <= derechaY (NO encontrado)medio <- Trunc((izquierda + derecha) / 2)medio <- Trunc((izquierda +derecha) / 2)comparaciones <- comparaciones + 1comparaciones <- comparaciones+ 1Si datos[medio] = buscado Entoncesdatos[medio] =buscadoencontrado <- Verdaderoencontrado <- VerdaderoSi datos[medio] < buscado Entoncesdatos[medio] <buscadoizquierda <- medio + 1izquierda <- medio + 1derecha <- medio - 1derecha <- medio - 1FinFuncion (devuelve comparaciones)FinFuncion (devuelvecomparaciones)

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).

Complejidad
CasoCosto
MejorO(1)
PromedioO(n)
PeorO(n)
MemoriaO(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.

Abrir en Codoritmo
  • Ordenamiento burbuja

    Ordena números al azar intercambiando vecinos, y se detiene apenas quedan ordenados.

    Intermedio
  • Ordenamiento por inserción

    Inserta cada número entre los ya ordenados, como al acomodar cartas en la mano.

    Intermedio
  • Ordenamiento Shell

    Una inserción entre elementos lejanos, con un salto que se achica en cada pasada.

    Avanzado