Loop Invariant (Invariante de Ciclo)
Demostración de correctitud mediante invariantes de ciclo, aplicada a algoritmos de ordenamiento.
2. Loop Invariant (Invariante de Ciclo)
El loop invariant (invariante de ciclo) es el mecanismo que usamos para demostrar que un algoritmo es correcto, es decir, que hace lo que dice que hace. Reemplaza la costumbre de probar con casos, ya que los casos nunca demuestran correctitud general.
El invariante es una propiedad lógica que:
- Captura la razon de ser del algoritmo (su semantica).
- Esta asociada al ciclo principal del algoritmo.
- Debe demostrarse en exactamente 3 momentos.
Los 3 momentos del Loop Invariant
- inicialización: La propiedad es cierta antes de la primera iteración del ciclo.
- mantenimiento: Si la propiedad es cierta antes de una iteración, sigue siendo cierta antes de la siguiente iteración.
- finalización: Cuando el ciclo termina, la propiedad combinada con la condición de parada demuestra que el algoritmo funciona correctamente.
2.1 Nociones de Secuencia y Conjunto
Para formular invariantes correctamente, es crucial distinguir:
El orden importa.es diferente deaunque tengan los mismos elementos.
El orden no importa.es igual que.
En los invariantes siempre se trabaja con secuencias cuando el orden de los elementos importa (como en ordenamiento).
2.2 Ejemplo: Algoritmo de Inserción
El algoritmo de ordenamiento por inserción funciona bajo el paradigma incremental: mantiene un subarreglo ordenado que crece en cada iteración.
InsertionSort (E/S int A[n]) {
for i <- 2 to n do
x <- A[i]
j <- i - 1
while (j >= 1) and (x < A[j]) do
A[j+1] <- A[j]
j <- j - 1
endwhile
A[j+1] <- x
endfor
}¿Cómo funciona? Empieza en la posición 2 (). Para cada posición, extrae el elementoy lo inserta en la posición correcta dentro del subarreglo ya ordenado.
Los elementos en las posicionesson los mismos elementos que estaban enal inicio, pero organizados en orden no decreciente.
Demostración de los 3 momentos
Demostración del invariante de Insertion Sort
| Momento | i | Estado del arreglo | ¿Se cumple? |
|---|---|---|---|
| Inicialización | tiene un solo elemento. Por definición, un arreglo de un elemento está ordenado. | Si | |
| Mantenimiento | Antes de la iteración,está ordenado. El while insertaen su lugar correcto, dejandoordenado. | Si | |
| Finalización | Cuando el for termina (), la propiedad dice queestá ordenado. El arreglo completo está ordenado. | Correctitud demostrada |
En la formulacion del invariante nunca se habla de(variable del ciclo interno). El invariante del for solo habla de. Cada ciclo tiene su propio invariante.
2.3 Análisis de Eficiencia — Insertion Sort
Mejor Caso (arreglo ya ordenado)
El while nunca se ejecuta porque la condiciónes siempre falsa (el elemento a insertar ya está en su lugar).
Mejor caso de Insertion Sort
| Linea | Costo |
|---|---|
| for i <- 2 to n | |
| x <- A[i] | |
| j <- i-1 | |
| while (condición) | |
| A[j+1] <- x |
-> lineal.
Peor Caso (arreglo en orden inverso)
El while se ejecuta el máximo numero de veces. Para la iteración, el while se ejecutaveces (hay que mover el elemento hasta la posición 1).
Peor caso de Insertion Sort
| Linea | Costo |
|---|---|
| for i <- 2 to n | |
| x <- A[i] | |
| j <- i-1 | |
| while (condición) | |
| A[j+1] <- x |
-> cuadrática.
2.4 Ejemplo: Algoritmo Burbuja (Bubble Sort)
BubbleSort (E/S int A[n]) {
for i <- 1 to (n-1) do
for j <- 1 to (n-i) do
if A[j] > A[j+1] then
swap(A[j], A[j+1])
endif
endfor
endfor
}Después de completar la iteracióndel ciclo externo, loselementos más grandes están en sus posiciones definitivas al final del arreglo, en orden no decreciente.
Demostración de los 3 momentos
- Inicialización (i=1):Antes de empezar, no hay elementos asegurados al final del arreglo. La propiedad es trivialmente cierta (0 elementos ordenados al final).
- Mantenimiento:Durante la iteración, el ciclo interno empuja el máximo elemento del subarreglo no ordenadohacia la posición. Al terminar, ese elemento queda en su posición definitiva.
- Finalización (i=n):Se han colocado loselementos más grandes. El único restante es el más pequeño y ya está en su lugar. El arreglo está completamente ordenado.
Eficiencia de Bubble Sort
El for interno se ejecutaveces para cada valor de:
Función de eficiencia de Bubble Sort
->en ambos casos.
Ojo: Bubble Sort estanto en el mejor como en el peor caso, porque aunque no haga intercambios (mejor caso), sigue haciendo todas las comparaciones.