Saltar al contenido

Recorrido narrado

Leer una operación con su invariante

Una forma útil de leer cualquier operación: preguntar, línea a línea, si el invariante se cumple al final.

Texto
función agregar(chat, m):    si cantidad = capacidad:        error "lleno"          # el invariante cantidad ≤ capacidad sigue en pie    casilleros[cantidad] ← m   # m queda justo después del último: sin hueco    cantidad ← cantidad + 1    # ahora los mensajes ocupan 0 a cantidad − 1

En la figura, el chat tiene capacidad 5 y agregas «Nos vemos». Debajo, el mismo caso con las dos últimas líneas al revés.

agregar paso a paso, y con el orden cambiadoCapacidad 5. Estado inicial: Hola, ¿Qué tal? y Bien en los casilleros 0 a 2, cantidad = 3. Paso 1: la comprobación cantidad igual a capacidad no se cumple y sigue. Paso 2: Nos vemos se escribe en el casillero 3, justo después del último; cantidad aún vale 3. Paso 3: cantidad pasa a 4 y los mensajes ocupan de nuevo 0 a cantidad − 1. Si las dos últimas líneas se intercambian, cantidad vale 4 y Nos vemos se escribe en el casillero 4, y el casillero 3 queda vacío, con borde grueso: un hueco.Paso 1 de 3: si cantidad = capacidad. 3 no es 5, sigueHola¿Qué tal?Bien01234cantidad = 3Paso 2 de 3: casilleros[cantidad] ← mHola¿Qué tal?BienNos vemos*01234cantidad = 3Paso 3 de 3: cantidad ← cantidad + 1Hola¿Qué tal?BienNos vemos01234cantidad = 4Con las dos últimas líneas al revés, queda un huecoHola¿Qué tal?BienNos vemos*01234cantidad = 4
Cada línea protege el invariante. Con * se marca lo recién escrito; el borde grueso marca el hueco.

Si cambias el orden de las dos últimas líneas, m se escribe un casillero más allá y deja un hueco. Cada línea está ahí para proteger el invariante.

En esta ruta, cada estructura tendrá sus invariantes nombrados: el orden de un árbol de búsqueda, la cola de una lista, el orden de un heap. La mayoría de los errores de implementación son invariantes que una operación olvidó mantener.

Lee el recorrido de esta página. Al pasar al siguiente momento, este cuenta como leído.