Técnicas
Comencemos con un problema de juguete para ejemplificar las técnicas a medida que las describimos. Supongamos que tenemos una pila donde permitimos las operaciones (que apila ) y (que desapila elementos con algún propósito, por ejemplo entregar su suma). La operación cuesta y la operación cuesta (supondremos que cuando se ejecuta es porque hay al menos elementos en la pila). La pregunta es ¿cuánto puede costar una secuencia de operaciones en una pila vacía?
--> imagen del funcionamiento de la estructura
Un análisis de peor caso nos muestra que, luego de haber realizado 's, un nos puede costar . Por lo tanto, una secuencia de operaciones partiendo de una pila vacía puede costar . Si bien esto es formalmente cierto, la cota está lejos de ser ajustada. Usaremos tres tipos de argumentos para mostrar que en realidad operaciones sólo pueden costar , es decir, el costo amortizado por operación es (si bien es verdad que algún puede costar ).
Análisis global
La primera forma de verificar esto es notar que, en operaciones, sólo se pueden haber apilado elementos mediante 's. Por ello, si bien algún puede costar casi , la suma de todos los 's sólo puede costar , pues todo elemento desapilado se debe haber apilado alguna vez. Es decir, con operaciones a lo sumo podemos haber apilado elementos y luego haberlos desapilado. Si tomamos el costo de como y de como , el costo total de las operaciones es a lo más .
Esta técnica se llama análisis global: observamos los costos de toda la secuencia no paso a paso sino globalmente, para deducir alguna propiedad que permita acotar el costo total. Ésta es la más sencilla de las técnicas, aunque no siempre es fácil encontrar una visión global que haga obvio el costo total.
Contabilidad de costos
La segunda forma es notar que cada elemento que se saca con debe haber entrado en la pila con un alguna vez. Podemos entonces cobrarle 2 operaciones al , y cobrarle cero al . Visto de otro modo, le estamos cobrando por adelantado al elemento de el costo que producirá cuando más adelante participe de un . Queda entonces claro que una secuencia de operaciones no puede costar más que , pues no puede haber más de operaciones de .
Esta técnica se llama contabilidad de costos: repartimos el costo real de alguna forma, entre operaciones, objetos, etc. para que resulte más fácil de sumar. Podemos, en particular, cobrar costos futuros por adelantado. La dificultad está en encontrar, precisamente, una forma de distribuir los costos que haga evidente el costo total.
Función potencial
Esta técnica consiste en definir una función que depende del objeto que vamos modificando a lo largo de las operaciones. Esta función representa un "ahorro" que vamos haciendo en las operaciones más baratas para poder usarlo en pagar las operaciones más caras a futuro.
Pensemos en un contratista de una obra. Algunos meses tiene más gastos y otros menos. Para tener una interfaz sencilla con su cliente, todos los meses le cobra lo mismo, . Sin embargo, su costo real, , es variable. En los meses en que , ahorrará el sobrante en una bolsa llamada . En los meses en que , pagará la diferencia con el ahorro que tiene en la bolsa . Llamamos al ahorro inicial con que se comienza la obra y a lo que tiene ahorrado después del mes . Entonces, se cumple la recurrencia . Como la obra se puede detener en cualquier momento, para asegurarse de no perder dinero el contratista necesita que en todo mes valga . Desde el punto de vista del cliente, el costo de la obra es constante por mes, . Esto corresponde al costo amortizado de la operación del contratista, que usa el ahorro para esconder una estructura de costos más complicada.
Formalmente, tenemos entonces una secuencia de costos reales y una función potencial con valor luego de la operación . Si llamamos , definimos la secuencia de costos amortizados como
Con esta definición tenemos
donde lo último se cumple si nos aseguramos de que para toda secuencia de operaciones. Entonces nuestra secuencia de costos amortizados es una cota superior a la secuencia de costos reales.
La dificultad está siempre en definir adecuadamente para que se mantenga y sobre todo que los resultantes sean fáciles de sumar (constantes, idealmente). Para ello, las operaciones que cuestan mucho deben disminuir el potencial en la misma medida.
En nuestro ejemplo, el potencial podría ser el alto de la pila. Tenemos entonces y . Consideremos lo que ocurre al ejecutar . El costo real es . Por otro lado, la pila se hace una unidad más alta, por lo que . Esto nos da . Por otro lado, al realizar un tenemos un costo real de , pero como el alto de la pila decrece en , tenemos , con lo cual el costo amortizado es . Nuevamente, hemos obtenido nuestro costo amortizado de a lo más 2 unidades por operación.
Note que los análisis son válidos si partimos de la pila vacía, pero no si partimos operando con una pila que ya tiene elementos. En ese caso, una sola operación cuesta y no . Note que aquí hemos violado algún supuesto hecho en cada una de las tres formas de analizar este problema.