Saltar al contenido

Recorrido narrado

Bajar la prioridad con el índice

Texto
función cambiar_prioridad(cola, x, nueva):    i ← cola.posición[x]              # tabla hash: O(1) esperado    vieja ← cola.prioridad[i]    cola.prioridad[i] ← nueva    si nueva < vieja: subir(cola, i)   # más urgente: sube    si no: bajar(cola, i)              # menos urgente: baja

Y subir y bajar actualizan cola.posición en cada intercambio. Con la cola de la figura, cambiar_prioridad(C, 1) pasa por estos tres estados:

Paso 1: la tabla localiza a CHeap B 3, A 5, C 7, D 9, E 8. La entrada C de la tabla, que apunta a la posición 2, y la celda C 7 tienen borde grueso.heap (el orden)B 30A 51C 72D 93E 84índice de posiciones (tabla hash): elemento → posiciónA → 1B → 0C → 2D → 3E → 4
Paso 1 de 3. cambiar_prioridad(C, 1): la tabla dice que C está en la posición 2. No hay que recorrer el heap.
Paso 2: C tiene prioridad 1 y su padre 3Heap B 3, A 5, C 1, D 9, E 8. La celda C 1, en la posición 2, y su padre B 3, en la posición 0, tienen borde grueso. La tabla no ha cambiado.heap (el orden)B 30A 51C 12D 93E 84índice de posiciones (tabla hash): elemento → posiciónA → 1B → 0C → 2D → 3E → 4
Paso 2 de 3. La prioridad de C pasa de 7 a 1. Su padre, en la posición 0, es B con 3: 1 es menor, así que C sube.
Paso 3: C sube y la tabla se actualizaHeap C 1, A 5, B 3, D 9, E 8. Las celdas de las posiciones 0 y 2 están marcadas como cambiadas, igual que las entradas C y B de la tabla: C va ahora a la posición 0 y B a la 2.heap (el orden)C 1*0A 51B 3*2D 93E 84índice de posiciones (tabla hash): elemento → posiciónA → 1B → 2*C → 0*D → 3E → 4
Paso 3 de 3. C sube a la posición 0 y B baja a la 2. El mismo intercambio actualiza las dos entradas de la tabla.

Borde grueso: lo que se compara. Relleno con asterisco: lo que acaba de cambiar.

Es la combinación de dos estructuras: un heap para el orden y una tabla hash para encontrar. Combinar estructuras para cubrir varias operaciones es habitual: lo verás en la caché LRU de la unidad 8.

En la ruta de Algoritmos, el algoritmo de Dijkstra usa exactamente esta cola para elegir el siguiente vértice más cercano.

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