¿Qué es el análisis amortizado de algoritmos? [cerrado]

85

¿En qué se diferencia del análisis asintótico? ¿Cuándo lo usa y por qué?

He leído algunos artículos que parecen estar bien escritos, como estos:

pero todavía no he entendido completamente estos conceptos.

Entonces, ¿alguien puede simplificarme por favor?

GrowinMan
fuente
5
Probablemente pertenece a programmers.stackexchange.com
lanzz
2
@lanzz Quizás ahora pertenezca a cs.stackexchange.com
nbro
Un gran hilo sobre el significado del Tiempo Amortizado Constante .
RBT

Respuestas:

87

El análisis amortizado no multiplica ingenuamente el número de invocaciones con el peor de los casos para una invocación.

Por ejemplo, para una matriz dinámica que duplica su tamaño cuando es necesario, el análisis asintótico normal solo concluiría que agregarle un elemento cuesta O (n), porque podría necesitar crecer y copiar todos los elementos a la nueva matriz. El análisis amortizado toma en cuenta que para tener que crecer, se deben haber agregado n / 2 artículos sin causar un crecimiento desde el crecimiento anterior, por lo que agregar un artículo realmente solo toma O (1) (el costo de O (n) es amortizado en n / 2 acciones).

El análisis amortizado no es lo mismo que un "rendimiento promedio": el análisis amortizado ofrece una garantía sólida de lo que hará el rendimiento si realiza tantas acciones.

harold
fuente
1
"El análisis amortizado toma en cuenta que para tener que crecer, se deben haber agregado n / 2 artículos sin causar un crecimiento desde el crecimiento anterior, por lo que agregar un artículo realmente solo toma O (1) (el costo de O (n) se amortiza en n / 2 acciones) ". Esto fue bastante confuso y poco claro.
AleksandrH
@AleksandrH ¿alguna parte en particular?
harold
Sí, es difícil seguir las matemáticas sin una explicación de dónde vienen los números
AleksandrH
44

Hay muchas respuestas al "qué", pero ninguna al "por qué".

Como todos los demás han dicho, el análisis asintótico trata sobre cómo el rendimiento de una operación determinada se escala a un gran conjunto de datos. El análisis amortizado se trata de cómo se escala el promedio del rendimiento de todas las operaciones en un gran conjunto de datos. El análisis amortizado nunca da peores límites que los asintóticos y, a veces, ofrece límites mucho mejores.

Si le preocupa el tiempo total de ejecución de un trabajo más largo, probablemente lo que le interese sean los mejores límites del análisis amortizado. Es por eso que los lenguajes de scripting (por ejemplo) a menudo están felices de aumentar las matrices y las tablas hash en algún factor, aunque esa es una operación costosa. (El cultivo puede ser una O(n)operación, pero se amortiza O(1)porque rara vez lo haces).

Si está haciendo programación en tiempo real (las operaciones individuales deben completarse en un tiempo predecible), entonces los mejores límites del análisis amortizado no importan. No importa si la operación en promedio fue rápida, si no pudo terminarla a tiempo para regresar y ajustar la sierra de cinta antes de que cortara demasiado ...

Cuál importa en su caso depende exactamente de cuál sea su problema de programación.

tímidamente
fuente
1
"El cultivo puede ser una operación O (n), pero amortizado es O (1) porque rara vez lo haces" Creo que esta afirmación realmente necesita una prueba matemática rigurosa.
nbro
"Si está haciendo programación en tiempo real ..." debe ser más preciso y explicar exactamente por qué ese párrafo debe tomarse como "verdadero".
nbro
1
@nbro ¿Por qué crees que "debería"? La pregunta pregunta en qué se diferencia el análisis amortizado del asintótico y cuándo desea utilizar cada uno. Contiene enlaces a artículos que explican cómo realizarlos. Por tanto, el análisis matemático parece redundante. En cuanto a la programación en tiempo real, lo expliqué. La programación en tiempo real es una programación en la que las operaciones individuales deben completarse en un tiempo predecible. Un ejemplo típico es la programación integrada, donde necesita monitorear algo a intervalos regulares. Como controlar maquinaria. En este caso, no se aceptan operaciones lentas ocasionales.
hasta el
26

Análisis asintótico

Este término se refiere al análisis del rendimiento del algoritmo bajo el supuesto de que los datos sobre los que opera el algoritmo (la entrada ) son, en términos sencillos, "lo suficientemente grandes como para que hacerlo más grande no cambie la conclusión". Aunque no es necesario especificar el tamaño exacto de la entrada (solo necesitamos un límite superior), el conjunto de datos en sí tiene debe especificar .

Tenga en cuenta que hasta ahora solo hemos hablado del método de análisis; no hemos especificado exactamente qué cantidad estamos analizando (¿complejidad del tiempo? ¿complejidad del espacio?), y tampoco hemos especificado qué métrica nos interesa (¿en el peor de los casos, en el mejor de los casos, en el promedio?).

En la práctica, el término análisis asintótico se refiere comúnmente a la complejidad de tiempo límite superior de un algoritmo, es decir, el peor desempeño del caso medido por el tiempo de ejecución total, que está representado por la notación de gran Oh (por ejemplo, un algoritmo de clasificación podría serlo O(nlogn)).

Análisis amortizado

Este término se refiere al análisis del rendimiento del algoritmo basado en una secuencia específica de operaciones que tiene como objetivo el peor de los casos , es decir, el análisis amortizado implica que la métrica es el peor rendimiento del caso (aunque todavía no dice qué cantidad se está midiendo ). Para realizar este análisis, necesitamos especificar el tamaño de la entrada, pero no necesitamos hacer suposiciones sobre su forma.

En términos sencillos, el análisis amortizado es elegir un tamaño arbitrario para la entrada y luego "reproducir" el algoritmo. Siempre que se deba tomar una decisión que dependa de la entrada, se toma el peor camino¹. Una vez que el algoritmo se ha ejecutado hasta su finalización, dividimos la complejidad calculada por el tamaño de la entrada para producir el resultado final.

Nota: Para ser precisos, el peor camino teóricamente posible . Si tiene un vector que duplica dinámicamente su tamaño cada vez que se agota su capacidad, "el peor de los casos" no significa asumir que tendrá que duplicarse en cada inserción porque las inserciones se procesan como una secuencia. Se nos permite (y de hecho debemos) usar estado conocido para eliminar matemáticamente tantos casos "incluso peores" como podamos, incluso cuando la entrada permanece desconocida.

La diferencia mas importante

La diferencia crítica entre el análisis asintótico y amortizado es que el primero depende de la entrada en sí, mientras que el segundo depende de la secuencia de operaciones que ejecutará el algoritmo.

Por lo tanto:

  • El análisis asintótico nos permite afirmar que la complejidad del algoritmo cuando se le da una entrada de caso mejor / peor / promedio de tamaño cercano a N está limitada por alguna función F (N), donde N es una variable
  • El análisis amortizado nos permite afirmar que la complejidad del algoritmo cuando se le da una entrada de características desconocidas pero el tamaño conocido N no es peor que el valor de una función F (N) - donde N es un valor conocido
Jon
fuente
7
La respuesta anterior demuestra por qué las personas no deben votar ciegamente las respuestas largas de personas altamente calificadas.
aproximadamente
2
@btilly: Sus comentarios serían mucho más útiles si fueran procesables, es decir, ¿pueden darme una idea de qué es exactamente lo que está mal en esta respuesta y cómo mejorarla?
Jon
7
¿Dónde empezar? Definió ambos términos incorrectamente y proporcionó muchos detalles aclaratorios que también estaban equivocados. Para un ejemplo aleatorio, el análisis amortizado no siempre es el peor de los casos. De lo contrario, no podríamos decir que el rendimiento amortizado de insertar en un hash redimensionado dinámicamente es O(1).
aproximadamente
@btilly CLRS página 451 dice "... el análisis amortizado garantiza el rendimiento promedio de cada operación en el peor de los casos".
Glen Selle
1
@GlenSelle El análisis amortizado es una técnica matemática. Se puede utilizar para una variedad de propósitos, incluido el peor de los casos. Sin embargo, no TIENE que ser el peor de los casos. En su caso, aparentemente se utilizó para el peor de los casos. En el caso del hash, no lo fue.
aproximadamente
14

La respuesta a esto se define sucintamente en la primera oración del capítulo de Análisis amortizado del libro: Introducción a los algoritmos:

En un análisis amortizado , el tiempo requerido para realizar una secuencia de operaciones de estructura de datos se promedia sobre todas las operaciones realizadas.

Representamos la complejidad del crecimiento de un programa mediante el análisis asintótico, que limita el crecimiento del programa mediante una función y define el peor, el mejor o el caso promedio de ese.

Pero esto puede ser engañoso en los casos en que solo hay un caso en el que la complejidad del programa alcanza un punto máximo, pero en general, el programa no requiere mucho cálculo.

Por lo tanto, tiene más sentido promediar el costo de una secuencia de operaciones, aunque una sola operación pueda resultar costosa. ¡Esto es Análisis Amortizado!

El análisis amortizado es una alternativa a la técnica asintótica utilizada para calcular la complejidad. Nos ayuda a calcular una complejidad más real en términos de practicidad, para poder comparar y decidir entre dos o más algoritmos.

Kunal Vyas
fuente
5

La mejor referencia que he encontrado hasta ahora para comprender el análisis amortizado de algoritmos se encuentra en el libro Introducción a los algoritmos , tercera edición, capítulo 17: "Análisis amortizado". Está todo ahí, explicado mucho mejor que lo que se puede encontrar en una publicación de Stack Overflow. Encontrarás el libro en la biblioteca de cualquier Universidad decente.

Óscar López
fuente
Si. Leer sobre el algoritmo Amortizado del libro mencionado fue mejor y finalmente dio claridad.
Rajesh Mappu
2

El análisis asintótico regular analiza el desempeño de una operación individual de forma asintótica, en función del tamaño del problema. La notación O () es lo que indica un análisis asintótico.

El análisis amortizado (que también es un análisis asintótico) analiza el rendimiento total de múltiples operaciones en una estructura de datos compartida .

La diferencia es que el análisis amortizado típicamente demuestra que el cálculo total requerido para M operaciones tiene una mejor garantía de desempeño que M veces el peor de los casos para la operación individual.

Por ejemplo, una operación individual en un árbol de distribución de tamaño N puede llevar hasta O (N) tiempo. Sin embargo, una secuencia de M operaciones en un árbol de tamaño N está limitada por O (M (1 + log N) + N log N) tiempo, que es aproximadamente O (log N) por operación. Sin embargo, tenga en cuenta que un análisis amortizado es mucho más estricto que un análisis de "caso promedio": demuestra que cualquier secuencia posible de operaciones satisfará su peor caso asintótico.

tormenta venidera
fuente
1

El análisis amortizado se ocupa del costo total de una serie de ejecuciones de la rutina y de los beneficios que se pueden obtener con ella. Por ejemplo, la búsqueda de una matriz sin clasificar de n elementos para una única coincidencia puede requerir hasta n comparaciones y, por lo tanto, es una (n) complejidad. Sin embargo, si sabemos que se buscarán m elementos en la misma matriz, repetir la tarea total tendría una complejidad O (m * n). Sin embargo, si ordenamos la matriz de antemano, el costo es O (n log (n)), y las búsquedas sucesivas solo toman O (log (n)) para una matriz ordenada. Por lo tanto, el costo total amortizado para m elementos que adoptan este enfoque es O (n * log (n) + m * log (n)). Si m> = n, esto equivale a O (n log (n)) por clasificación previa en comparación con O (n ^ 2) para no clasificar. Por tanto, el coste amortizado es más económico.

En pocas palabras, gastando un poco más desde el principio, podemos ahorrar mucho más tarde.

SmacL
fuente