AprenderC
← Todas las lecciones

Cuánto cuesta de verdad

Dos programas que funcionan pueden tardar horas de diferencia.

1Por qué

«Funciona» no es suficiente. Dos programas que dan la misma respuesta pueden tardar un segundo y una tarde, y con los datos de prueba —cinco números— los dos parecen instantáneos. El problema aparece cuando llegan cincuenta mil.

Para saberlo no hace falta un cronómetro: se cuenta. Cada vez que el algoritmo mira un par de datos, se suma uno. Ese número no depende de tu máquina ni de si tienes el navegador abierto, y por eso es lo que se compara.

El ordenamiento de la lección anterior tiene un ciclo dentro de otro. El de fuera da unas n vueltas, y el de dentro otras tantas por cada una: el trabajo no crece con n, crece con n por n.

Eso se ve solo al medirlo. Con 4 datos son 6 comparaciones; con 8, veintiocho; con 16, ciento veinte. Cada vez que el tamaño se dobla, el trabajo se cuadruplica. Un algoritmo así se llama cuadrático, y por eso ordenar un millón de datos con este método no es lento: es imposible.

Compáralo con recorrer la lista una vez, que es n a secas: doblar el tamaño solo dobla el trabajo. La diferencia entre esas dos formas de crecer es la mitad de lo que un ramo de algoritmos viene a enseñar.

2Míralo andar

Este programa funciona. Léelo, y después ejecútalo sin cambiar nada.

#include <stdio.h>
int lineal(int n)
{
int cuenta = 0;
for (int i = 0; i < n; i++)
cuenta = cuenta + 1;
return cuenta;
}
int cuadratico(int n)
{
int cuenta = 0;
for (int i = 0; i < n - 1; i++)
for (int j = 0; j < n - 1 - i; j++)
cuenta = cuenta + 1;
return cuenta;
}
int main(void)
{
printf("%d %d\n", lineal(4), cuadratico(4));
printf("%d %d\n", lineal(8), cuadratico(8));
printf("%d %d\n", lineal(16), cuadratico(16));
return 0;
}

3Ahora tú

A cuadratico le falta contar. Escribe la línea, para que salga 4 6, después 8 28 y después 16 120

#include <stdio.h>
int lineal(int n)
{
int cuenta = 0;
for (int i = 0; i < n; i++)
cuenta = cuenta + 1;
return cuenta;
}
int cuadratico(int n)
{
int cuenta = 0;
for (int i = 0; i < n - 1; i++)
for (int j = 0; j < n - 1 - i; j++)
return cuenta;
}
int main(void)
{
printf("%d %d\n", lineal(4), cuadratico(4));
printf("%d %d\n", lineal(8), cuadratico(8));
printf("%d %d\n", lineal(16), cuadratico(16));
return 0;
}

↖︎ Tu línea va aquí: lo que se hace una vez por cada par mirado.

Ejecutar

Lo que dice tu programa

↖︎ Escribe tu parte y dale a Ejecutar

Qué pasó

Aquí te aviso si tu programa hace algo raro.

    Más adelante vas a ver dónde guarda el computador cada cosa. Todavía no hace falta.