Contratos Formales

La Tripleta de Hoare {P} C {Q}: El Contrato Matemático

Si la precondición P es verdadera antes de ejecutar el bloque C, entonces la postcondición Q será indefectiblemente verdadera al terminar. Es el contrato formal entre una especificación y su implementación.

P Precondición valores != null && length > 0 Esperando prueba…
C Bloque de código maximoActual = maximo(valores) Inactivo
Q Postcondición ∀x ∈ valores: x ≤ maximoActual Esperando prueba…
Simulador: probá el contrato con distintos valores maximo(valores) — busca el máximo de un array
Elegí un caso para ejecutar el contrato.
Verificación de Bucles

Invariantes de Bucle: El Estado que Nunca se Rompe

Un invariante es una afirmación lógica verdadera antes de iniciar el bucle, al final de cada iteración y al terminar, garantizando la postcondición. En maximo(), dice: valores[0..i-1] ya fue recorrido y maximoActual es su máximo.

Invariante: valores[0..i-1] ya recorrido, maximoActual = máximo parcial
04
19
22
37
45
51
68
73
Procesado (invariante satisfecho) Elemento activo Pendiente
i = 0 · maximoActual = —

Antes de empezar: el segmento [0..-1] está vacío, el invariante se cumple trivialmente.

Terminación Garantizada

Corrección Total y Función Cota: V = n − i

La corrección parcial garantiza que, si el bucle termina, la respuesta es correcta. La corrección total exige además que termine: una función cota entera y positiva que decrece estrictamente en cada iteración lo demuestra.

n 8
i 0
V = n − i 8

V comienza en n = 8. Cada iteración lo reduce en 1. Mientras V sea positivo, el bucle puede seguir; nunca puede volverse negativo.

Análisis Asintótico

El Gráfico Interactivo de la Notación Big-O

Big-O describe cómo escala el tiempo de ejecución cuando el tamaño de entrada N crece hacia el infinito, ignorando constantes y términos menores para enfocarse en el factor dominante.

10 100 1K 10K 100K 1M N (tamaño de entrada) →
O(1) · O(log N) O(N) · O(N log N) O(N²) O(2^N)
N = 10
O(1) 1
O(log N) 4
O(N) 10
O(N log N) 40
O(N²) 100
O(2^N) 1.024
Casos de Análisis

Mejor, Peor y Caso Promedio en una Búsqueda Lineal

Un algoritmo no tiene una única velocidad: la búsqueda lineal es O(1) en el mejor caso si el valor está al principio, y O(N) en el peor caso si no existe. Sin aclaración, suele informarse el peor caso.

Buscando el valor 12 en el arreglo:

12
45
7
89
34
2
67
90
15