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

  1. inicialización: La propiedad es cierta antes de la primera iteración del ciclo.
  2. mantenimiento: Si la propiedad es cierta antes de una iteración, sigue siendo cierta antes de la siguiente iteración.
  3. 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:

Secuencia

El orden importa.es diferente deaunque tengan los mismos elementos.

Conjunto

El orden no importa.es igual que.

Regla para invariantes

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

Invariante del ciclo for

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

MomentoiEstado del arreglo¿Se cumple?
Inicializacióntiene un solo elemento. Por definición, un arreglo de un elemento está ordenado.Si
MantenimientoAntes de la iteración,está ordenado. El while insertaen su lugar correcto, dejandoordenado.Si
FinalizaciónCuando el for termina (), la propiedad dice queestá ordenado. El arreglo completo está ordenado.Correctitud demostrada
Nota

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

LineaCosto
for i <- 2 to n
x <- A[i]
j <- i-1
while (condición)
A[j+1] <- x
Resultado del mejor caso

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

LineaCosto
for i <- 2 to n
x <- A[i]
j <- i-1
while (condición)
A[j+1] <- x
Resultado del peor caso

-> cuadrática.

2.4 Ejemplo: Algoritmo Burbuja (Bubble Sort)

BubbleSort
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
}
Invariante del ciclo for externo (variable i)

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

Función de eficiencia
Forma cuadrática
Resultado

->en ambos casos.

Nota

Ojo: Bubble Sort estanto en el mejor como en el peor caso, porque aunque no haga intercambios (mejor caso), sigue haciendo todas las comparaciones.