Saltar al contenido principal

Análisis

Para analizar el costo amortizado de las operaciones usaremos la función potencial. Definiremos ϕ=2+a\phi = 2\ell+a, donde \ell es el largo de la lista de árboles en el bosque y aa es la cantidad de celdas no vacías en el arreglo AA que se usa para la operación ExtractMin (se entiende que el arreglo está vacío durante las otras operaciones).

Tenemos ϕ0=0\phi_0=0 al comenzar con la cola vacía. La operación de insertar incrementa ϕ\phi en 22, por lo que su costo amortizado sigue siendo O(1)O(1). FindMin no cambia ϕ\phi, por lo que su costo amortizado es igual al costo real, O(1)O(1). Heapify es una secuencia de inserciones, por lo que su costo real y amortizado es O(n)O(n).

Para la operación Merge, debemos considerar un conjunto de colas, y ϕ\phi se define como la suma de 2+a2\ell+a sobre todas las colas. De esa manera, al realizar Merge esta función ϕ\phi global no cambia, y el costo real O(1)O(1) es también el costo amortizado.

Nuevamente, la operación compleja es ExtractMin. El primer paso es eliminar la raíz del árbol BkB_k que contiene el mínimo e insertar sus hijos en la lista. Esto cuesta ci=kc_i=k e incrementa el largo de la lista en k1k-1, con lo cual tenemos Δϕi=2k2\Delta\phi_i=2k-2 y ci^=3k2=O(logn)\hat{c_i}=3k-2=O(\log n) (podríamos tener ci=1c_i=1 si representamos los hijos con una lista doblemente enlazada, pero esto no cambia el costo amortizado).

Luego reducimos la lista a un bosque binomial. Consideremos el costo amortizado de procesar cada nuevo árbol BkB_k. Si A[k]A[k] está vacío, movemos el BkB_k de la lista a A[k]A[k], con lo cual tenemos un costo de ci=1c_i=1 para moverlo y Δϕi=1\Delta\phi_i=-1, resultando un costo amortizado de ci^=0\hat{c_i}=0. Si, en cambio, teníamos un árbol en A[k]A[k], entonces lo sacamos de A[k]A[k] y lo unimos con el árbol BkB_k de la lista, reemplazando ese árbol por el árbol unión Bk+1B_{k+1}, que reemplaza al BkB_k de la lista. Tenemos un costo de ci=1c_i=1 y Δϕi=1\Delta\phi_i = -1, con lo que nuevamente el costo amortizado es cero. Finalmente, movemos los alogna \le \log n árboles no nulos de AA a la lista, lo que cuesta aa operaciones e incrementa ϕ\phi en aa también, sumando O(logn)O(\log n) al costo amortizado. En total, la operación ExtractMin tiene un costo amortizado de O(logn)O(\log n).

Note que estamos asignando costo ci=1c_i=1 a diversas cantidades constantes de operaciones que realizamos. Se le puede asignar cualquier otro costo constante cc y redefinir ϕ=c(2+a)\phi = c(2\ell+a) para obtener el mismo resultado.