Heap_DeleteMin(
Heap_Insert(
Heap_Insert(
Heap_Insert(
Heap_Insert(
Heap_Insert(
Heap_Insert(Heap_Empty() as Heap_H, 15),
12),
3),
7),
9),
11))
Spec: Heap_H_complete.nereus. Convención: · = Heap_Empty() as Heap_H.
Heap_Empty → singleton.BTree_Create(·, ·, 15) as Heap_H
Heap_Insert(·, 12) = BTree_Create(·, ·, 12).Heap_CombineL(BTree_Create(·, ·, 12), ·, 15): m=12 < x=15 → swap.
BTree_Create(BTree_Create(·, ·, 15) as Heap_H, ·, 12) as Heap_H
Heap_Insert(·, 3) = BTree_Create(·, ·, 3).Heap_CombineR(L, BTree_Create(·, ·, 3), 12): m=3 < x=12 → swap: 12 baja al subárbol derecho, 3 sube a la raíz.
BTree_Create(
BTree_Create(·, ·, 15) as Heap_H,
BTree_Create(·, ·, 12) as Heap_H,
3) as Heap_H
Heap_Insert(·, 7) = BTree_Create(·, ·, 7).Heap_CombineL(BTree_Create(·, ·, 7), ·, 15): 7 < 15 → swap. Resultado interno: BTree_Create(BTree_Create(·,·,15), ·, 7).Heap_CombineL(BTree_Create(BTree_Create(·,·,15), ·, 7), BTree_Create(·,·,12), 3): m=7 ≥ x=3 → no swap.
BTree_Create(
BTree_Create(BTree_Create(·, ·, 15) as Heap_H, ·, 7) as Heap_H,
BTree_Create(·, ·, 12) as Heap_H,
3) as Heap_H
L tiene |LL|=1, |LR|=0 → no perfecto. Regla B (descender L para completarlo). Sub-recursión en L:
BTree_Create(BTree_Create(·,·,15), ·, 7). |L'|=1, |R'|=0, L' singleton → perfecto. Regla C (descender R').Heap_Insert(·, 9) = BTree_Create(·, ·, 9).Heap_CombineR(BTree_Create(·,·,15), BTree_Create(·, ·, 9), 7): 9 ≥ 7 → no swap.BTree_Create(BTree_Create(·,·,15), BTree_Create(·,·,9), 7).Heap_CombineL(..., BTree_Create(·,·,12), 3): 7 ≥ 3 → no swap.
BTree_Create(
BTree_Create(BTree_Create(·, ·, 15) as Heap_H,
BTree_Create(·, ·, 9) as Heap_H, 7) as Heap_H,
BTree_Create(·, ·, 12) as Heap_H,
3) as Heap_H
L tiene |LL|=|LR|=1, ambos singletons, → perfecto (3 nodos: árbol completo de altura 2). Regla C (descender R). Sub-recursión en R=BTree_Create(·,·,12):
Heap_Insert(·, 11) = BTree_Create(·, ·, 11).Heap_CombineL(BTree_Create(·, ·, 11), ·, 12): 11 < 12 → swap. Resultado: BTree_Create(BTree_Create(·,·,12), ·, 11).Heap_CombineR(L_perfecto, BTree_Create(BTree_Create(·,·,12), ·, 11), 3): m=11 ≥ x=3 → no swap.
BTree_Create(
BTree_Create(BTree_Create(·, ·, 15) as Heap_H,
BTree_Create(·, ·, 9) as Heap_H, 7) as Heap_H,
BTree_Create(BTree_Create(·, ·, 12) as Heap_H, ·, 11) as Heap_H,
3) as Heap_H
Posiciones BFS: 1=3, 2=7, 3=11, 4=15, 5=9, 6=12. Forma OK (completo niveles 1–2, último nivel parcial llenado izquierda → derecha hasta posición 6). Heap order OK: 3≤7, 3≤11, 7≤15, 7≤9, 11≤12.
Heap_DeleteMin sobre el heap construidoLlamemos T al heap construido (BTree_Create(LT, RT, 3) as Heap_H). Como T no es singleton, se aplica el axioma general:
not (BTree_IsEmpty(L) and BTree_IsEmpty(R)) implies Heap_DeleteMin(BTree_Create(L, R, x) as Heap_H) = Heap_SiftDown( Heap_ReplaceRoot( Heap_RemoveLast(BTree_Create(L, R, x) as Heap_H), Heap_Last(BTree_Create(L, R, x) as Heap_H) ) );
Heap_Last(T)T: |LT|=3, |RT|=2, |LT|>|RT| ✓.perfect(LT)? LT tiene |LL|=|LR|=1, ambos perfectos → sí.perfect(RT)? RT = BTree_Create(BTree_Create(·,·,12), ·, 11) con |RTL|=1, |RTR|=0 → no.|L|>|R| ∧ (¬perfect(L) ∨ perfect(R)) = T ∧ (F ∨ F) = F → último en R.BTree_Create(BTree_Create(·,·,12), ·, 11):
|L'|=1, |R'|=0, |L'|>|R'| ✓, perfect(L') singleton ✓, perfect(R') empty ✓.Heap_Last(BTree_Create(·, ·, 12)): singleton → 12.Resultado: Heap_Last(T) = 12.
Heap_RemoveLast(T)Heap_RemoveLast(T) = BTree_Create(LT, Heap_RemoveLast(RT), 3).Heap_RemoveLast(RT) con último en L' →= BTree_Create(Heap_RemoveLast(BTree_Create(·,·,12)), ·, 11)= BTree_Create(Heap_Empty, ·, 11) (caso singleton)= BTree_Create(·, ·, 11) as Heap_H.
BTree_Create(
BTree_Create(BTree_Create(·, ·, 15) as Heap_H,
BTree_Create(·, ·, 9) as Heap_H, 7) as Heap_H,
BTree_Create(·, ·, 11) as Heap_H,
3) as Heap_H
Heap_ReplaceRoot(..., 12)Heap_ReplaceRoot(BTree_Create(L, R, x), m) = BTree_Create(L, R, m). Reemplazo 3 por 12:
BTree_Create(
BTree_Create(BTree_Create(·, ·, 15) as Heap_H,
BTree_Create(·, ·, 9) as Heap_H, 7) as Heap_H,
BTree_Create(·, ·, 11) as Heap_H,
12) as Heap_H
12 está por encima de 7 (hijo izq) y de 11 (hijo der). El SiftDown lo baja al lugar correcto.
Heap_SiftDown: nivel 1 (SDBoth, caso b)Heap_SDBoth(L, R, 12) con m1=7 (raíz de L), m2=11 (raíz de R), x=12.
| Caso | Condición | Aplica |
|---|---|---|
| (a) | ¬(7<12) ∧ ¬(11<12) = F ∧ F | No |
| (b) | (7<12) ∧ ¬(11<7) = T ∧ T | Sí ← |
| (c) | (11<12) ∧ (11<7) = T ∧ F | No |
m1=7, swap con izquierda y recurrir.BTree_Create(Heap_SiftDown(BTree_Create(LL, LR, 12)), R, 7) con LL=BTree_Create(·,·,15), LR=BTree_Create(·,·,9).BTree_Create(BTree_Create(·,·,15), BTree_Create(·,·,9), 12).
Heap_SiftDown recursivo: nivel 2 (SDBoth, caso c)BTree_Create(BTree_Create(·,·,15), BTree_Create(·,·,9), 12). Ambos hijos no vacíos → SDBoth con m1=15, m2=9, x=12.
| Caso | Condición | Aplica |
|---|---|---|
| (a) | ¬(15<12) ∧ ¬(9<12) = T ∧ F | No |
| (b) | (15<12) ∧ ¬(9<15) = F ∧ T | No |
| (c) | (9<12) ∧ (9<15) = T ∧ T | Sí ← |
m2=9 (estrictamente menor que m1=15), swap con derecha y recurrir.BTree_Create(BTree_Create(·,·,15), Heap_SiftDown(BTree_Create(·,·,12)), 9).Heap_SiftDown(BTree_Create(·, ·, 12)) — hoja, no hace nada → BTree_Create(·, ·, 12).
BTree_Create(
BTree_Create(·, ·, 15) as Heap_H,
BTree_Create(·, ·, 12) as Heap_H,
9) as Heap_H
Sub-árbol post-sift: 9 a la raíz, 15 a la izquierda, 12 a la derecha. Propiedad heap localmente OK: 9 ≤ 15, 9 ≤ 12.
BTree_Create(
BTree_Create(BTree_Create(·, ·, 15) as Heap_H,
BTree_Create(·, ·, 12) as Heap_H, 9) as Heap_H,
BTree_Create(·, ·, 11) as Heap_H,
7) as Heap_H
| Aspecto | Antes del DeleteMin | Después del DeleteMin |
|---|---|---|
| Elementos | {3, 7, 9, 11, 12, 15} | {7, 9, 11, 12, 15} |
| Mínimo | 3 | 7 |
| Tamaño | 6 | 5 |
| Posiciones BFS | 1=3, 2=7, 3=11, 4=15, 5=9, 6=12 | 1=7, 2=9, 3=11, 4=15, 5=12 |
| Forma (completo + último izq→der) | ✓ | ✓ |
| Heap order | 3 ≤ 7, 11 ; 7 ≤ 15, 9 ; 11 ≤ 12 ✓ | 7 ≤ 9, 11 ; 9 ≤ 15, 12 ✓ |
Heap_Last recorrió por RT (porque LT ya era perfecto), luego por L' (porque ahí estaba el último BFS), y encontró 12.