Notas
Notas
Notas
Indice general
1. Modelo de datos, Iteracion y Recursi on 13
1.1. Programaci on Iterativa . . . . . . . . . . . . . . . . . . . . . . 13
1.1.1. Iteracion mediante FOR . . . . . . . . . . . . . . . . . 13
1.1.2. Iteracion WHILE . . . . . . . . . . . . . . . . . . . . . 14
1.1.3. Iteracion DO WHILE . . . . . . . . . . . . . . . . . . . 15
1.1.4. Como elegir que estructura de iteraci on utilizar . . . . 15
1.2. Pruebas inductivas . . . . . . . . . . . . . . . . . . . . . . . . 16
1.2.1. Ejemplo 1 . . . . . . . . . . . . . . . . . . . . . . . . . 19
1.2.2. Ejemplo 2: Suma geometrica . . . . . . . . . . . . . . . 20
1.2.3. Ejemplo 3 . . . . . . . . . . . . . . . . . . . . . . . . . 21
1.3. Deniciones y funciones Recursivas . . . . . . . . . . . . . . . 21
1.3.1. El factorial . . . . . . . . . . . . . . . . . . . . . . . . 21
1.3.2. M aximo com un divisor . . . . . . . . . . . . . . . . . . 24
1.3.3. Caminata Rob otica . . . . . . . . . . . . . . . . . . . . 25
1.3.4. Torres de Hanoi . . . . . . . . . . . . . . . . . . . . . . 27
1.4. Algoritmos de ordenamiento . . . . . . . . . . . . . . . . . . . 31
1.4.1. conceptos preliminares . . . . . . . . . . . . . . . . . . 31
1.4.2. Ordenamiento de Burbuja (BubbleSort) . . . . . . . . 32
1.4.3. Ordenamiento de por mezcla (MergeSort) . . . . . . . 34
1.4.4. Ordenamiento rapido (QuickSort) . . . . . . . . . . . . 36
1.5. Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
2. El modelo de datos de listas 43
2.1. Introducci on . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
2.2. Implementacion del modelo de Listas ligadas . . . . . . . . . . 43
2.3. Operaciones basicas con Listas . . . . . . . . . . . . . . . . . . 45
2.3.1. Insercion de nodos . . . . . . . . . . . . . . . . . . . . 45
2.3.2. Borrado de nodos . . . . . . . . . . . . . . . . . . . . . 48
3
4
INDICE GENERAL
2.3.3. B usqueda e Impresion . . . . . . . . . . . . . . . . . . 50
2.3.4. Algoritmos de Ordenamiento utilizando listas . . . . . 51
2.4. Implementacion del modelo de Pilas . . . . . . . . . . . . . . . 54
2.4.1. Conversi on de notaci on inja a posja . . . . . . . . . 55
2.5. Implementacion del modelo de Colas . . . . . . . . . . . . . . 56
2.5.1. Programacion Din amica . . . . . . . . . . . . . . . . . 57
2.5.2. top-down . . . . . . . . . . . . . . . . . . . . . . . . . 60
2.6. Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
3. El modelo de conjunto de datos 67
3.1. Deniciones B asicas y Principales Operaciones con Conjuntos 67
3.1.1. Deniciones B asicas . . . . . . . . . . . . . . . . . . . . 67
3.1.2. Operaciones con Conjuntos . . . . . . . . . . . . . . . 69
3.1.3. Implementaci on de Conjuntos Utilizando Listas . . . . 71
3.1.4. Relaciones y Funciones . . . . . . . . . . . . . . . . . . 76
3.2. Proyecto de Programaci on . . . . . . . . . . . . . . . . . . . . 78
3.2.1.
Indices invertidos . . . . . . . . . . . . . . . . . . . . . 78
3.2.2. Trabajo . . . . . . . . . . . . . . . . . . . . . . . . . . 79
4. El modelo de datos de arboles 81
4.1. Terminologa B asica . . . . . . . . . . . . . . . . . . . . . . . 81
4.1.1. Denicion Recursiva . . . . . . . . . . . . . . . . . . . 82
4.1.2. Rutas, Antecesores y Descendientes . . . . . . . . . . . 82
4.1.3. Sub-arboles . . . . . . . . . . . . . . . . . . . . . . . . 83
4.1.4. Altura y Profundidad . . . . . . . . . . . . . . . . . . . 83
4.1.5.
Arboler Ordenados . . . . . . . . . . . . . . . . . . . . 83
4.1.6.
Arboles Etiquetados . . . . . . . . . . . . . . . . . . . 83
4.1.7.
Arboles de Expresiones . . . . . . . . . . . . . . . . . . 84
4.2. Estructuras de Datos para
Arboles . . . . . . . . . . . . . . . 85
4.2.1. Representaci on m as a la izquierda-hermano a la derecha 85
4.2.2. Apuntador hacia el Padre . . . . . . . . . . . . . . . . 85
4.3. Recursi on en
Arboles . . . . . . . . . . . . . . . . . . . . . . . 86
4.4.
Arboles Binarios . . . . . . . . . . . . . . . . . . . . . . . . . 90
4.4.1. Estructuras de Datos para
Arboles Binarios . . . . . . 90
4.4.2. Recursion sobre
Arboles Binarios . . . . . . . . . . . . 91
4.4.3. Recurridos en Orden . . . . . . . . . . . . . . . . . . . 91
4.5.
Arboles de B usqueda Binarios . . . . . . . . . . . . . . . . . . 91
4.5.1. Implementaci on de
Arboles de B usqueda Binarios . . . 92
INDICE GENERAL 5
4.6. Colas de Prioridad y
Arboles Parcialmente Ordenados . . . . . 94
4.6.1. Colas de Prioridad . . . . . . . . . . . . . . . . . . . . 94
4.6.2.
Arboles Parcialmente Ordenados (POT) . . . . . . . . 94
4.6.3. POTs Balanceados y Montculos (Heaps) . . . . . . . . 95
4.7. Heapsort . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
4.8. Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
5. Teora y algoritmos de grafos 99
6
INDICE GENERAL
Indice de cuadros
1.1. Descomposici on del problema del factorial . . . . . . . . . . . 22
1.2. Combinacion de los subproblemas del problema del factorial . 23
1.3. Simulaci on para las Torres de Hanoi con N = 3 . . . . . . . . 30
2.1. LLenado de el arreglo L . . . . . . . . . . . . . . . . . . . . . 63
3.1. Equivalencia Operaciones Vectores Caractersticos . . . . . . . 74
4.1. Evaluacion en Preorden . . . . . . . . . . . . . . . . . . . . . . 89
4.2. Evaluacion en postorden . . . . . . . . . . . . . . . . . . . . . 89
7
8
INDICE DE CUADROS
Indice de guras
1.1. Cubos numerados sobre una mesa . . . . . . . . . . . . . . . 16
1.2. Secuencia de movimientos parar 3 discos . . . . . . . . . . . . 28
1.3. Descomposici on del algoritmo de ordenamiento por mezcla . . 35
1.4. Parte de mezclado del algoritmo de ordenamiento por mezcla 35
2.1. Variable de referencia a un objeto . . . . . . . . . . . . . . . . 44
2.2. Representaci on de una lista ligada . . . . . . . . . . . . . . . . 44
2.3. Inserci on al principio de una lista . . . . . . . . . . . . . . . . 46
2.4. Inserci on al nal de una lista . . . . . . . . . . . . . . . . . . . 47
2.5. Borrar al principiol de una lista . . . . . . . . . . . . . . . . . 48
2.6. Borrar al nal de una lista . . . . . . . . . . . . . . . . . . . . 49
2.7. Proceso de divisi on de una lista . . . . . . . . . . . . . . . . . 52
2.8. Subsecunecia com un m as larga . . . . . . . . . . . . . . . . . . 59
3.1. Operaciones con conjuntos . . . . . . . . . . . . . . . . . . . 69
3.2. Diagrama de Venn . . . . . . . . . . . . . . . . . . . . . . . . 70
3.3. Tabla Hash . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
4.1.
Arbol B asico . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
4.2. Relaci on a la izquierda . . . . . . . . . . . . . . . . . . . . . . 83
4.3. (E
1
+ E
2
) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
4.4.
Arbol ejemplo para funciones recursivas . . . . . . . . . . . . . 86
4.5.
Arbol ejemplo evaluacion preorden y postorden - a+(b-c)*d . 88
4.6. Heap Basico . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
4.7. Heapsort Basico . . . . . . . . . . . . . . . . . . . . . . . . . . 96
9
10
INDICE DE FIGURAS
Lista de algoritmos
1. Calculo de n factorial . . . . . . . . . . . . . . . . . . . . . . 23
2. Calculo recursivo del maximo com un divisor . . . . . . . . . . 25
3. Caminata de un robot . . . . . . . . . . . . . . . . . . . . . . 26
4. Secuencia de movimientos para el juego de Torres de Hanoi . 30
5. Ordenamiento de burbuja . . . . . . . . . . . . . . . . . . . . 34
6. Ordenamiento de mezcla . . . . . . . . . . . . . . . . . . . . . 36
7. Funci on de mezcla de sublistas . . . . . . . . . . . . . . . . . . 37
8. Ordenamiento rapido . . . . . . . . . . . . . . . . . . . . . . 38
9. Funci on que encuentra el elemento de particion . . . . . . . . 39
10. Funcion para saber si un patr on en una subsecuencia de un
texto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
11. Uni on con Listas Desordenadas . . . . . . . . . . . . . . . . . 71
12. Funcion auxiliar ensambla . . . . . . . . . . . . . . . . . . . . 71
13. Uni on Listas Ordenadas . . . . . . . . . . . . . . . . . . . . . 72
14. Intersecci on Listas Ordenadas . . . . . . . . . . . . . . . . . . 73
15. Diferencia Listas Ordenadas . . . . . . . . . . . . . . . . . . . 74
16. Funcion Hash Letra Inicial . . . . . . . . . . . . . . . . . . . . 75
17. Funcion Inserta en Tabla Hash . . . . . . . . . . . . . . . . . . 76
18. Funcion Eliminar de Tabla Hash . . . . . . . . . . . . . . . . . 76
19. Funcion Buscar en Tabla Hash . . . . . . . . . . . . . . . . . . 76
20. Estructura de Celda Lista Ligada para Funciones . . . . . . . 77
21. Inserta en Tabla Hash para Funciones . . . . . . . . . . . . . 78
22. Estructura - solo padre . . . . . . . . . . . . . . . . . . . . . . 85
23. Estructura - solo hijos . . . . . . . . . . . . . . . . . . . . . . 85
24. Estructura - mas a la izquierda-hermano a la derecha . . . . . 86
25. Estructura - apuntador al padre . . . . . . . . . . . . . . . . . 86
26. Recursividad en arboles - F(n) . . . . . . . . . . . . . . . . . . 87
27. Evaluacion en Preorden - F(n) . . . . . . . . . . . . . . . . . . 88
11
28. Evaluacion en Postorden - F(n) . . . . . . . . . . . . . . . . . 89
29. Estructura Nodo
Arbol Binario . . . . . . . . . . . . . . . . . 90
30. Recursi on
Arbol Binario . . . . . . . . . . . . . . . . . . . . . 91
31. Evaluacion en Orden - F(n) . . . . . . . . . . . . . . . . . . . 91
32. Inserta en arbol binario . . . . . . . . . . . . . . . . . . . . . . 92
33. Buscar en arbol binario . . . . . . . . . . . . . . . . . . . . . . 93
34. Eliminar en arbol binario . . . . . . . . . . . . . . . . . . . . . 93
35. Inserta en heap . . . . . . . . . . . . . . . . . . . . . . . . . . 95
36. Eliminar de heap . . . . . . . . . . . . . . . . . . . . . . . . . 96
37. Fase 2 de heapsort . . . . . . . . . . . . . . . . . . . . . . . . 96
38. Heapsort . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
Captulo 1
Modelo de datos, Iteracion y
Recursi on
1.1. Programaci on Iterativa
Los ciclos o bucles son estructuras iterativas que proveen los lenguajes
de programaci on para ejecutar un conjunto de instrucciones un n umero de
veces determinado por una expresi on. Las instrucciones en ciclos resuelven
el problema de repetir un conjunto de instrucciones m as de una vez.A cada
repetici on del conjunto de acciones se denomina iteracion
1.1.1. Iteraci on mediante FOR
Es una estructura iterativa que es controlada mediante un ndice o va-
riable de control, la cual se incrementa o decrementa hasta llegar a un valor
lmite o valor nal que representa la condicion de paro. L a condici on de paro
no es una expresi on l ogica sino un valor que indica el nal de ciclo.
Por su parte, en Java la condici on de paro si es una expresion logica
por consiguiente se puede ejecutar tanto un n umero predenido de veces
como hasta que se cumpla una determinada condicion.En su forma simple la
inicializaci on es una instrucci on de asignaci on que indica el valor de inicio de
la variable ndice.
La expresi on condicional eval ua la variable ndice con valor nal o de pa-
rada que determina cuando termina el ciclo.El incremento/decremento dene
la forma en que la variable de control del ciclo debe cambiar cada vez que se
realiza una iteracion.
13
14 CAP
ON Y RECURSI
ON
En java
for (< inicializaci on >; < expresi on condicional >; < inc/dec >) {
< inst 1 >; s
.
.
< inst n >;
}
En seudocodigo
Para < inicializaci on > hasta < valor2 > en
< inc/dec > hacer
< inst 1 >;
.
.
< inst n >;
FPara;
1.1.2. Iteraci on WHILE
Es una estructura iterativa que permite la ejecuci on de un bloque de
instrucciones, siempre que una condici on dada se cumpla, es decir cuando la
condici on evaluada es verdadera.
El while repite las instrucciones del ciclo cero (0) o mas veces, ya que
la condicion de entrada se verica al inicio de cada iteraci on y podra no
cumplirse la primera vez.
En java
while (< expresi on >) {
< inst 1 >;
.
.
< inst n >;
}
En seudocodigo
Mientras (< expresi on >) Hacer
< inst 1 >;
.
1.1. PROGRAMACI
ON ITERATIVA 15
.
< inst n >;
FMientras
1.1.3. Iteraci on DO WHILE
Un do while al igual que un while ejecuta un bloque de instrucciones
hasta que se cumpla la condicion de paro, es decir, hasta que la evaluacion
de la condicion de paro sea verdadera. Este bloque de instrucciones se realiza
al menos una (1) vez, ya que la condicion se verica al nal lo cual permite
ejecutar el ciclo al menos la primera vez.
El comportamiento de do while en seudocodigo y en lenguaje Java no es el
mismo. La diferencia principal radica en que en el seudoc odigo l el conjunto
de instrucciones se realiza hasta que la condici on sea verdadera, en cambio
en el lenguaje Java se realizan mientras la condici on sea verdadera.
En java
do {
< inst 1 >
.
.
< instn >} while (< expresi on >);
En seudocodigo
Repetir
< inst1 >;
.
.
< instn >;
Hasta (< expresi on >);
1.1.4. Como elegir que estructura de iteracion utilizar
Pueden considerarse los siguientes puntos en la elecci on del tipo de sen-
tencia de iteraci on :
Si se conoce la cantidad exacta de veces que se va a ejecutar el ciclo o
si se puede calcular de alguna manera, entonces usar Para (for).
16 CAP
ON Y RECURSI
ON
Si se desconoce la cantidad de veces en que se deben repetir las instruc-
ciones o se deben utilizar uno o varios criterios de paro para detener
el ciclo, y las condiciones deben vericarse al inicio del ciclo, entonces
utilizar while.
Si se desconoce la cantidad de veces en que se repetir an las instrucciones
o se deben utilizar uno o varios criterios de parada para detener el ciclo,
pero las instrucciones deben realizarse al menos la una vez, entonces
utilizar do - while.
1.2. Pruebas inductivas
Supongamos que una serie de cubos numerados 1, 2, 3 ... est an sobre una
mesa (innitamente) larga y que algunos cubos est an marcados con una X
(ver Figura1.1). Supongamos que :
Proposicion 1 El primero de los cubos esta marcado
Proposicion 2 Si todos los cubos anteriores al cubo (n+1) estan marcados,
entonces el cubo (n + 1) tambien lo esta.
! ! ! ! !
"""
# $ % & '
Figura 1.1: Cubos numerados sobre una mesa
Mostraremos que 1 y 2 implican que cada cubo est a marcado, examinando
los cubos uno por uno.
La armacion de 1 establece de manera explcita que el cubo 1 esta mar-
cado. Consideremos el cubo 2. Todos los cubos anteriores al cubo 2, a saber,
el cubo 1, esta marcado, as de acuerdo al 2, el cubo 2 tambien esta marcado.
Consideremos el cubo 3, los cubos 1 y 2 est an marcados; as de acuerdo con 2
1.2. PRUEBAS INDUCTIVAS 17
el cubo 3 tambien esta marcado. De esta forma, podemos mostrar que cada
cubo est a marcado. Por ejemplo supongamos que se ha vericado que los
cubos de 1 al 5 est an marcados, como muestra la Figura 1.1. Para mostrar
que el cubo 6 que no aparece en la Figura, est a marcado, observemos que
todos los cubos anteriores al cubo 6 estan marcados, de modo que por 2 el
cubo 6 tambien esta marcado.
El ejemplo anterior ilustra el principio de induccion matematica.
Para mostrar c omo se puede utilizar la induccion matematica de manera
mas profunda, sea S
n
la suma de los primeros n enteros positivos
S
n
= 1 + 2 + 3 + . . . + n (1.1)
Supongamos que alguien arma que
S
n
=
n(n+1)
2
, para n = 1, 2, 3, . . . , n (1.2)
En realidad se establece la siguiente serie de armaciones
S
n
=
1(2)
2
S
n
=
2(3)
2
.
.
.
S
n
=
n(n + 1)
2
Supongamos que cada ecuacion verdadera tiene una Xjunto a ella. Co-
mo la primera ecuaci on es verdadera, esta marcada. Ahora, supongamos que
podemos mostrar que si todas la ecuaciones anteriores a una ecuaci on par-
ticular, digamos la ecuaci on (n + 1), est an marcadas, entonces la ecuacion
(n+1) tambien esta marcada. Entonces, como en el ejemplo los cubos, todas
las ecuaciones estan marcadas; es decir todas las ecuaciones son verdaderas
y se verica la ecuaci on 1.2.
Debemos mostrar que si todas la ecuaciones anteriores a la ecuacion (n+1)
son verdaderas, entonces la ecuaci on (n + 1) tambien lo es. Suponiendo que
todas la ecuaciones anteriores a la ecuaci on (n+1) son verdaderas, entonces,
en particular la ecuaci on n es verdadera.
S
n
= n
n(n + 1)
2
(1.3)
18 CAP
ON Y RECURSI
ON
Debemos mostrar que la ecuacion (n + 1)
S
n
= n
(n + 1)(n + 2)
2
es verdadera. De acuerdo a la ecuaci on 1.1
S
n+1
= 1 + 2 + 3 + . . . + n + (n + 1)
Observamos que S
n
est a contenida dentro de S
n+1
, en el sentido de que
S
n+1
= 1 + 2 + 3 + . . . + n + (n + 1) = S
n
+ (n + 1) (1.4)
Debido a 1.3 y 1.4, tenemos
S
n+1
= S
n
+(n+1) =
n(n + 1)
2
+n+1 =
n(n + 1) + 2(n + 1)
2
=
(n + 2)(n + 1)
2
La demostraci on por induccion consto de dos pasos. En primer lugar,
vericamos que la armacion correspondiente a n = 1 era verdadera. En
segundo lugar, se supuso que las armaciones 1, 2, 3 . . . n eran verdaderas
y se demostr o que la armaci on (n + 1) tambien lo era. Al demostrar la
armaci on (n+1), podamos utilizar las armaciones 1, 2, 3 . . . n; de hecho, la
tecnica para construir una demostraci on por inducci on matem atica consiste
en relacionar las armaciones 1, 2, 3 . . . n con la armaci on (n + 1).
A continuacion enunciamos de manera formal el principio de induccion
matem atica.
Principio de induccion matematica Supongamos que para cada entero
positivo n tenemos una armacion S(n) que es verdadera o falsa. Suponga-
mos que.
Proposicion 3 S(1) es verdadera;
Proposicion 4 si S(i) es verdadera, para toda i < n +1, entonces S(n +1)
es verdadera
La condici on 3 se llama paso base Entonces S(n) es verdadera para cada
entero positivo n y la condici on 4 se le llama paso inductivo.
1.2. PRUEBAS INDUCTIVAS 19
1.2.1. Ejemplo 1
Ahora se ilustra la induccion matem atica mediante otro ejemplo.
Utilizar induccion matem atica para mostrar que
n! 2
n1
(1.5)
Paso Base (Condici on 3 ) Debemos mostrar que 1.5 es verdadera si n = 1.
Esto es f acil de vericar 1! = 1 1 = 2
11
.
Paso Inductivo (Condici on 4) Debemos mostrar que si i! 2
i1
para i =
1, 2, 3, . . . , n entonces
(n + 1) 2
n
(1.6)
Supongamos que i 2
i1
para i = 1, 2, 3, . . . , n. Entonces en particular,
para i = n, tenemos
n 2
n1
(1.7)
Podemos relacionar 1.6 y 1.7 observando que
(n + 1)! = (n + 1)(n!).
Ahora,
(n + 1)! = (n + 1)(n!)
(n + 1)2
n1
por 1.7
2 2
n1
pues n + 1 2
= 2
n
Por tanto, 1.5 es verdadera. Se ha concluido el paso inductivo.
Como se ha vericado el paso base y el paso inductivo, el principio de
inducci on matem atica nos dice que 1.5 es verdadera para cada entero positivo
n.
Para vericar el paso inductivo 4 suponemos que si S(i) es verdadera
para toda i < n + 1 y luego demostramos que S(n + 1) es verdadera. Es-
ta formulacion de la inducci on matematica se le llama la forma fuerte de
20 CAP
ON Y RECURSI
ON
la induccion matematica. Con frecuencia, como en le caso de los ejem-
plos anteriores, podemos deducir S(n + 1) suponiendo solamente S(n). En
realidad, con frecuencia ser enuncia el paso inductivo de la manera siguiente:
Si S(n) es verdadera, entonces S(n + 1) es verdadera.
En estas dos formulaciones, el paso base no se modica. Puede mostrarse
que las dos formas de inducci on matematica son equivalentes.
Si queremos vericar que las armaciones
S(n
0
), S(n
0
+ 1), . . . ,
donde n
0
= 1, son verdaderas, debemos cambiar el paso base a
S(n
0
) es verdadera.
El paso inductivo no se modica.
1.2.2. Ejemplo 2: Suma geometrica
Utilizar induccion para mostrar que si r = 1,
a + ar
1
+ ar
2
+ + ar
n
=
a(r
n+1
1)
r 1
(1.8)
para n = 0, 1, . . .
La suma de la izquierda se llama suma geometrica. En una suma geometri-
ca, la raz on entre los terminos consecutivos (ar
i+1
/ar
i
= r es constante.
Paso Base . El paso base, que en este caso se obtiene haciendo n = 0, es
a =
a(r
1
1)
r 1
lo cual es verdadero.
Paso Inductivo . Supongamos que la armaci on 1.8 es verdadera para n.
Ahora
a + ar
1
+ ar
2
+ + ar
n
+ ar
n+1
=
a(r
n+1
1)
r1
+ ar
n+1
=
a(r
n+1
1)
r1
+
ar
n+1
(r1)
r1
=
a(r
n+2
1)
r1
Como se ha vericado el paso base modicado y el paso inductivo, el
principio de inducci on matem atica nos dice que 1.8 es verdadera para n =
0, 1, . . .
1.3. DEFINICIONES Y FUNCIONES RECURSIVAS 21
1.2.3. Ejemplo 3
Utilizar induccion para mostrar que 5
n
1 es divisible entre 4 para n =
1, 2, . . .
Paso Base . Si n = 1, 5
n
1 = 5
1
1 = 4, que es divisible entre 4.
Paso Inductivo . Supongamos que 5
n
1 es divisible entre 4. Debemos
mostrar que 5
n1
1 es divisible entre 4. Para relacionar el caso (n+1)
con el caso n, escribimos
5
n+1
1 = 5 5
n
1 = (4 + 1) 5
n
1 = 4 5
n
+ (5
n
1)
Por hip otesis 5
n
1 es divisible entre 4, y como 4 5
n
es divisible entre
4, la suma
4 5
n
+ (5
n
1)
es divisible entre 4. Como se ha vericado el paso base y el paso induc-
tivo, el principio de inducci on matematica dice que 5
n
1 es divisible
entre 4 para n = 1, 2, . . ..
1.3. Deniciones y funciones Recursivas
Un procedimiento recursivo es aquel que se llama a s mismo. La recursion
es poderosa, elegante y natural de resolver una gran variedad de problemas.
Un problema puede resolverse mediante una tecnica divide y venceras en la
cual el problema se descompone en problemas del mismo tipo que el origi-
nal. Cada subproblema, a su vez, se descompone de nuevo y as hasta que
se obtienen subproblemas los cuales pueden resolverse de manera directa.
Por ultimo, las soluciones de los subproblemas se combinan para obtener la
soluci on del problema original.
1.3.1. El factorial
El factorial de n o n factorial se dene como
n! =
1 si n = 0
n(n 1)(n 2) 2 1 si n 1
Observe que n factorial puede escribirse en terminos de si mismo pues si
quitamos n, el producto restante es s olo (n 1)!; es decir,
22 CAP
ON Y RECURSI
ON
n! = n(n 1)(n 2) 2 1 = n(n 1)!
Por ejemplo
5! = 5 4 3 2 1 = 5 4!
La ecuacion n(n 1)!, muestra la forma de descomponer el problema
original (calcular n!) en subproblemas cada vez m as sencillos [calcular (n1),
calcular (n2)! ...] hasta que el proceso llegue a un problema m as simple, el
calculo de 0!. En ese momento las soluciones de estos subproblemas pueden
combinarse (multiplicando) para resolver el problema original.
Por ejemplo, el problema de calcular 5! se reduce a calcular 4!; el problema
de calcular 4! se reduce a calcular 3! ; y as sucesivamente. La tabla 1.1 resume
el proceso.
Cuadro 1.1: Descomposici on del problema del factorial
Problema Problema simplicado
5! 5 4!
4! 4 3!
3! 3 2!
2! 2 1!
1! 1 0!
0! Ninguno
Una vez que el problema de calcular 5! se ha reducido a resolver subpro-
blemas, la solucion del problema m as sencillo puede utilizarse para resolver
el siguiente subproblema, y as sucesivamente, hasta resolver el problema ori-
ginal. La tabla 1.2 muestra como se combinan los subproblemas para resolver
el problema original
A continuacion escribimos un algoritmo recursivo que calcula factoriales.
El algoritmo es una traduccion directa de la ecuaci on n(n 1)!
Ahora mostraremos la forma en que el Algoritmo 1 calcula n! para diversos
valores de n. Si n = 0, el procedimiento regresa, en la lnea 3, el valor correcto
1.
Si n = 1, como n = 0 pasamos a la lnea 4. Utilizamos este procedimiento
para calcular 0!. Ya hemos observado que el procedimiento calcula 0!. En la
lnea 4 el procedimiento calcula de forma correcta el valor de 1!.
1.3. DEFINICIONES Y FUNCIONES RECURSIVAS 23
Cuadro 1.2: Combinacion de los subproblemas del problema del factorial
Problema Soluci on
0! 1
1! 1 0! = 1
2! 2 1! = 2
3! 3 2! = 3 2 = 6
4! 4 3! = 4 6 = 24
5! 5 4! = 5 24 = 120
Algoritmo 1 C alculo de n factorial
Entrada: n, un entero mayor o igual con 0
Salida: n!
1: factorial(n)
2: si n = 0 entonces
3: devolver 1
4: n si
5: devolver n factorial (n 1)
(n 1)! n = 0! 1 = 1 1 = 1
Si n = 2, como n = 0 pasamos a la lnea 4. Utilizamos este procedimiento
para calcular 1!. Ya hemos observado que el procedimiento calcula 1 como el
valor de 1!. En la lnea 4 el procedimiento calcula de forma correcta el valor
de 2!.
(n 1)! n = 1! 2 = 1 2 = 1
Si n = 3, como n = 0 pasamos a la lnea 4. Utilizamos este procedimiento
para calcular 2!. Ya hemos observado que el procedimiento calcula 2 como el
valor de 2!. En la lnea 4 el procedimiento calcula de forma correcta el valor
de 3!.
(n 1)! n = 2! 3 = 2 3 = 6
Los argumentos anteriores pueden generalizarse mediante inducci on ma-
tem atica para demostrar que el algoritmo 1 tiene como salida correcta el
valor de n! para cualquier entero no negativo n.
24 CAP
ON Y RECURSI
ON
TEOREMA 1 El algoritmo 1 produce como salida el valor de n!, n 0
Paso Base. (n = 0). Ya hemos observado que si n = 0, el algoritmo produce
correctamente como salida el valor de 1 0!.
Paso Inductivo . Supongamos que el Algoritmo 1 produce correctamente
como salida el valor de (n 1)! para n > 0. Ahora supongamos que n
es la entrada del Algoritmo 1. Como n es mayor que 0, al ejecutar el
procedimiento en el Algoritmo pasamos a la lnea 4. Por la hipotesis de
induccion, el procedimiento calcula correctamente el valor de (n 1)!.
En la lnea 4, el procedimiento calcula correctamente el valor (n1)!
n = n!. Por tanto el Algoritmo 1 produce correctamente como salida el
valor de n! para cada entero n 0.
Deben existir casos en los que un procedimiento recursivo no se llame
a si mismo: en caso contrario, se llamara a s mismo por siempre. En el
Algoritmo 1, si n = 0, el procedimiento no se llama a s mismo. Los valores
para los cuales un procedimiento recursivo no se llama a s mismo, son los
casos bases. Para resumir, cada procedimiento recursivo debe tener al menos
un caso base.
Se ha mostrado que la inducci on matematica puede utilizarse para de-
mostrar que un algoritmo recursivo calcula el valor que arma calcular. El
vnculo entre la induccion matem atica y los algoritmos es mucho mas pro-
fundo. Con frecuencia, una demostracion por inducci on matem atica puede
considerarse como algoritmo para calcular un valor o realizar una construc-
ci on particular. El paso base de una demostracion por inducci on matem atica
corresponde al caso base de un procedimiento recursivo y el paso inductivo
de una demostraci on corresponde a la parte de un procedimiento recursivo
donde se llama a si mismo.
1.3.2. Maximo com un divisor
El Teorema ?? establece que si a es un entero no negativo, b es un entero
positivo y a = bq + r, 0 r < b, entonces
mcd(a, b) = mcd(b, r) (1.9)
mcd(x, y) denota el m aximo com un divisor de x, y. De manera inherente
la ecuaci on 1.9 es recursiva; reduce el problema de calcular el maximo com un
1.3. DEFINICIONES Y FUNCIONES RECURSIVAS 25
divisor a y b a un problema menor, el de calcular el m aximo com un divisor
de b y r. El algoritmo recursivo 2, que calcula el maximo com un diviso, se
basa en la ecuaci on 1.9.
Algoritmo 2 C alculo recursivo del m aximo com un divisor
Entrada: q y b enteros positivos mayores o igual con 0
Salida: M aximo com un divisor de a y b
1: mcd(a, b)
2: //se hace que a sea el n umero mayor de a, b
3: si a < b entonces
4: intercambiar(a, b)
5: n si
6: si b = 0 entonces
7: devolver a
8: n si
9: dividir a entre b para obtener a = bq + r, 0 r < b
10: devolver mcd(b, r)
1.3.3. Caminata Rob otica
Un robot puede dar pasos de 1 y 2 metros. Escribir un algoritmo para el
c alculo del n umero de formas en que el robot puede recorrer n metros. Por
ejemplo:
Distancia Serie de pasos N umero de formas de recorrerlos
1 1 1
2 1,1 o 2 2
3 1,1,1 o 1,2 o 2,1 3
4 1,1,1,1 o 1,1,2 5
1,2,1 o 2,1,1 o 2,2
Sea walk(n) el n umero de formas en el que el robot puede recorrer n
metros. Puede observarse que
walk(1) = 1 walk(2) = 2
26 CAP
ON Y RECURSI
ON
Suponiendo que n > 2. El robot pude comenzar dando un paso de 1 metro
o un paso de 2 metros. Si el robot comienza dando un paso de 1 metro, resta
una distancia de n 1 metros, pero por denici on, el resto de la caminata
puede completarse en walk(n 1) formas. De manera an aloga, si el robot
comienza dando un paso de 2 metros, resta una distancia de n 2 metros y,
en este caso el resto de la caminata puede concluirse en walk(n 2) formas.
Como la caminata debe comenzar con un paso de 1 o de 2 metros, se han
abarcado todas las formas de recorrer n metros. Se obtiene la formula
walk(n) = walk(n 1) + walk(n 2)
Por ejemplo,
walk(4) = walk(3) + walk(2) = 3 + 2 = 5
Podemos escribir un algoritmo recursivo para calcular walk(n) traducien-
do la ecuaci on walk(n) = walk(n 1) + walk(n 2) directamente en un
algoritmo. Los caso bases son n = 1 y n = 2.
El algoritmo calcula la funci on denida como
walk(n) =
1 si n = 1
2 si n = 2
walk(n 1) + walk(n 2) si n > 2
Algoritmo 3 Caminata de un robot
Entrada: n,
Salida: walk(n)
1: robot walkl(n)
2: si n = 1 o n = 2 entonces
3: devolver n
4: n si
5: devolver robot walkl(n 1) + robot walkl(n 2)
La sucesi on walk(1), walk(2), walk(1), ..., cuyos valores comienzan con
1, 2, 3, 5, 8, 13, ..., es llamada sucesi on de Fibonacci en honor a Leonardo
Fibonacci (hacia 1170-1250), comerciante y matematico italiano. En lo su-
cesivo denotaremos la sucesi on de Fibonacci como f
1
, f
2
, . Esta sucesion
queda denida mediante la ecuaciones
1.3. DEFINICIONES Y FUNCIONES RECURSIVAS 27
f
1
= 1
f
2
= 2
f
n
= f
n1
+ f
n2
, n > 2
1.3.4. Torres de Hanoi
Las torres de Hanoi son un juego inventado en la decada de los 80s por
Edouard Lucas, un matem atico frances. La soluci on a este juego constituye
una ilustracion de la utilidad de la recursion.
El juego consta de 3 varillas verticales (que representan las torres) y
un conjunto de discos agujerados en su parte central, lo que les permite
deslizarse por las varillas. Cada uno de los discos tiene un di ametro distinto.
Inicialmente, todos los discos est an apilados en una de las varillas por orden
de tama no, de modo que el disco de mayor diametro se encuentra en la parte
inferior, como se muestra en la Figura ??.
El objetivo del juego consiste en mover todos los discos desde la varilla
original (la primera ) hasta la varilla destino (la tercera). Se puede utilizar
la varilla adicional como lugar para colocar temporalmente los discos, pero
es necesario seguir las siguiente tres reglas :
1. Solo es posible mover un disco cada vez
2. No puede ponerse un disco sobre otro de menor tama no.
3. Todos los discos deben encontrarse en todo momento en una de las
varillas, salvo el disco que estemos moviendo de una varilla a otra.
Estas reglas implican que debemos tratar de quitar de en medio los discos
mas peque nos para poder mover un disco de mayor tama no de una varilla a
otra. La gura 1.2 muestra la solucion paso a paso para el caso de tres discos
de la primera varilla a la tercera, primero tenemos que alcanzar un punto
en que los dos discos mas peque nos hayan sido apartados, colocandolos en
la segunda varilla, para poder as mover el disco de mayor tama no desde la
primera varilla a la tercera.
Los primeros tres movimientos mostrados en la Figura 1.2 pueden consi-
derarse como los movimientos necesarios para apartar del camino los discos
de menor di ametro. El cuarto movimiento coloca el disco de mayor tama no en
su destino nal, los ultimos tres movimientos colocan los discos m as peque nos
en su destino nal, sobre el disco de mayor diametro.
28 CAP
ON Y RECURSI
ON
Solucin para 3 discos
Segn la leyenda, los monjes de un templo tenan que mover una pila de 64
discos sagrados de un sitio a otro. Slo podan mover un disco al da y, en el
templo, slo haba otro sitio en el que podan dejarlos, siempre ordenados de
forma que los mayores quedasen en la base.
El da en que los monjes realizasen el ltimo movimiento,
el final del mundo habra llegado
Figura 1.2: Secuencia de movimientos parar 3 discos
1.3. DEFINICIONES Y FUNCIONES RECURSIVAS 29
La idea anterior se utiliza para construir una estrategia general. Para
mover una pila de N discos desde la varilla original a la varilla destino:
Hay que mover los N 1 discos situados en la parte superior desde la
varilla original hasta la varilla temporal, utilizando la varilla destino
como temporal
Hay que mover el disco de mayor tama no desde la varilla original a la
varilla destino
Hay que mover los N 1 discos de la varilla temporal hasta la varilla
destino, utilizando la varilla original como temporal.
Esta estrategia se presenta de forma obvia en la implementaci on de una
soluci on recursiva. El paso consiste en mover los N1 discos para apartarlos
del camino es el mismo problema, conceptualmente hablando, que se tiene
en el instante de partida: desplazar la pila de discos. Sin embargo, para
esta tarea tenemos un disco menos, y la varilla de destino es utilizada como
varilla temporal. Una situacion analoga se produce despues de haber movido
el disco de mayor tama no, ya que tenemos que volver a mover los N 1
discos originales.
El caso base para este problema se produce cuando se quiere desplazar
una pila constituida por un solo disco. Dicho paso pude llevarse a cabo di-
rectamente y sin necesidad de recursion.
El Algoritmo 4 considera primero el caso base (una pila de un disco).
Cuando se produce este caso, ejecuta la lnea 3, que imprime una unica lnea
que describe el movimiento. Si la pila contiene mas de un disco, se invoca
de nuevo moveTower (en la lnea 5) para apartar los N 1 discos, luego se
mueve el disco de mayor tama no (lnea 6) y despues los N 1 discos hasta
su destino nal con otra llamada a moveTower (lnea 7).
Observe que los parametros que se pasan a moveTower para describir las
varillas se intercambian seg un es necesario para desplazar las pilas parciales
de discos. El Algoritmo 4 se ajusta a la estrategia general y utiliza moveTower
para desplazar todas las pilas parciales de discos.
La simulaci on para N = 3 est a dada por la Tabla 1.3.
En las Torres de Hanoi, el tama no del juego est a dado por el n umero de
discos, y las operaciones de procesamiento relevantes es le paso que consiste
en mover un disco de una varilla a otra. Cada llamada en el algoritmo 4
hace que se mueva un disco, Desafortunadamente, salvo en el caso base, cada
30 CAP
ON Y RECURSI
ON
Algoritmo 4 Secuencia de movimientos para el juego de Torres de Hanoi
Entrada: n, n umero de discos a mover, la funci on de cada varilla origen,
destino y temporal ,
Salida: Imprime la secuencia de movimientos para mover n discos de la
varilla origen hasta la destino
1: moveTower(n, origen, destino, temporal )
2: si n = 1 entonces
3: Imprimir mover un disco de origen a destino
4: si no
5: moveTower(n 1, origen, temporal , destino)
6: Imprimir mover un disco de origen a destino
7: moveTower(n 1, temporal , destino, inicio)
8: n si
Cuadro 1.3: Simulacion para las Torres de Hanoi con N = 3
mT(1, o, d, t) Mover disco de Origen a Destino
mT(2, o, t, d) Mover disco de Origen a Temporal
mT(1, d, t, o) Mover disco de Destino a Temporal
mT(3, o, d, t) Mover disco de Origen a Destino
mT(1, t, o, d) Mover disco de Temporal a Origen
mT(2, t, d, o) Mover disco de Temporal a Destino
mT(1, o, d, t) Mover disco de Origen a Destino
llamada recursiva hace que el metodo se invoque a si mismo el doble de veces,
y cada llamada opera sobre una pila de discos que s olo tiene un disco menos
que el problema que se pasa como par ametro. Por tanto si ejecutamos el
procedimiento moveTower para 1 disco, se producira el desplazamiento de
un disco; si ejecutamos moveTower para 2, se producira el desplazamiento
de 3 discos; si ejecutamos moveTower para 3, se producira el desplazamiento
de 7 discos; si invocamos moveTower para 4 se producir a el desplazamiento
de 15 discos, etc. Dicho de otro modo, si f(n) representa el crecimiento del
problema, entonces:
f(n) = 1 cuando n = 1
para n > 1, f(n) = 2 (f(n 1) + 1)
= 2
n
1
En contraste con su implementacion breve y elegante, la soluci on es muy
1.4. ALGORITMOS DE ORDENAMIENTO 31
ineciente, ya que para resolver un juego con una pila de N discos, se tienen
que realizar 2
n
1 movimientos de discos individuales.
1.4. Algoritmos de ordenamiento
El ordenamiento es una tarea com un que realizamos continuamente. Or-
denar es algo tan com un que no nos detenemos a pensar en ello. Ordenar es
simplemente colocar informacion de una manera especial bas andonos en un
criterio de ordenamiento.
En la computacion el ordenamiento de datos tiene una funcion muy im-
portante, ya sea como un n en s o como parte de otros procedimientos mas
complejos. Se han desarrollado muchas tecnicas en este ambito, cada una
con caractersticas especcas, y con ventajas y desventajas sobre las dem as.
En esta seccion se revisaran algunos de los algoritmos de ordenamiento mas
comunes.
1.4.1. conceptos preliminares
Clave : La parte de un registro por la cual se ordena la lista. Por ejemplo,
una lista de registros con campos nombre, direcci on y telefono se puede
ordenar alfabeticamente de acuerdo a la clave nombre. En este caso los
campos direcci on y telefono no se toman en cuenta en el ordenamiento.
Criterio de ordenamiento (o de comparaci on): El criterio que se utiliza
para asignar valores a los registros con base en una o mas claves. De
esta manera decidimos si un registro es mayor o menor que otro.
Registro : Un grupo de datos que forman la lista. Pueden ser datos at omicos
(enteros, caracteres, reales, etc.) o grupos de ellos, que en Java equivalen
a objetos y en C a estructuras.
En el an alisis de algoritmos de todo tipo, no s olo de ordenamiento, se
debe tener una forma de evaluarlos antes de programarlos, que se base en
aspectos independientes de la plataforma y el lenguaje. De esta manera es
posible decidir cu al se adapta mejor a los requerimientos del sistema. Los
siguientes aspectos son los mas comunes:
Estabilidad : Como se comporta con registros que tienen claves iguales. A
los algoritmos que mantienen el orden relativo entre estos se les llama
32 CAP
ON Y RECURSI
ON
estables y no estables a los que no lo mantienen. Por un ejemplo. Si se
tiene la siguiente lista de datos (letra, n umero): [(J,19), (A,5), (B,9),
(C,4), (B,8), (Z,4), (J,0)] se ordena alfabeticamente por la letra con un
algoritmo estable quedara as: [(A,5), (B,9), (B,8), (C,4), (J,19), (J,0),
(Z,4)]. Un algoritmo no estable podra dejar a (B, 8) antes de (B,9) o
(J,0) antes que (J,19).
Tiempo de ejecucion : La complejidad del algoritmo, la cual tiene que ver
con rendimiento. Es una funci on independiente de la implementacion.
En este caso se tiene que identicar una operaci on fundamental que
realice el algoritmo, en el caso del ordenamiento comparaciones. Se
cuenta las veces el algoritmo necesita comparar. Si en una lista de
n terminos se realizan n comparaciones la complejidad es O(n). (En
realidad m as complicado que eso, pero en este curso se considera as, un
an alisis m as profundo es parte de un curso de An alisis de Algoritmos).
Algunos ejemplos de complejidades comunes son:
O(1): Complejidad constante.
O(n): Complejidad cuadratica.
O(nlog(n)): Complejidad logartmica.
On
2
: Complejidad cuadratica
Es posible decir que un algoritmo de complejidad O(n) es mas rapido
que uno de complejidad O(n
2
). Otro aspecto a considerar es la dife-
rencia entre el peor y el mejor caso. Cada algoritmo se comporta de
modo diferente de acuerdo a c omo se le entregue la informacion; por
eso es conveniente estudiar su comportamiento en casos extremos, como
cuando los datos est an pr acticamente ordenados o muy desordenados.
Requerimientos de memoria : El algoritmo puede necesitar memoria adi-
cional para realizar su labor. En general es preferible que no sea as,
pero es com un en la programacion tener que sacricar memoria por
rendimiento.
1.4.2. Ordenamiento de Burbuja (BubbleSort)
Este es probablemente el algoritmo m as sencillo. Consiste en iterar repe-
tidamente la lista, comparando elementos los adyacentes de dos en dos. Si un
elemento es mayor que el que esta en la siguiente posici on se intercambian.
1.4. ALGORITMOS DE ORDENAMIENTO 33
La estrategia general del metodo es la siguiente: explorar la lista com-
parando los elementos adyacentes e intercambi andolos sino est an en orden
relativo. Esto tiene el efecto de que el elemento de mayor valor se desplace
como una Burbuja hasta la ultima posici on de la lista, que es la posici on
que le corresponde dentro de la lista nal ordenada. A continuaci on se repite
la operacion, haciendo que se desplace el segundo valor mas grande. Este
proceso continua hasta que se hayan desplazado todos los elementos a sus
posiciones correctas.
Cada pasada el algoritmo de la burbuja hace que se desplace el valor
m as grande a si posici on nal. A lo largo de una iteraci on, tambien pueden
reposicionarse otros elementos. Por ejemplo, si comenzaramos con la lista:
9 6 8 12 3 1 7
primero se compararan el 9 y el 6 y, como no est an en el orden correcto,
se intercambian con lo que quedara:
6 9 8 12 3 1 7
Despues se compara el 9 con el 8 y, de nuevo al ver que no est an en orden,
se intercambian obteniendose:
6 8 9 12 3 1 7
Luego se compara el 9 con el 12. Puesto que ya est an en orden correcto,
no se intercambian. En lugar de ello, se toma la siguiente pareja de valores
para compararlos, es decir, se compara el 12 con el 3. Puesto que no estan
en el orden correcto, se intercambian obteniendo:
6 8 9 3 12 1 7
A continuaci on se compara el 12 con el 1 y se intercambian, quedando:
6 8 9 3 1 12 7
Despues comparamos el 12 con el 7 y se intercambian nuevamente, con
lo que se obtiene:
6 8 9 3 1 7 12
Esto completa una iteracion a traves de los datos que hay que ordenar.
Despues de esta primera iteraci on el valor de mayor de la lista se encuentra
en la posicion correcta, pero no es posible asegurar lo mismo de los n umeros
restantes. Cada iteraci on subsiguiente garantiza que se ponga en la posici on
correcta otro elemento mas. Por tanto tendremos que hacer n1 iteraciones,
por que cuando se tienen n1 elementos en la posici on correcta el elemento
n tambien estara en la posici on correcta.
El algoritmo 5 implementa el ordenamiento mediante el metodo de bur-
buja. Del algoritmo 5 puede observarse en la lnea 4 que el debemos iterar
n veces los datos para poder asegurar que los n elementos terminan en su
34 CAP
ON Y RECURSI
ON
posicion correcta. En la lnea 5 observamos que solo es necesario comparar
hasta lo posicion n i (el 1 es debido a que solo podemos compara hasta
el elemento n1 con es n) ya que despues de la i-esima iteraci on los ultimos
i elementos ya estar an ordenados.
Algoritmo 5 Ordenamiento de burbuja
Entrada: A, un arreglo desordenado y n n umero de elementos en A
Salida: ordena A
1: bubbleSort(A, n)
2: para i = 0 hasta n hacer
3: para j = 0 hasta n 1 i hacer
4: si A[j]A[j + 1] entonces
5: aux = A[j]
6: A[j]=A[j + 1]
7: A[j + 1]= aux
8: n si
9: n para
10: n para
Analizando el algoritmo 5 la complejidad esta dada por los dos ciclos
presentes. Cuando i = 0 debemos realizar n 1 operaciones, cuando i = 1,
n2 y as sucesivamente. De lo anterior es posible observar que la complejidad
(n umero de operaciones necesarias) esta dada por (n 1) + (n 2) + (n
3) + + 1 como ya se demostro en la secci on 1.2 es sumatoria est a dada
por la funci on (n 1)(n 2)/2 = n
2
n + 2 lo cual es O(n
2
), por tanto el
algoritmo de burbuja es de orden cuadr atico.
1.4.3. Ordenamiento de por mezcla (MergeSort)
El algoritmo de ordenamiento por mezcla, es un algoritmo recursivo, el
cual ordena una lista dividiendo recursivamente la lista en dos mitades hasta
que cada sublista tiene un elemento, y luego combina las sublistas en orden.
La estrategia general del algoritmo por mezcla es la siguiente: se comienza
dividiendo la lista en dos partes aproximadamente iguales y luego se invoca
recursivamente el mismo algoritmo de ordenamiento para cada una de esa
lista, Esta descomposici on recursiva de la lista continua hasta alcanzar el
caso base de la recursion, que es el caso en que se tienen listas de longitud
uno, que estar an por denici on ordenadas. A continuaci on, a medida que
1.4. ALGORITMOS DE ORDENAMIENTO 35
se devuelve el control hacia arriba a traves de la estructura recursiva de
llamadas, el algoritmo va mezclando es una unica lista ordenada las dos
sublistas ordenadas resultantes de las dos llamadas recursivas.
Por ejemplo, si se hubiera comenzado con la lista inicial [9.6,7,30,12,11,8],
la parte de descomposici on recursiva del algoritmo nos dara los resultado que
se muestran en la Figura 1.3.
! " # $%&'&&(
Figura 1.3: Descomposici on del algoritmo de ordenamiento por mezcla
La parte de la mezcla del algoritmo recombinara a continuaci on la lista
como se muestra en la Figura 1.4
! " # $ %%%& '(
Figura 1.4: Parte de mezclado del algoritmo de ordenamiento por mezcla
Para realizar un analisis de complejidad (simple), suponemos que n es una
potencia de 2, por tanto n puede expresarse como n = 2
x
y de la denicion del
logaritmo tenemos que log
b
(n) = x n = b
x
, con lo anterior podemos
deducir que el n umero maximo de sublista es x = log
2
(n) y cada una de
36 CAP
ON Y RECURSI
ON
las log
2
(n) se tienen que realizar n operaciones de mezcla, de lo anterior es
posible deducir que se tienen que mezclar log
2
(n) los n elemento de la lista,
por lo que la complejidad esta dada por nlog
2
(n) es decir es O(log
2
(n)).
El algoritmo de ordenamiento, en este caso lo describimos como dos fun-
ciones, una que representa el ordenamiento y otra para el mezclado de las
sublistas. La funcion de ordenamiento est a dada por el Algoritmo 6 y la de
mezclado por Algoritmo 7.
Algoritmo 6 Ordenamiento de mezcla
Entrada: A[], un arreglo desordenado y min ndice donde inicia la sublista
y max ndice donde termina la sublista
Salida: A
o
[] lista ordenada
1: mergeSort(A)
2: n = longitud(n)
3: si n = 1 entonces
4: devolver A
5: n si
6: L
1
=A[1],A[2], , A[n/2]
7: L
2
=A[n/2 + 1],A[n/2 + 2], , A[n]
8: mergesort(L
1
)
9: mergesort(L
2
)
10: devolver merge(L
1
, L
2
)
1.4.4. Ordenamiento rapido (QuickSort)
El Algoritmo QuickSort ordena una lista dividiendo una lista mediante
un elemento de particion elegido arbitrariamente y luego ordenando recursi-
vamente las sublistas situadas a ambos lados del elemento de partici on. La
estrategia general del algoritmo es la siguiente: en primer lugar, se seleccio-
na un elemento de la lista para que act ue como elemento de particion; a
continuacion, se parte la lista en de forma que todos los elementos menores
que el elemento de partici on se encuentren a la izquierda de dicho elemento,
mientras que los mayores se ubiquen a la derecha; nalmente, se aplica esta
estrategia (recursivamente) a ambas particiones.
La seleccion del elemento de partici on es arbitraria, as que para este ca-
so se utiliza el primer elemento de la lista. Por razones de eciencia, sera
1.4. ALGORITMOS DE ORDENAMIENTO 37
Algoritmo 7 Funcion de mezcla de sublistas
Entrada: A y B arreglos ordenados
Salida: C mezcla de A y B
1: merge(A, B)
2: i = 0
3: j = 0
4: n = longitud(A)
5: m = longitud(B)
6: mientras i < n && j < m hacer
7: si A[i]> B[j] entonces
8: C[i + j]=B[j]
9: j = j + 1
10: si no
11: C[i + j]=A[i]
12: i = i + 1
13: n si
14: n mientras
15: mientras i < n hacer
16: C[i + j]=A[i]
17: i = i + 1
18: n mientras
19: mientras j < m hacer
20: C[i + j]=B[j]
21: j = j + 1
22: n mientras
23: devolver C
38 CAP
ON Y RECURSI
ON
conveniente que el elemento de partici on dividiera la lista aproximadamen-
te en dos mitades, pero el algoritmo funciona igual independientemente de
que elemento se seleccione para realizar la particion.
Examinemos un ejemplo. Si comenz aramos con la siguiente lista:
9 6 7 30 12 11 8
se elegira 9 como el elemento de particion. Despues se reordena la lista,
intercambiando los elementos que sean menores de 9 para situarlos del lado
izquierdo y situando los mayores del lado derecho, con lo que resulta:
8 6 7 9 12 11 30
Despues se aplica el algoritmo de ordenamiento por separado a ambas
particiones. Este proceso continua hasta que una particion solo contenga
un elemento, que estar a inherentemente ordenado. As despues de aplicar el
algoritmo recursivamente en ambos lados, la lista entera estar a ordenada.
Una vez determinado y colocado el elemento de particion inicial, no se le
vuelve a tener en cuenta ni a desplazar.
El Algoritmo 8. Recibe como par ametros un arreglo y los valores de los
ndices m aximo (min) y mnimo (max) de los elementos del arreglo por or-
denar. Al inicio del algoritmo, los valores min y max abarcan todo el arreglo
de elementos.
Algoritmo 8 Ordenamiento r apido
Entrada: A[], un arreglo desordenado y min ndice donde inicia la sublista
y max ndice donde termina la sublista
Salida: No regresa nada, ordena A en sitio.
1: quickSort(A, min, max)
2: si max min > 0 entonces
3: pivote = findPartition(A, min, max)
4: quickSort(A, min, pivote 1)
5: quickSort(A, pivote + 1, max)
6: n si
El Algoritmo ?? se basa en el metodo ndPartition, al que llama para di-
vidir el arreglo en dos particiones. El metodo ndPartition devuelve el ndice
(pivote) del valor de la partici on. Entonces, entonces quickSort se llama dos
veces (recursivamente) para ordenar las dos particiones resultantes. El caso
base de la recursion, representado por la instruccion IF del metodo quickSort,
es cuando se tiene una lista de un elemento o menos, que estara inherente-
mente ordenada. El Algoritmo que determina el ndice pivote se muestra a
1.4. ALGORITMOS DE ORDENAMIENTO 39
continuacion (ver Algoritmo 9):
Algoritmo 9 Funcion que encuentra el elemento de partici on
Entrada: A[], un arreglo desordenado y min ndice donde inicia la sublista
y max ndice donde termina la sublista
Salida: rigth ndice de la partici on
1: ndPartition(A, min, max)
2: left = min
3: right = max
4: partitionElement = A[min]
5: mientras left < right hacer
6: mientras A[left]< partitionElement hacer
7: left = left + 1
8: n mientras
9: mientras A[rigth]> partitionElement hacer
10: rigth = right 1
11: n mientras
12: si left < right entonces
13: temp = A[left]
14: A[left]= A[right]
15: A[right]= temp
16: n si
17: n mientras
18: temp = A[min]
19: A[min]= A[right]
20: A[right]= temp
21: devolver right
Los dos ciclos WHILE internos del metodo ndPartition se utilizan para
encontrar los elementos que se encuentran en las particiones incorrectas e
intercambiarlos. El primero de los ciclos explora de izquierda a derecha bus-
cando un elemento que sea mayor que el elemento de partici on. El segundo
ciclo explora de derecha a izquierda buscando un elemento que sea menor
el elemento de particion. Una vez encontrados los dos elementos, se inter-
cambian. Este proceso continua hasta que los ndices derecho e izquierdo se
encuentran en el medio de la lista. La ubicacion en la que se encuentran
tambien indica d onde debe situarse elemento de partici on (que no se mueve
de su posici on hasta el nal).
40 CAP
ON Y RECURSI
ON
1.5. Ejercicios
1. En los siguiente ejercicios utilice inducci on para vericar que cada ecua-
ci on es verdadera
a) 1 + 2 + 5 + . . . + 2(n 1) = n
2
b) 1 2 + 2 3 + 3 4 + . . . + n(n + 1) =
n(n+1)(n+2)
3
c) 1
2
2
2
+ 3
2
+ . . . + n
2
=
n(n+1)(2n+1)
6
2. En los siguiente ejercicios utilice induccion para vericar la desigualdad
a) 2n + 1 2
n
, n = 3, 4, . . .
b) 2
n
n
2
, n = 4, 5, . . .
c) (1 + x)
n
1 + nx, para x 1 y n = 1, 2, . . .
3. En los siguiente ejercicios utilice induccion para demostrar cada ar-
maci on
a) 7
n
1 es divisible entre 6, para n = 1, 2, . . .
b) 3
n
+ 7
n
2 es divisible entre 8, para n = 1, 2, . . .
c) Mostrar que cualquier tarifa postal de 5 centavos o m as puede
cobrarse utilizando solo estampillas de 2 y 5 centavos.
d) Mostrar que cualquier tarifa postal de 24 centavos o mas puede
cobrarse utilizando solo estampillas de 5 y 7 centavos.
4. Proporcione un algoritmo que invierta un n umero decimal(sin conver-
tirlo a cadena) solo utilizando operaciones aritmeticas.
5. Proporciones versiones iterativas y recursivas de algoritmos que solu-
ciones los siguientes problemas.
6. Escriba una denicion recursiva para la multiplicacion entera n*m para
n > 0. Dena la multiplicaci on en terminos de la suma de enteros. Por
ejemplo 3*4 es igual a sumar 3 el 4.
7. De un algoritmo recursivo para la division entera n/m para m > 0.
Dena la divisi on en terminos de la resta de enteros.
1.5. EJERCICIOS 41
8. Escriba un algoritmo recursivo que calcule el resto de la divisi on n%m
para m > 0 (ej. si n = 5 y m = 3 5 %3 = 2).
a) Se ha depositado en una instituci on bancaria un monto de capital
m por el cual se recibe un X % de interes anual. El problema
consiste en determinar el capital que se tendr a al cabo de n meses.
Recuerde que para el algoritmo recursivo debe establecer los casos
base y recursivo del problema.
b) Dados como datos dos n umeros enteros positivo A y B, escriba
un programa calcule A
B
.
c) Escriba un programa que, dado como dato un n umero entero po-
sitivo regrese 1 si todos los dgitos de dicho numero son pares y 0
en otro caso.
d) Dado un arreglo de enteros, dise nar algoritmos que calculen :
El mayor elemento del arreglo.
La suma de los elementos del arreglo.
La media de los elementos del arreglo.
e) Escriba un programa que invierta el orden de los elementos de
un arreglo de n n umeros enteros. Es decir que el elemento den
la posicion n se intercambie con el de la posici on n, el 2 con la
posici on n-2 y as sucesivamente.
f ) Proporcione un algoritmo que busque el valor X en un arreglo de
enteros ordenado de forma decreciente.
g) Escriba un programa que dado un arreglo de n elementos(n debe
ser par) , determine si las sumas de las dos mitades ( del elemento
0 a (n 1)/2 y del elemento (n 1)/2 + 1an 1) son iguales.
h) Escriba un metodo que dado un vector contar el n umero de veces
que aparece un termino X.
i ) Dise ne un algoritmo que dado un entero n determine si es pri-
mo (recuerde que los n umeros primos son aquellos que solo son
divisibles entre ellos mismos y la unidad).
9. Denir el/los caso(s) base y recursivo para determinar si una cadena es
o no un palndromo. Los palndromos son palabras, n umeros o frases
que se lee igual hacia adelante que hacia atras(ana, 00100, 0110, etc).
42 CAP
ON Y RECURSI
ON
10. Dado el siguiente programa analizarlo y decir que imprime para los
siguientes valores de x: x = 38, x = 51, x = 24
public P1(int x){
if (x>100)
System.out.println(x-8);
else{
System.out.println(x+9);
P1(x+9);
}
}
11. Dada la siguiente lista: [90 8 7 56 13 23 9]. Muestre la ejecucion para
los siguientes algoritmos:
a) ordenamiento de la burbuja
b) ordenamiento por mezcla
c) ordenamiento rapido
12. Diga cuantas comparaciones realizar an para el arreglo [1,2,3,4,5,6] los
siguientes algoritmos de ordenamiento: mergesort, quick sort utilizando
como pivote al primer elemento, quick sort utilizando pivote el ultimo
elemento y el oredenamiento de burbuja. Explique sus respuestas.
13. Modique los algoritmos de ordenamiento presentados en el captulo
(burbuja, mezcla y r apido) a nadiendo c odigo a cada uno de los metodos
con el n de contar el n umero total de comparaciones y del tiempo
total de ejecuci on de cada algoritmo. Ejecute los diversos algoritmos de
ejecuci on con los mismos datos de entrada, registrando el n umero total
de comparaciones y el tiempo de ejecuci on. Repita la prueba n veces
(n = 100) para listas de 10,100,200, 300 hasta 1000, es decir aplicar
el proceso de ordenamiento 100 veces sobre una lista de 10, luego 100
veces sobre una lista de 100 y as sucesivamente, obtener el promedio
de las n ejecuciones y gracar el promedio contra el la longitud de la
lista.
Nota: Cada lista se debe generarse de manera aleatoria, es decir 100
listas generadas aleatoriamente para cada caso (e.j 100 listas de 10 ...).
Captulo 2
El modelo de datos de listas
2.1. Introduccion
Frecuentemente utilizamos el concepto de lista. Es muy com un hacer lis-
tas de compras, lista de tareas pendientes o listas de invitados a una esta.
Las listas suelen estar enumeradas y ordenadas de acuerdo a alg un crite-
rio. En esta secci on analizaremos el modelo de datos de listas, as como la
impelentaci on de las operaciones b asicas.
2.2. Implementaci on del modelo de Listas li-
gadas
Las estructura de datos se implementa mediante el uso de referencias
para crear enlaces entre objetos. Est a solucion tiene ventajas y desventajas
respecto a soluciones equivalentes haciendo uso de arreglos.
Las listas ligadas implementadas utilizan variables de referencia a objetos
con el n de crear enlaces entre objetos. Recuerde que con una variable de
referencia a objeto almacena la direcci on del objeto, que indica donde esta ese
objeto almacenado en memoria.
Usualmente, una variable de referencia a objeto es solo importante para
poder accede a un objeto, pero generalmente no tiene ninguna importancia
que ubicaci on especca en memoria ocupe el objeto. Por tanto, en vez de
mostrar direcciones normalmente se muestran las variables de referencia como
nombres que apuntan a un objeto(ver Figura 2.1).
43
44 CAP
Esta es una solucion correcta pero muy ineciente. Por ejemplo, si dos
cadenas no contienen ning un caracter en com un, entonces siempre ocurre el
caso recursivo 2, y si las longitudes de ambas cadenas son n se obtiene una
complejidad de 2
n
.
2.5.2. top-down
El problema con la solucion recursiva es que el mismo subproblema es
resuelto muchas veces. Un subproblema consiste en todas las llamadas re-
cursivas a LCS, con los sujos de A y B, entonces existen exactamente
2.5. IMPLEMENTACI
Atomos
De manera formal, en la teora de conjuntos solo existen conjuntos, sin
embargo, en estructuras de datos o algoritmos es conveniente tener elementos
( atomos) que no sean conjuntos. Un atomo puede ser miembro de un con-
junto, pero no contener elementos. En ocasiones es necesario que los atomos
sean informacion compleja, por lo que un atomo puede ser una estructura o
un arreglo.
Denici on de Conjuntos por Comprensi on
Anteriormente se propuso que un conjunto debe ser denido enlistando
a todos sus miembros (denici on por extensi on), lo que puede llegar a ser
inconveniente. Para realizar una denicion por comprensi on de un conjunto
A se requiere de un conjunto S y, al menos, una regla o proposicion P, es
decir, todos los elementos del conjunto A deben pertenecer a S y cumplir
con P. Esto es
A = {x S P (x)}
o bien,
{A | x S P (x)}
Igualdad de Conjuntos
Un conjunto es igual a otro si ambos contienen exactamente a los mismos
elementos. Es decir, un conjunto A es igual a un conjunto B (escrito A = B)
si y solo si todos los elementos de A lo son de B y todos los elementos de B
son miembros de A. Por ejemplo,
{1, 2} = {x | x {1, 2, 3, } x < 3} = {2, 1}
Conjuntos Innitos
Algunos conjuntos tienen un n umero nito de elementos, por lo que se
puede establecer su cardinalidad con un n umero entero. Existen conjuntos
cuya cardinalidad es innita, que tienen un n umero innito de elementos, por
ejemplo los n umeros Naturales (N), Enteros (Z), Reales (R) y Complejos
(C).
3.1. DEFINICIONES B
Algebra de Conjuntos
En lo sucesivo S, T, y R son conjuntos no vacos y la equivalencia entre
expresiones se denota por .
Conmutatividad de la union. (S T) (T S),
Asociatividad de la union. (S (T R)) ((S T) R)
Conmutatividad de la interseccion. (S T) (T S)
Asociatividad de la interseccion. (S (T R)) ((S T) R)
Distributividad de la interseccion sobre la union. (S (T R)) ((S T) (S R))
Distributividad de la union sobre la interseccion. (S (T R)) ((S T) (S R))
Asociatividad de la union y la diferencia. (S (T R)) ((S T) R)
Distributividad de la diferencia sobre la union. ((S T) R) ((S R) (T R))
Identidad de la union.(S )
Idempotencia de la union. (S S) S
Idempotencia de la interseccion. (S S) S
Otras leyes del conjunto vaco. (S S) , ( S) , ( S)
3.1. DEFINICIONES B
ON 79
La b usqueda de las palabra paco, pocas y pago regresara la los conjuntos
0,2 ,0,1,2 y 2. Si buscamos la frase pocas copas paco , puede observarse que
la frase aparece en los textos T
0
y T
2
, pero solo aparece en le orden el mismo
orden en T
2
.
3.2.2. Trabajo
.
Programaci on
Implementar una estructura de datos basada en tablas hash, la cu al debe
cumplir los siguientes requisitos.
1. Cada elemento de la tabla debe ser una tupla constituida por la palabra
y una lista de los ndices de los textos en los que ocurre la palabra.
2. Proponer un conjunto de documentos (noticias, poemas, manuales,
rese nas de pelculas, etc) y crear su archivo de ndice invertido (En
est a parte tendran que procesar los documentos para generar los ndi-
ces).
3. Implementar b usqueda utilizando intersecci on de conjuntos
4. Proporcionar una interfaz para hacer consultas
Reporte tecnico
Presentar un reporte tecnico de su trabajo el cu al debera incluir los si-
guientes apartados.
1. Portada
2. Introduccion. Descripci on breve de los ndices invertidos y del conjunto
de documentos.
3. Desarrollo. Describir la estructura de datos a utilizar, el procesamiento
de los documentos y la implementacion de la b usqueda.
4. Conclusiones. Utilidad de lo que se hizo. Como se puede mejorar?
80 CAP
IA B
ASICA 83
4.1.3. Sub-arboles
En un arbol T un nodo n con todos sus descendientes propios, si es que
existen, se llama un sub-arbol de T.
4.1.4. Altura y Profundidad
En un arbol, la altura de un nodo n es la longitud del camino m as largo
desde el nodo n hasta una hoja; la altura del arbol es la altura del nodo raz.
La profundidad de un nodo n es la distancia entre la raz hasta n.
4.1.5.
Arboler Ordenados
Los nodos de un arbol pueden estar ordenados. Si m y n son hermanos
y m est a a la izquierda de n, entonces todos los descendientes de m estar an
a la izquierda de los descendientes de n. Para encontrar la relaci on de a la
izquierda entre cualesquiera nodos x y y, se debe seguir la ruta hasta un
antecesor com un y de ah conocer el orden.
z
m
n
x
y
Figura 4.2: Relaci on a la izquierda
4.1.6.
Arboles Etiquetados
Un arbol etiquetado es aquel que asocia una etiqueta o valor a cada uno
de sus nodos, puede ser algo simple como un n umero o caracter, o complejo
84 CAP
ON EN
ARBOLES 87
nuevamente la funci on para el nodo c
2
y as sucesivamente. Un ejemplo se
puede ver en el algoritmo 26.
Algoritmo 26 Recursividad en arboles - F(n)
Entrada: nodo n
1: pasos
1
2: F(c
1
)
3: pasos
2
4: F(c
2
)
5:
.
.
.
6: pasos
n
7: F(c
n
)
8: devolver informaci on
Evaluaci on de un arbol de expresiones
Existen distintas maneras de recorrer un arbol, lo que da como resultado
expresiones diferentes. Una de las formas de evaluar se llama evaluacion en
preorden, lo que se hace es realizar las operaciones relacionadas al nodo actual
primero y despues hacer una llamada recursiva con los nodos hermanos como
par ametro. A diferencia de la ejecuci on en preorden, la evaluacion en posjo
primero hace la llamada recursiva con los hermanos para despues realizar
las operaciones concernientes al nodo actual. A continuaci on se presenta la
prueba inductiva de la evaluacion de un arbol.
Base Una hoja produce un valor, que es el valor del nodo y representa al
sub- arbol del mismo.
Inducci on Suponga que se desea calcular el valor de la expresi on repre-
sentada por el sub-arbol con raz n. Se evaluaran las sub-expresiones
representadas por los sub- arboles cuyas races son los hijos c
1
y c
2
de
n. Los valores obtenidos son los operandos para el operador localizado
en el nodo n. Finalmente se aplica el operador a los operandos para
producir el valor de n.
88 CAP
ON EN
ARBOLES 89
Cuadro 4.1: Evaluaci on en Preorden
No. Resultado Operaci on No. Resultado Operaci on
1 preorden(+) 9 preorden(b)
2 + imprimir(+) 10 b imprimir(b)
3 preorden(a) 11 preorden(c)
4 a imprimir(a) 12 c imprimir(c)
5 preorden(*) 13 preorden(d)
6 * imprimir(*) 14 d imprimir(d)
7 preorden(-)
8 - imprimir(-)
Algoritmo 28 Evaluacion en Postorden - F(n)
Entrada: nodo n
1: hijo = n hijoMasIzquierda
2: mientras hijo no sea nulo hacer
3: F(hijo)
4: hijo = hijo hermanoDerecha
5: n mientras
6: evaluacion(n)
Cuadro 4.2: Evaluaci on en postorden
No. Resultado Operaci on No. Resultado Operaci on
1 posjo(+) 9 c imprimir(c)
2 posjo(a) 10 - imprimir(-)
3 a imprimir(a) 11 posjo(d)
4 posjo(*) 12 d imprimir(d)
5 posjo(-) 13 * imprimir(*)
6 posjo(b) 14 + imprimir(+)
7 b imprimir(b)
8 posjo(c)
90 CAP
USQUEDA BINARIOS 91
4.4.2. Recursion sobre
Arboles Binarios
Debido a que los apuntadores a hijos de un nodo en un arbol binario
tienen cierto orden, el recorrido del arbol
Algoritmo 30 Recursi on
Arbol Binario
Entrada: nodo
1:
.
.
.
2: recursion(hijoIzquierdo)
3:
.
.
.
4: recursion(hijoDerecho)
5:
.
.
.
4.4.3. Recurridos en Orden
En los arboles binarios, ademas de los recorridos en preorden y postorden,
se tiene un recorrido llamado en orden. En este tipo de recorridos se eval ua el
nodo actual despues de hacer la llamada recursiva al hijo izquierdo, pero antes
de llamar al hijo derecho. Recorriendo de esta manera el arbol se obtiene una
expresi on muy cercana a la expresi on en injo, para la Figura 4.5 se obtiene
a+b-c*d a la cual solo le hace falta un par de parentesis a+(b-c)*d.
Algoritmo 31 Evaluacion en Orden - F(n)
Entrada: nodo n
1: F(n hijoIzquierda)
2: evaluacion(n)
3: F(n hijoDerecha)
4.5.
Arboles de B usqueda Binarios
En m ultiples programas de c omputo se desea tener la posibilidad de
insertar, borrar y buscar elementos de un conjunto. En un vericador de or-
tografa se deseara insertar nuevas palabras o acr onimos como U.M.N.S.H.;
eliminar palabras en desuso o mal escritas por el usuario, o bien buscar si
92 CAP
USQUEDA BINARIOS 93
Algoritmo 33 Buscar en arbol binario
Entrada: dato, nodo
1: si nodo es nulo entonces
2: devolver nulo
3: n si
4: si dato es igual a nodo entonces
5: devolver nodo
6: n si
7: si dato es menor a nodo entonces
8: buscar(dato, nodo izquierda)
9: si no
10: buscar(dato, nodo derecha)
11: n si
Algoritmo 34 Eliminar en arbol binario
Entrada: dato, nodo
1: si nodo es nulo entonces
2: si dato es menor a nodo entonces
3: eliminar(dato, nodo izquierda)
4: si no, si dato es mayor a nodo entonces
5: eliminar(dato, nodo derecha)
6: si no
7: si nodo izquierda es nulo entonces
8: nodo = nodo derecha
9: si no, si nodo derecha es nulo entonces
10: nodo = nodo izquierda
11: si no
12: nodo etiqueta = minimo( nodo derecha )
13: eliminaMinimo( nodo derecha )
14: n si
15: n si
16: n si
17:
94 CAP
i
2
A
0
A
1
A
2
A
3
A
4
A
5
A
6
A
7
. . .
R
a
z
N
i
v
e
l
1
N
i
v
e
l
2
Figura 4.6: Heap B asico
Para insertar un elemento en el heap, se hace un procedimiento similar
al de inserci on en el POT, pero la implementaci on con un arreglo ayuda a
acceder directamente al elemento mas a la izquierda posible utilizando un
contador de elementos insertados (algoritmo 35).
Algoritmo 35 Inserta en heap
Entrada: arreglo, dato, contador
1: contador = contador + 1
2: arreglo [contador] = dato
3: empujaHaciaArriba(arreglo, contador)
Eliminar es un procedimiento similar al descrito en el apartado de los
arboles parcialmente ordenados (algoritmo 36).
96 CAP