Análisis Amortizado? (Garantías de rendimiento en el peor de los casos)

13

¿Qué es el análisis amortizado? ¿Y cómo puede ayudarme a lograr garantías de rendimiento en el peor de los casos en mis programas?

Estaba leyendo que las siguientes técnicas pueden ayudar al programador a lograr las garantías de rendimiento en el peor de los casos (es decir, en mis propias palabras: garantizar que el tiempo de ejecución de un programa no exceda el tiempo de ejecución en el peor reparto):

  • Algoritmos aleatorizados (por ejemplo, el algoritmo de clasificación rápida es cuadrático en el peor de los casos, pero ordenar aleatoriamente la entrada da una garantía probabilística de que su tiempo de ejecución es linealitmico)
  • Secuencias de operaciones (nuestro análisis debe tener en cuenta tanto los datos como la secuencia de operaciones realizadas por el cliente)
  • Análisis Amortizado (otra forma de proporcionar una garantía de desempeño es amortizar el costo, haciendo un seguimiento del costo total de todas las operaciones, dividido por el número de operaciones. En esta configuración, podemos permitir algunas operaciones costosas, manteniendo el costo promedio de operaciones bajas. En otras palabras, distribuimos el costo de las pocas operaciones costosas, asignando una parte de ellas a cada una de una gran cantidad de operaciones económicas)

El autor mencionó el uso del cambio de tamaño de la estructura de datos de la matriz para Stack como un ejemplo de cómo lograr un análisis amortizado, pero todavía no entiendo qué es el análisis amortizado y cómo se puede implementar realmente (¿estructura de datos? ¿Algoritmo?) Para lograr lo peor -cast garantías de rendimiento

Antonio
fuente

Respuestas:

14

No implementa el análisis amortizado. Es una técnica para obtener Olímites más precisos .

La observación esencial que debe hacer es que las operaciones costosas no pueden ocurrir en ningún momento.

En el caso de una estructura de datos respaldada por una matriz, la matriz necesita cambiar su tamaño de vez en cuando, cuando está llena. Esta es la operación más costosa y lleva O(n)tiempo. Todos los demás insertos en la matriz son O(1).

Para determinar el tiempo de ejecución para insertar nelementos, puede multiplicar ncon la operación más costosa O(n), lo que resulta en un comportamiento general de tiempo de ejecución de O(n^2).

Sin embargo, esto es inexacto porque el cambio de tamaño no puede ocurrir muy a menudo.

Cuando hablamos de dinero, amortizas el costo, cuando pagas tu deuda con múltiples pagos pequeños a lo largo del tiempo.

Podemos usar este modelo para pensar también en algoritmos. Simplemente sustituimos "tiempo" con "dinero" para evitar el mapeo mental.

Una vez que la matriz se completa a su longitud n, podemos duplicar su tamaño. Necesitamos realizar las siguientes operaciones:

  • Asignar 2ntrozos de memoria
  • copiar nelementos

Si asumimos que tanto la asignación de memoria como la copia ocurren en tiempo lineal, esta será una operación muy costosa. Sin embargo, ahora podemos usar la idea de deuda y amortizarla para nuestro análisis. Solo que vamos a amortizar nuestra deuda antes de que la hagamos.
Supongamos que nuestro saldo (de dinero / tiempo) vuelve a 0 (es decir, no tenemos deuda ni sobras) una vez que hemos cambiado el tamaño de la matriz.

Esto tiene la siguiente implicación:

  • Insertar los siguientes nelementos cubrirá el costo de cambiar el tamaño y copiar (hemos nusado espacios y nespacios no utilizados ')

Ahora podemos pensar en cuánto debe pagar cada operación de inserción:

  • El inserto
  • El costo de asignar un trozo de memoria
  • el costo de moverlo a la memoria recién asignada

Ahora hemos cubierto los costos para asignar memoria, copiar e insertar los siguientes nelementos. Sin embargo, todavía hemos descuidado la asignación de espacio para los nelementos antiguos y la copia.

Simplemente distribuimos los costos de nuestros nelementos antiguos a nuestros elementos nuevos (aún por insertar) n:

  • El costo de asignar un trozo de memoria
  • el costo de moverlo a la memoria recién asignada

En total, cada operación de inserción costará 5 unidades. Esto paga por su propia inserción, y el movimiento y la asignación de espacio para sí mismo y uno de los elementos antiguos.

Cada operación de inserción todavía requiere una cantidad constante de tiempo, pero el cambio de tamaño se realiza de forma gratuita: lo amortizamos al pasar "más" tiempo en cada inserción.

Como resultado, insertar nelementos lleva O(n)tiempo.

Aquí se explican otras técnicas para el análisis amortizado .

phant0m
fuente
1

En primer lugar: es una técnica para analizar los tiempos de ejecución del programa, no una técnica de implementación para algoritmos.

El ejemplo mencionado en su lista es bueno: agregar un solo elemento a la estructura de datos respaldada por una matriz. Para cada operación de adición, el peor de los casos es tener que copiar todos los elementos existentes. Ese tipo de análisis es demasiado pesimista, ya que no tiene que hacerlo si está utilizando una estrategia de cambio de tamaño sensata (multiplicando el tamaño por algo x> 1.0). El análisis luego dice que tiene un límite O (n ^ 2) - O (n) por elemento multiplicado por n elementos - mientras que el tiempo de ejecución real es solo O (n).

Si promedia el costo de cambio de tamaño sobre todos los artículos insertados (la mayoría de los cuales no necesita cambio de tamaño), está haciendo un análisis amortizado. El análisis amortizado da como resultado un límite O (n) que coincide con el comportamiento real del algoritmo.

Patricio
fuente