Orientación A Objetos - Compressed PDF
Orientación A Objetos - Compressed PDF
e
Abstracción de datos
#
8
¿En que consiste la especificación lógica de un TDfl?
. @
Abstracción de datos
Las relaciones entre los elementos se dan, por ejemplo, cuando existe /
algún motivo para que un elemento esté antes o después que otro í /
(figura 1.1).
¿ <Í
A\ S$P* Vo ° 7
*, Relación de uno a uno Relación de uno a varios Relación de muchos a muchos No hay relación J
3. Dominio de la estructura.
Este punto es opcional, y en él se describirá la capacidad de la es
tructura en cuanto al rango posible de datos por guardar.
Q •
Ejemplo
¿£ Ejemplo
BORRAINICIO
..-"'*' UTILIDAD: Sirve para eliminar el primer carácter de una cadena.
ENTRADA: Cadena S sobre la que se desea eliminar el primer
carácter.
SALIDA: El carácter más a la izquierda de la cadena S y la
cadena S modificada.
PRECONDICION: La cantidad de caracteres es mayor que cero. •
POSTCONDICIÓN: La cadena S tiene todos los caracteres, menos el
primero.
AGREGAFINAL
UTILIDAD: Sirve para agregar un carácter al final de una cadena.
ENTRADA: Cadena S y el carácter L, que se añadirá a la
cadena S.
SALIDA: Cadena S modificada.
PRECONDICION: La cantidad de caracteres en S es menor que 80.
POSTCONDICIÓN: La cadena S tiene el carácter L que queda al
extremo derecho de la cadena.
I )
• —Q
Abstraccton de datos
( >
VACÍA
UTILIDAD: Sirve para verificar si una cadena está vacía o no.
ENTRADA: Cadena S que se verificará.
SALIDA: VERDADERO si la cadena S no tiene caracteres,
FALSO en caso contrario.
PRECONDICIÓN: Ninguna
• POSTCONDICIÓN: Ninguna (pues la cadena S no se modifica).
LLENA ..--'"
UTILIDAD: Sirve para verificar si una cadena está llena o no.
ENTRADA: cadena S que será verificada. y ^
SALIDA: VERDADERO si la cadena S contiene ya 80 /
caracteres, FALSO en caso contrario. / /
PRECONDICIÓN: Ninguna / /
POSTCONDICIÓN: Ninguna (pues la cadena S no se modifica).
INVIERTE
UTILIDAD: Sirve para invertir el orden de los caracteres en una
cadena. \
ENTRADA: Cadena S a la que se desea invertir el orden de los
caracteres. \ \
SALIDA: Cadena S modificada. \
PRECONDICIÓN: Ninguna
POSTCONDICIÓN: La secuencia de caracteres en la cadena S se \ \ .
invierte, de forma que el primer carácter toma el
lugar del último, el segundo el del penúltimo y así \ .
sucesivamente.
V J
Q •
¿Qué es la independencia de datos y el ocultamiento de información?
• 0
Abstracción de datos
Una analogía podría hacerse al comparar este proceso con el que se rea
liza al construir una casa (figura 1.2). Primero se trabaja en el nivel lógi
co al pedirle a un arquitecto que diseñe el plano; el arquitecto hace una
• abstracción y plasma en el papel los rasgos principales de la casa por
construir. Además, especifica claramente medidas y condiciones de cons
trucción y de uso. Una vez aprobado el diseño, se procede en el nivel
físico, que correspondería a la construcción. Los albañiles seguirán
paso a paso las especificaciones dadas en el plano (diseño en nivel lógi
co) y no tienen por que preguntar para ciué se utilizará cada uno de los -'' /
espacios construidos. Además, utilizarán el material más apropiado /
para cada situación. Una vez que la construcción esté terminada, He- /
gará su dueño para habitarla dándole el uso correspondiente a cada ■ /
espacio (nivel aplicación) El dueño al utilizar la casa no necesita sa- / /
ber cómo se hizo, con qué materiales o quiénes la construyeron- sin I
embargo, le será útil conocer algunas medidas o condicionen de
construcción que se representan en el plano (nivel lógico) i \
» \
f l I \ \ \
Nivel físico -*-■ Nivel lógico Nivel de aplicación V \ ^
v"^^" 1 —h J
Figura 1.2. Relación entre los niveles de abstracción.
ñ •
Ejemplo
"""'% Ejemplo
r
En cierta aplicación científica se requiere calcular el factorial de un 1
número entero positivo. La función factorial aplicada sobre un núme
ro es la multiplicación de todos los números, desde el 1 hasta el valor •
del número correspondiente ( n! = 1 * 2 * 3 * ... * (n-1) * n ).
Solución obvia en C+ + :
int factorial = 1;
for(intj = n;j>0;j-)
factorial = factorial* j ;
* y
* s
ESPECIFICACIÓN LÓGICA: \ I
- Elementos: un numeróte se compone de dígitos.
-Tipo de organización: los dígitos se organizan de manera lineal. \
- Dominio: se pretende que un numeróte pueda contener cualquier \
cantidad de dígitos bajo cualquier combinación. Sin embargo, se \
puede limitar a una capacidad máxima de mil dígitos. \
- Operaciones: las mismas que posee el tipo de dato entero.
OPERACIONES
SUMA
UTILIDAD: sirve para sumar dos numeróles.
ENTRADAS: dos numerotes
SALIDAS: un numeróte que guarda la suma de los dos
numerotes de entrada.
PRECONDICIÓN: Ninguna
POSTCONDICIÓN: El numeróte de salida contiene la suma
aritmética de los dos numerotes de entrada.
DESPLIEGA
UTILIDAD: Sirve para desplegar en pantalla un
numeróte.
ENTRADAS: Numeróte a desplegar.
SALIDAS: Ninguna (observa en pantalla)
PRECONDICIÓN: Ninguna
POSTCONDICIÓN: Ninguna
V )
Q •
Ejercicios
CONCLUSIONES
\ , En la evolución del desarrollo de software, se han descubierto una gran
""**\ \ cantidad de estructuras de datos, con propósitos firmes y claros, que no
\^ \ pierden actualidad y forman parte de las bases para cualquier futuro
\ \ desarrollador de software. El propósito de este material, es mostrar ca-
\ \ da una de estas estructuras en sus tres niveles de abstracción, por lo que
\ \ los capítulos posteriores, se vuelven el mejor ejemplo de las ideas mos-
\ \ tradas en este capítulo. Deben ser de especial interés los capítulos de
stnngs, pilas y filas.
i : Sin embargo, la metodología aquí presentada puede ser utilizada
/ / para el diseño de nuevas estructuras de acuerdo con las necesidades de
I j aplicaciones y ajustando el punto de referencia de los niveles de abs-
/ / tracción. Además, la comprensión de estas ideas facilitará el entendi-
/ / miento de la filosofía de la programación orientada a objetos.
i ( EJERCICIOS ) &
V s
m
1. Defina los siguientes conceptos:
* Abstracción
* Abstracción de datos
* Especificación lógica
* Nivel de abstracción
* Independencia de niveles
* Precondición
* Postcondición
* Módulo
* Abstracción modular
• 0I
Rbstracción de datos
0 •
flutoeualuación
/ t
/ i
-V r— ñuTOEUñLuncióNC\ f
■ i
i.— — _ . - _ — — — -- — — — - . _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ j
• 0
Abstracción de datos
t /
t /
t /
v \
*i \\
t \
Q •
Capítulo J ~
OtlElUPDÍ i OWIOS I
OBJETIVOS
• Entender los principios básicos de la programación orientada a
objetos.
• Repasar y comprender la terminología de la programación orientada
a objetos: objeto, clase, mensaje, método, herencia, polimorfismo,
encapsulamiento.
• Identificar las ventajas y desventajas de la programación orientada
a objetos.
• Relacionar los conceptos de la abstracción de datos con los de la
programación orientada a objetos.
• Ejemplificar la implementación del nivel físico de un TDA utilizan
do la programación orientada a objetos en el lenguaje de
programación C++.
0 I
Programación orientada a objetos
¿Qué es un objeto?
t
* V
* \
En la programación orientada a objetos, un objeto es un paquete que \ \
contiene datos y el código en forma de subrutinas que operarán sobre
los datos del propio objeto. Los datos que guarda un objeto se llaman \
atributos del objeto, mientras que a las subrutinas que operan sobre
los datos se les conoce como métodos. Los objetos de un programa
se comunican enviándose mensajes, y así se generan los resultados ^--„
correspondientes.
Para los fines de este libro, hay una relación muy estrecha entre la
abstracción de datos y la programación orientada a objetos, por lo que
cualquier estructura de datos, vista como un TDA, se considera como
un objeto en la programación orientada a objetos. La especificación
lógica de un TDA determina claramente cuáles son las operaciones váli
das en la estructura de datos, por lo que de ahí se obtendrán directa
mente los métodos del objeto; los atributos del objeto se determinarán
con base en la representación física que se le quiera dar al TDA.
0 •
¿Que son la herencia y el polimorfismo?
• Q
Programación orientada a objetos
Los objetos sólo pueden utilizarse enviándoles mensajes para que reac- /
cionen con alguna acción que repercuta en el estado de un programa.
Puesto que los datos que contiene un objeto sólo pueden utilizarse a
través de los métodos del mismo, los mensajes en sí son los nombres
de los métodos asociados. \
El envío de mensajes a los objetos y entre los objetos es lo que dará
al final el resultado esperado de un programa. \
% \_
* x
H Ejemplo \
- Número de la cuenta
- Nombre del cliente
- Sucursal donde se abrió la cuenta
l - Saldo de la cuenta J
0 •
Ejemplo
Instancia de la clase
fl
Programación orientada a objetos
class nombre /
{ II Lista de atributos, con la sintaxis de la
II declaración tradicional de variables en C /
Envío de mensajes:
Ü Ejemplo
^¿Recuerda la necesidad del TDA numeróte en el ejemplo del cálculo^
del factorial en el capítulo anterior? Ahora procederemos a analizar
cómo podría ser su implementación en el nivel físico.
Q •
Ejemplo
class Numeróte
{ prívate:
char digitos[1000];
int cantidad;
public:
II Métodos que programan las operaciones
" \ >;
/ void Numeróte::despliega()
--"'*** {for(intj = 0; j<cantidad; j++)
cout« dígitosljj;
}
Por otro lado, utilizando las características del lenguaje C++, se puede
aprovechar el concepto de sobrecarga de operadores para dar un nom
b r e más práctico a las operaciones: j
. Q
Programación orientada a objetos
Numeróte factorial;
factorial = 1;
for (int j = n; j > 0; j~)
factorial = factorial */;
( EJERCICIOS ) & A
g «
Ejercicios
cíes* Punto
{ public:
Puntof); II Método constructor que inidaliza en la coordenada (0,0)
void Lee(); II Método que lee del teclado el valor de la coordenada (x,y)
void Despliega! ); II Método que despliega en pantalla la coordenada (x,y) del
llpunto
--„, Jloat Distancia íPunto P); II Este método calcula la distancia del punto que
'""Ss // recibe el mensaje al punto P.
^ \ . \ prívate:
\ \ Jloat x, y; II Estos atributos guardan los valores de la coordenada <x,y)
\ \ }; II que corresponden a un punto en el plano coordenado.
\ l
V i
\ l
/ i
deas Triángulo
{ public:
II Aquí se encuentran los encabezados de los métodos asociados a un triángulo,
prívale:
Punto vi, v2, v3; II Estos atributos corresponden n los tres vértices del triángulo
};
• Q
Programación orientada a objetos
r-
1
ñuTOEunLuncióNq,. \
' \ ^ ^
i i \
a) Recursividad b) Encapsulamiento
c) Funcionalidad d) Todas las anteriores
e) Ninguna de las anteriores
Q •
Rutneuaiuacion
a) cero b) 8 c) 1
d) 7 e) 9
"ss. \ r = l;
\ \ for (intj= l;j<=n;j++) r *=j;
class Fecha
{ public:
Fechaf);
Fecha(iia a. int m. int di; U inivializa ¡a fecha con valores dados
void despliega (); II despliega en pantalla una fecha *
int cantidad_diasJranscurridos(); //calcula cantidad de días transcurridos desde
111/11)900
prívale:
int Año, Mes. Dia;};
Fecha fl.fld997, 8,20);
• a
Programación orientada a objetos
'd)fl.despliega();
b)f2(1997J ,12);
• c)Fecha¿I();
d)fl.mes;
e)cantidad_dias_transcurridoí!(f2); ,..--—
a) ningún objeto
b) sólo un objeto
c) dos objetos
d) tres objetos
e) tantos objetos como se requieran
ñ •
Rutoeualuacion
^v^ *\
V *
\ *
/ I
i I
M i
fI i
y /
• o
Capítulo^*
• I
DATOS
OBJETIVOS
• Entender qué es la representación física de una estructura de datos.
• Describir las características que distinguen a la representación por posiciones,
y a la representación por ligas o encadenamientos.
• Definir qué es un apuntador y cuál es su aplicación en el contexto de un lenguaje
de programación.
• Distinguir la diferencia entre una dirección de memoria física o real y una dirección
lógica o relativa (arreglos).
• Entender cuáles son las diferencias entre el uso de la memoria estática y la memoria
dinámica.
• Comprender las ventajas de utilizar la memoria dinámica en las aplicaciones de
software.
• Conocer las operaciones para crear y liberar espacios de memoria dinámica.
• Aplicar correctamente las regias para utilizar a la memoria dinámica.
• Aplicar los conceptos de apuntadores y memoria dinámica para trabajar con objetos
dinámicos y objetos con atributos dinámicos.
• Ejemplificar los conceptos con la programación del nivel físico de un TDA utilizando
la programación orientada a objetos y los atributos dinámicos.
0
Representación de estructuras de datos
Q •
¿Qué herramientas existen típicamente en la mayoría de los lenguajes de programación
para desarrollar una representación por posiciones?
1 aíemento 1
2 elemento 2
— o ~
o
K elemento K
K+1 elemento K+1
0
"--.. 0
%
V N elemento N
* \ \ ^ )
\ \ Figura 3.1. Representación por posiciones (almacenamiento contiguo}
\ *
• a
Representación de estructuras de datos
1 elemento 1
2 ' "elemento 2
3 elemento 3
0
o
r
• N elemento N
y ' y
Figura 3.2. Arreglo de elementos uniformes
r
* ^^
JT
* y^
í r —A i
campo 1
r—— ' 1 1 ' , \
campo 1 campo 2 \
campo 4 . ^.
campo 2 campo 3 campo 3 \
' ' ' campo 4 \ \
/ \ \
x y \ \ ^
Figura 3.3. Registro de elementos de diversos tipos.
Q •
¿Cómo funciona la representación de una estructura de datos por ligas?
el último. Esto se debe a que, dado que los elementos están almacena
dos en forma contigua, no existe un espacio físico disponible entre
ellos; de tal forma que se tendría que "generar" un nuevo espacio. La
única forma de hacerlo es desplazar hacia abajo los elementos que
están después de la posición de inserción deseada, logrando con esto
que se genere un espacio para poder agregar un nuevo elemento.
De manera similar, borrar un elemento que no sea el último deja un
hueco no permitido entre los elementos; si no se elimina ese espacio,
ya no se podría usar la posición física del elemento como su referencia
de dirección. La única manera de solucionar este problema es despla-
--- zar una posición hacia arriba los elementos que están después del
^v \ elemento borrado.
\ i
/ , — \
1 elemento K #
2
O
o
K
K+1 elemento 1
O
0
N elemento K+1
v '
Figura 3.4. Almacenamiento disperso.
/
- o
Representación de estructuras de datos
( = ^ ^
1 elemento K dirK+1
2 y'''
1 / /
K+1 elemento 1 dirg ! /
— \ " í /
" .'' /
O í
I
N e¡ementoK+1 dirK+2 i
V ' '
Figura 3.5. Representación por ligas.
J \ \ \ \
^ \
i \
6 •
¿Que es un apuntador?
\ i
¿Qué es un apuntador?
Un apuntador se define como un tipo de dato capaz de almacenar una
dirección de memoria. Se considera como referencia indirecta a un ele
mento.
Los apuntadores pueden ser un tipo de dato especial dentro del len
guaje de programación en cuyo caso, guardarán direcciones de memoria
real; o bien, el programador puede simular el funcionamiento de un
• a
Representación de estructuras de datos
f ^
n 5 VAR1 ,-**' ^ * ^
VAR1 / /S
n+1 m VAR2 —r e- m /
/ /
i /
I i
l i
m bzl J ÍH3 \\
Figura 3.6. Diferencia entre una variable tradicional VAR1 y un apuntador VAR2.
@ — — ~ — •
¿Cómo se utiliza un apuntador en lenguaje C/C++?
Por ejemplo:
• Q
Representación de estructuras de datos
ñ — •
¿Cómo se pueden crear y liberar espacios de memoria dinámica?
^ ^ delete apuntador;
*p = a;
• U
Representación de estructuras de datos
Q •
¿Cuáles son las reglas para programar con apuntadores y memoria dinámica?
• M
Representación de estructuras de datos
9 •
¿Cómo se pueden crear objetos dinámicos?
^ Ejemplo
\ \v /
Ejemplo ap;
ap = new Ejemplo;
ap = new Ejemplo(argumentos);
•—— ——————Q
Representación de estructuras de datos
H Ejemplo / /
f ^ I
class Ejemplo
{ prívate: \
int *ap; II atributo que apuntará a un espacio dinámico de memoria \
pubiic:
Ejemplo(int tam) { ap = new int[tam]; } llgenera un espacio
//dinámico para enteros
\ /
class Ejemplo
{pubiic:
int a;
h
o •
Ejemplo
y se declara un objeto:
Ejemplo obj;
\ \ class Ejemplo
\ \ {public:
\ int *a;
};
I j y se declara un objeto:
/ / Ejemplo obj;
/ / obj es un objeto estático con un atributo apuntador que puede di-
y / reccionar a un espacio dinámico, que si se quiere accesar se haría
con la expresión obj.a y, obviamente, lo único que se puede asig-
,,.-''' nar al apuntador a es una dirección.
Una forma de asignar un espacio de memoria dinámico al apun
tador a sería: obj.a = new int; y la forma de referenciar este espa
cio dinámico para asignarle un valor sería: *(obj.a) = valor, que
es equivalente a *obj.a = 8; dado que el operador punto (.) tiene
prioridad sobre el operador de indirección (*). *
class Ejemplo
{ public:
int a;
};
e
Representación de estructuras de datos
ap->a=valor;
class Ejemplo
{public: / /
int *a; / /
};
8 ^
—
\ \ L_^___^ )
Figura 3.7.
( /~x /—X A
Atributos \ / Atrihutos \
x ' dinámicos '. Bstáticos | obj
Figura 3.8.
• 0
Representación de estructuras de datos
Atributos Atributos i
x dinámicos estáticos \ 0 bj
T
^ — ■ ■ ^ ^ « ■ 1 — - ^ _ „ - -
Figura 3.9.
Atributos
dinámicos
V ^ *** ) \ \
Figura 3.10.
Q •
Ejercicios
/ t
claración anterior?
• 0
Representación de estructuras de datos
r HUTOEUHLUflCIÓN < \ =
" i
■ i
L _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ — _ _ _ _ _ J
Q .
flutoeualuacrón
class Complejo
{ public:
ComplejoO;
Complejo(floatx,floaty);
float Parte_Real ();
voidescribeO;
void lee();
prívate:
float real, imaginario; } ;
. 0
Representación de estructuras de datos
* \
float a = 2.0, *b, *c;
b= &a;
c=newfloat;
*c = *b;
a= *c+/.5;
cout «*b «*c;
a) 2.0 2.0
b)3.5 2.0
c) dirección de a y dirección dada en el new.
d) dirección de a y 3.5
e)3.5 3.5
Q •
Capítulo Jn\
OBJETIVOS
0I
Listas Encadenadas
v ) \[
Figura 4.1.
*j ELEMENTOS: los elementos de una lista se denominan nodos, que almacenan da
tos simples o estructurados.
ESTRUCTURA: la estructura de tina lista es lineal, esto es, existe un elemento llama
do "el primero" y otro llamado "el último"; cada elemento tiene un
tínico sucesor y antecesor; cada uno de los elementos tiene asignada
una única posición en la lista, esto es, la posición del primer elemen
to es la 1 la de su sucesor es 2 etc Si la lista no está vacía, sus
elementos tendrán las posiciones 1.2..,,*, donde N es la cantidad
de elementos de la
lisa
V )
0 •
¿Cuál es la especificación lógica del TDfl lista encadenada?
( \
Sólo se muestran algunas operaciones generales que pueden ser
útiles para cualquier aplicación.
METER INICIOLISTA
ENTRADA: " la lista y el nuevo elemento
SALIDA: la lista con el nuevo elemento al inicio
PRECONDICIÓN: ninguna
POSTCONDICIÓN: la lista contiene el elemento nuevo al inicio
«^ ' \ METER_FINAL_LISTA
" ^ \ \ ENTRADA: la lista y el nuevo elemento
X \ SALIDA: la lista con el nuevo elemento al final
\ \ PRECONDICIÓN: ninguna
\ \ POSTCONDICIÓN: la lista contiene al elemento nuevo al final
/ / SACAR_INICIO_LISTA
/ ENTRADA: la lista a la que se va a sacar el elemento
/ / SALIDA: la lista con un elemento menos y, en viejo, el valor que se sacó
^ / PRECONDICIÓN: la lista no está vacía
y*' POSTCONDICIÓN: la lista contiene un elemento menos (el del inicio)
SACARFTNAL LISTA
ENTRADA: la lista de la que se va a sacar el elemento
SALIDA: la lista con un elemento menos y, en viejo, el valor que se sacó
PRECONDICIÓN: la lista no está vacía
POSTCONDICIÓN: la lista contiene un elemento menos (el del final)
•
SACAR_EN_ORDEN_ESPECIAL_LISTA
ENTRADA: ~ la lista de la quese va a sacar el elemento y el elemento que se
desea sacar
SALIDA: la lista con un elemento menos
PRECONDICIÓN: la lista no está vacía y contiene al elemento que se quiere sacar.
POSTCONDICIÓN: la lista contiene un elemento menos y corresponde al que se sacó
BUSCAR
ENTRADA: la lista y el elemento por buscar
SALIDA: la lista como estaba y un valor de verdadero si encontró el
elemento en la lista o falso si el elemento no se encuentra en
la lista
PRECONDICIÓN: ninguna
POSTCONDICIÓN: ninguna
V )
• -
Listas Encadenadas
r { , . ~
a
N| ..----
Valor del rección
elemento del siguiente
elemento X
\ ) / /
Figura 4.2. Esquema de nodo para una lista encadenada.
f Posición del 1
Posición Elemento siguiente elemento
1 R 7
~~2~
~3~
~4~ ~Q~ ~~6~~
5
6 Z 1
~7 ~ u '. ninguna
8
@ •
¿Cómo se puede implementar una lista encadenada en lenguaje C++?
f"= \
v , 3
Figura 4.4. Lista encadenada con memoria dinámica.
• 6
Listas Encadenadas
class Lista
{prívate:
Nodo* inicio;
public:
Lista() {inicio = NULL;}
~Lista() {//instrucciones para liberar los nodos de la lista }
• // otros métodos, según el diseño
};
^ Ejemplo ¡
r \ \ \
Ejemplo 1 Agregar un nodo inmediatamente después del nodo
apuntado por P en la lista de la figura 4.5:
(meto
Figura 4.5.
@ •
Ejemplo
Ü Ejemplo (continúa)
( ' ^
inicio — J B—|
2
^ \ \ iP
\ ^ \ Figura 4.6.
^ / Ejemplo 2. Eliminar el nodo que está después del nodo apuntado por
,.--''' P en la figura 4.7.
inicio
Figura. 4.7.
• 0
Listas E n t r e n a d a s
^ E j e m p l o (continúa)
í inicio 1
\
Q
3
O •
¿Cuales son las uariantes de una lista encadenada?
^r E j e m p l o (continúa)
inicio
/ / Nodo *q;
/ / q = inicio;
whüe (q->sig!=P) II este ciclo recorre al apuntador q hasta que esté en el nodo
q = q->sig; II anterior al que se desea borrar
.,.*''' q->sig=P->sig; II esta instrucción "hace el puente"
delete P;
Los casos que hemos analizado representan todas las situaciones tí
picas con las que se puede enfrentar un programador al trabajar con
una lista; si se comprenden, es fácil extrapolar las situaciones con di- •
ferentes variantes.
• 0
Listas Encadenadas
( l
Lista
^ \\ \ \
v. J
Figura 4.10. Esquema de una lista encadenada circular.
if (inicio != NULL)
{ P = inicio ;
do
{ coitt « P -> info ;
P~P-> sig ;
} while (P != inicio) }
Q •
¿Como es una lista doblemente encadenada?
Estas listas presentan una variación más sustancial que la anterior. Este
tipo de listas se utilizan cuando la aplicación sobre una lista encadena
da debe recorrer la lista en ambos sentidos, algo imposible de realizar
en una lista encadenada lineal y, aunque es posible hacerlo en una
lista circular, resulta muy ineficiente.
/ I (
/ / Üsta
^
y / Lrn^m3-~Em-íE0
^ / \ /
„.*•'' Figura 4.11. Esquema de una üsta doblemente encadenada.
class Nodo
[public:
tipoinfo info;
Nodo *sig, *ant;
Nodo() { sig = ant = NÜLL; J
}■>
P~>ant->sig = P->sig;
P->sig->am = P->mt;
delete P;
• £
Listas Encadenadas
V )
Figura 4.12. Esquema de una lista doblemente encadenada circulan
6 •
Ejercicios
ü!M
( f- 1
/ / L™ )
/ /' Figura 4.13. Esquema de una lista con múltiples encadenamientos.
( EJERCICIOS ) #
i •
• Q
Listas Encadenadas
MEZCLA
FUNCIONAMIENTO: une, en forma alterna, los elementos de dos listas. \ . ^
ENTRADA: dos listas encadenadas, Ll y L2.
SALIDA: la lista Ll contiene los elementos de las dos listas,
acomodados de manera alterna.
PRECONDICIÓN: las listas existen y no están vacías.
POSTCONDICIÓN: la lista L2 queda vacía y la Ll queda con los elementos
en forma alterna.
fj •
Hutoeualuaciort
SPLIT
FUNCIONAMIENTO: divicie los elementos de una lista, de tal forma, que se
convierte en dos nuevas listas. Los elementos de la pri
mera lista serán los que se encontraban en las posiciones
1, 3, 5 ... de la lista original y la segunda tendrá los de
más elementos. No crea dos nuevas listas, sólo divide la
original.
ENTRADA: una lista encadenada (L).
SALIDA: dos listas (IMPARES y PARES).
PRECONDICIÓN: la lista existe.
"**-*, POSTCONDICIÓN: la lista Lqueda sin elementos. Las listas PARES e IMPA-
*\, RES contienen a los elementos de la lista original, de
^\ \ acuerdo con su posición.
^^ \
^v *
X %
\ \ r—nuTOEURLuncióN <\ =
i ■ I
: i i
1 L _ _ _ _ _ - — — — - - _ — — _ _ - — _ _ _ _ _ _ _ _ _ _ _ _ . . _ _ _ — - J
.— a
Listas Encadenadas
2. ¿Cuál de los códigos une dos listas encadenadas que ya tienen valores
para formar una sola lista? Utilice la siguiente declaración:
struct Nodo
{int valor; Nodo *sig:}:
Nodo *aux.
*lista!, *lista2; ¡I donde ¡istal v lista2 son apuntadores ai primer nodo de cada lista.
•
cout« lista~>sig->ant->ant->info;
Usta
a) A b) B c) C d) D e) E
Q •
CapítulolJ
• H m
OBJETIVOS
• Definir qué es un string y cómo se diseña bajo las reglas de la abstrac
ción de datos.
• Conocer algunas de las opciones de representación para el TDA
string, analizando sus ventajas y desventajas.
Strings
V _ )
0 .
¿Cómo se puede representar el TDfl del string?
í ^
Algunas de las operaciones más importantes para strings pudieran
diseñarse de la siguiente forma:
IN1CIALIZAR
ENTRADA: espacio de memoria para un string
SALIDA: el string S es nulo (está vacío)
PRECONDICION: ninguna
POSTCONDICIÓN: el string S es nulo
INSERTAR_CARÁCTER_AL_FINAL
"~^^ \ ENTRADA: string S y la letra L que se insertará al final de S
^ \ \ SALIDA: string S modificado
\ \ PRECONDICION: el número de letras en S es menor que 80
\ \ POSTCONDICIÓN: el string S tiene una letra más en el extremo derecho
\ \ BORRAR_CARÁCTERJNICIAL
\ ENTRADA: string S al que se le borrará la primera letra.
SALIDA: string S modificado
PRECONDICION: la cantidad de letras en S es mayor o igual que 1.
/ POSTCONDICIÓN: el string S tiene una letra menos en el extremo
/ izquierdo.
/ t
/ / CONCATENAR
/ / ENTRADA: strings SI y S2
y / / SALIDA: string SI modificado
^ ^ / PRECONDICION: La suma de la longitud de S1 y S2 es menor que 80
,,--'' POSTCONDICIÓN: A string SI se le agregan todos los caracteres de S2
,..--''' (en el extremo derecho); S2 no se modifica
BUSCAR_SUBSTRING
ENTRADA: strings SI y S2
SALIDA: verdadero si S2 está contenida en S1, falso en caso
contrario •
PRECONDICION: si y s2 existen
POSTCONDICIÓN: ninguna
V )
• 0
Strings
H OÍL AT
V.
carácter centinela
V [enCes\0] j
Figura 5.1.
o •
¿Cuáles son las formas más comunes de representación con almacenamiento no contiguo?
r 0 i máx
4 H 0 . L A - - - - -
realmente almacena el
L carácter con ASCII4 j
Figura 5.2.
string
-^r~n"
U ~~Li o nLÍ~L L j A11/
V.
Figura 5.3.
^ ^ ^ ^ ^ J
• Q
Strings
strinc
v
— _J . ,.. -^ \
Figura 5.4.
i ( EJERCICIOS ) &
CREAR
ENTRADA: espacio en memoria que se quiere trabajar como siring
SALIDA: espacio de memoria inicializado como string
PRECONDICIÓN: ninguna
POSTCONDICIÓN: string inicializado como string nulo (sin caracteres)
-->: esta operación también puede emplearse para limpiar un string que ya
contiene caracteres al volverlo string nulo
hA 9
Ejercicios
LONGITUD
ENTRADA: string S del que se desea conocer su longitud
SALIDA: canüdad de caracteres que contiene el string S
PRECONDICIÓN: ninguna
POSTCONDICIÓN: ninguna
ÜAMECAR
ENTRADAS: String S donde se desea conocer cierto carácter
Posición J del carácter que se desea conocer
SALIDA: carácter que se encuentra en la posición J del string S
*"--^ PRECONDICIÓN: el string S no puede ser nulo y J debe ser un valor entre 1
***. y la longitud de S
■^^ POSTCONDICIÓN: ninguna
\ \ AÑADE_CAR
\ \ ENTRADAS: string S donde se desea añadir un carácter y el carácter C
\ \ añadir.
\ \ SALIDA: string S modificado
\ PRECONDICIÓN: la longitud del string S debe ser menor a la longitud
1 i máxima posible.
POSTCONDICIÓN: el string S contiene todos los caracteres originales en el
/ mismo orden y a la derecha de S se añadió el carácter C.
I P
/ / BORRA_CAR
/ / ENTRADA: string S donde se desea borrar un carácter
/ SALIDAS: carácter C que es el primer carácter del string S y el string
y / S modificado
PRECONDICIÓN: el string S no es nulo
/ POSTCONDICIÓN: el String S contiene todos los caracteres originales.
..--**' excepto el que ocupaba la primera posición. Los
caracteres se reacomodan en el mismo orden, de tal forma
que el segundo ahora es el primero, el tercero el segundo
y así sucesivamente
• — -
Strings
CONCATENAR
ENTRADA: dos strings SI y S2 que se desean unir
SALIDA: string S1 modificado
PRECONDICIÓN:
POSTCONDICIÓN: el string S I contiene los caracteres originales seguidos de
los caracteres del string S2. el cual no se modifica
A #
Ejercicios
COPIAR
ENTRADA: dos strings S1 y S2 (S2 se copiará en S1)
SALIDA: string SI modificado (igual a S2).
PRECONDICIÓN: ninguna
POSTCONDICIÓN:
REMOVER
ENTRADAS: string S, posición P desde donde se desea remover y
cantidad N de caracteres a remover
SALIDA:
PRECONDICIÓN: _ _ ^ _ ^ .
\ POSTCONDICIÓN: el string S contiene los caracteres originales, excepto los
"*"*•«•*. \ N caracteres que se encontraban a partir de la posición P
de S. Se recorrieron los caracteres necesarios en S
• e
Strings
TABLA DE
STRINGS
• S4-> IB 4
S5-> ~22 EP Apuntador al siguiente espacio disponible en el
vector de concatenaciones = 28 ,--"'"
: - n u T O E U H L u n c i ó N Q^ = V
0 •
Rutoelaluación
/ /
/ t
y^ / a) aux=aPSl b) aux=aPSI
^ / whüe(aux>=NULL) while(aux->sig!=NULL)
y / aux=aux->sig; aux=aux->sig;
aux->sig^apS2; aux->sig=apS2;
c) aux=aPSl; d) aux^apS2;
while(aux!=apS2) while(aux->sig!=NULL)
aux=aux->sig; aux=aux->sig; •
aux=apS2; aux->sig^apS2;
. 0
Capítulo j r l
OBJETIVOS
• Explicar en qué consisten las estructuras de datos pila y fila (Cola), y
cuáles son sus aplicaciones principales.
•Diseñar los TDA pila y fila.
• Describir las diferentes opciones para representar los TDA pila y fila,
analizando ventajas y desventajas.
• Conocer la forma en que se maneja un arreglo circular y cómo se
aplica en la representación de una fila.
• Integrar los conceptos de abstracción de datos, programación orien
tada a objetos y listas encadenadas en memoria dinámica, en el con
texto de los TDA pila y fila.
Q
Pilas y rilas
/ /
V -* tope
í /
Ü S ^- fondo
"• \
> \
Figura 6.1.
0 •
¿Qué es la estructura de datos fila?
\A t ^
Jj l 1|}
^ ^ / Figura 6.2.
• II
Pilas y filas
o •
¿Cuál es la especificación lógica para los TDH pila y fila?
f >
El diseño de las operaciones es lo que realmente distingue a los
TDA pila y fila. Sin embargo, las operaciones que se diseñarán
serán las mismas para ambos.
Adicionalmente, se podrá observar que puede haber diversos di
seños para las operaciones, dependiendo del enfoque del diseñador
lógico. En este caso, se presentan dos opciones de diseño que per
miten ejemplificar y razonar el impacto en la abstracción de datos.
METER (PUSH)
\ \ UTILIDAD: agrega un elemento a una pila.
\ \ ENTRADAS: la pila a la que se va a agregar el elemento y el elemen-
\ \ to que se agregará.
\ SALIDAS: la pila con un elemento más.
\ PRECONDICIÓN: la pila está creada y no está llena.
POSTCONDICIÓN: la pila queda con un elemento adicional, agregado por el
extremo del tope de la pila.
/ SACAR (POP)
/ / UTILIDAD: elimina el último elemento que se agregó a una pila.
/ / ENTRADAS: la pila a la que se va a quitar un elemento.
/ / SALIDAS: la pila con un elemento menos y el elemento que se
^ S / eliminó.
PRECONDICIÓN: la pila está creada y no está vacía.
POSTCONDICIÓN: la pila queda con un elemento menos, eliminado por el
extremo del tope de la pila.
V, _ J
Ya que en estas operaciones se ha puesto como precondición la verificación del es
tado de la pila (vacía o llena), es necesario diseñar operaciones que permitan al usuario •
de la pila hacer validaciones. Por lo tanto, se diseñan estas operaciones:
í VACÍA ^
UTILIDAD: verifica si una determinada pila está vacía o no.
ENTRADAS: la pila que se va a verificar.
SALIDAS: valor booleano que indique si la pila está vacía o no.
PRECONDICIÓN: la pila por verificar existe.
POSTCONDICIÓN: ninguna, la estructura no se modifica.
V J
• Q
T K O S L] 1 M Q 3
( \
LLENA
UTILIDAD: verifica si una pila determinada se encuentra llena o no.
ENTRADAS: la pila que se va a verificar.
SALIDAS: valor booleano que indique si la pila está llena o no.
PRECONDICIÓN: la pila por verificar existe.
POSTCONDICIÓN: ninguna, la estructura no se modifica.
• V _ )
Si se analiza un poco, el TDA fila contendría en forma equivalente las mismas
operaciones, pero considerando en las postcondiciones los cambios de acuerdo con el
manejo del orden de entrada en una fila. A continuación, se detalla este mismo diseño
para un TDA fila.
í >/ /
Diseño 1 para las operaciones del TDA fila
METER (INSERT)
UTILIDAD: agrega un elemento a una fila.
ENTRADAS: la fila a la que se agregará el elemento y el elemento por
agregar. \
SALIDAS: la fila con un elemento adicional. \ \
PRECONDICIÓN: la fila está creada y no está llena.
POSTCONDICIÓN: la fila queda con un elemento adicional, agregado por el
extremo del final de la fila. \ \ ^
SACAR (REMOVE)
UTILIDAD: elimina el último elemento que se agregó a una fila.
ENTRADAS: la fila a la que se va a quitar un elemento.
SALIDAS: la fila con un elemento menos y el elemento que se
eliminó.
PRECONDICIÓN: la fila está creada y no está vacía.
POSTCONDICIÓN: la fila queda con un elemento menos, eliminado por el
extremo del frente de la fila.
VACIA
UTILIDAD: verifica si una determinada fila se encuentra vacía o no.
ENTRADAS: la fila que se va a verificar.
SALIDAS: valor booleano que indique si la fila está vacía o no.
PRECONDICIÓN: la fila por verificar existe.
POSTCONDICIÓN: ninguna, la estructura no se modifica.
LLENA
UTILIDAD: verifica si una fila determinada se encuentra llena o no.
ENTRADAS: la fila que se va a verificar.
V __ )
@ •
¿Cuál es la especificación lógica para los TBfl pila y fila?
C >
SALIDAS: valor booleano que indique si la fila está llena o no.
PRECONDICIÓN: la fila por verificar existe.
POSTCONDICIÓN: ninguna, la estructura no se modifica.
V )
Es importante darse cuenta en este momento que, sin saber cómo
se implementará físicamente la pila o la fila, se pueden diseñar las
operaciones en un nivel abstracto.
"-... Adelantando un poco el nivel físico o de implementación, se pue
de observar que la especificación de las operaciones puede determinar
* \ \ la interfaz que tendrán los módulos de las operaciones.
\ Por ejemplo, si el TDA pila fuera a ser implementado con este di-
\ \ seño en el lenguaje C++, es posible bosquejar el diseño de la clase
\ \ pila de la siguiente manera:
\ \ class Pila
{ prívate:
i // atributos según representación física del TDA
/ I puhlic:
i ¡ Pila(); // constructor que micializa como vacía
/ / void Meter (Tipoelem dato);
/ / Tipoelem Sacar ();
y ^ / char Llenaf);
char Vacia();
.---'"' ~Fila(); //destructor si se requiere
h
Ahora bien, si se eliminan las precondiciones que indican que las
estructuras no deben estar vacías o llenas, éstas condiciones se pueden
validar físicamente en las operaciones METER y SACAR, lo que nos •
lleva a plantear otro diseño lógico, cuya consecuencia es proveer ma
yor comodidad al usuario de los TDA, y ya no serán necesarias las
operaciones LLENA y VACÍA.
A continuación se detalla este diseño sólo para el TDA pila, del
cual se deduce fácilmente el TDA fila.
METER (PUSH)
UTILIDAD: agrega un elemento a una pila si no está llena.
ENTRADAS: la pila a la que se va a agregar el elemento y el elemento que
se agregará.
V )
• @
Pilas y filas
t >
SALIDAS: la pila con un elemento adicional, si se pudo agregar, o la
pila como estaba. Además, la operación genera como sa
lida un valor booleano que indica si se pudo o no agregar
el elemento.
PRECONDICIÓN: ninguna.
POSTCONDICIÓN: la pila queda con un elemento adicional por el extremo
del tope si se pudo agregar o se queda como estaba por
encontrarse llena.
SACAR (POP)
UTILIDAD: elimina el último elemento que se agregó a una pila, si es
que no está vacía.
ENTRADAS: la pila a la que se va a quitar un elemento.
SALIDAS: la pila con un elemento menos, si se pudo quitar y el ele
mento eliminado o la pila como estaba. Además, la ope
ración que se realiza genera como salida un valor boolea
no que indica si se pudo o no eliminar el elemento.
PRECONDICIÓN: ninguna.
POSTCONDICIÓN: la pila queda con un elemento menos, si se pudo quitar
(eliminado por el tope) o queda como estaba en caso de
encontrarse vacía.
V ) \ \
^ Ejemplo \ X.
' C a s o de aplicación
Este es el momento para ilustrar el concepto y los beneficios de la abs
tracción de datos, en la que se debe cumplir la independencia entre los
niveles de aplicación e implantación (físico).
El problema consiste en verificar si una frase es o no palíndromo,
esto es, si se lee igual de izquierda a derecha, que de derecha a izquier
da. Por ejemplo: AN1TALAVALATINA.
Aunque la solución de este problema puede obtenerse de muchas
maneras, se puede observar que una pila y una fila pueden ser útiles
planteando el siguiente algoritmo:
1. Cada letra que se lea de la frase se deberá meter en una pila y en una
fila.
2. Saque un dato de la pila y de la fila. Si son iguales, repita el paso 2.
Si son diferentes, termine el proceso indicando que no es palíndromo.
3. Si la pila y la fila se vaciaron, es palíndromo.
Q •
Ejemplo
^ Ejemplo (continúa)
Observe que, sin haber implantado los TDA pila y fila, se puede de
sarrollar una aplicación solamente conociendo la interfaz de las opera
ciones en el lenguaje correspondiente. Esto se demostrará también en
términos de la implantación en un lenguaje de programación y, por lo
tanto, supondremos que se han planteado las siguientes definiciones en
C++:
N
Implementación parcial del TDA Pila, según el Implementación parcial del TDA Fila, según el
char patináronte 0
i
Pila P;
Fila F;
Tipoelem dato;
cin.get(dato);
while (dato .'= \n')
/ PMeter(dato);
FMeter(dato);
cm.get(dato); }
while ( PSacar(dato))
if(FSacar() != dato)
return 0;
return 1;
} j
. e
¿Cómo se puede representar físicamente el TDA pila?
Q •
¿Como se puede representar físicamente el TDft pila?
Pila::Pila()
{ tope=-J; ///este valor indica que no hay datos en la Pila
• 0
Pilas y filas
Pila::Pila()
( tope = NULL; }
Pila::~Püa()
# í Nodo *aux;
aux = tope;
while (tope != NULL)
I tope = aux->sig;
delete aux;
aux = tope; }
}
i /
i /
n #
¿Como se puede representar físicamente el TDR fila?
• Q
Pilas y filas
C 5 ± 0 ^\
00 ***£* f^al = 0
v M ^ ^ ^ ^ MJ -*- frente = 1 \
3 a X
v J x
Figura 6.3. Fila en arreglo circular.
Es importante observar que esta representación no tiene las desven
tajas de las anteriores, pues no se requiere recorrer datos ni se desperdi
cia espacio en el arreglo al considerar todas las localidades disponibles
en él. Sin embargo, puesto que un arreglo en la memoria no es física
mente circular, el implementador de las operaciones tendrá que contro
lar esta característica.
Antes de conocer el código de implementación para esta representa
ción, es importante considerar que los dos apuntadores (frente y final)
siempre se incrementarán dentro del arreglo. Esto quiere decir que, pa
ra agregar un dato, se incrementa el final, y para sacar, se incrementa el
frente. En la acción de incrementar se tendrá que considerar la circula-
ridad del arreglo y se puede deducir que el incremento se validará con
una estructura de decisión que verifique si se está en la última posición
del arreglo para mandar a la posición inicial, o si no, incrementar
normalmente.
Sin embargo, aquí vale la pena presentar un truco de piogramación
que permite hacer más eficiente la acción de "incrementar circularmen-
te". Esto se logra con el operador que permite obtener el residuo de una
^ división entera. Para el caso del lenguaje C++ (o C), la equivalencia
Q #
¿Cómo se puede representar físicamente el TOA fila?
f íf [ap==MAX-1)
i ^
ap"0, ap = [ap+1]%MAX:
ap++;
V '. )
Figura 6.4.
^ X, Por lo tanto, la implementación final del TDA fila, con esta represen-
^ \ \ tación y con el diseño lógico 1, sería la siguiente:
\ \ class Fila
\ \ {prívate:
\ \ tipoelem datos[MAX];
\ int Frente, Final;
public:
I \ FilaO { Frente = Final = -1; j
/ / void Meter (tipoelem dato);
I j tipoelem Sacar ();
/ / char Llenaf);
/ / char Vacia();
• 0
Pilas y filas
Figura 6.5. ^ \
class Fila
{ prívate:
Nodo *Frente, *Final;
public:
FÜaQ; //constructor que inicializa como vacía
char Meter (tipoelem dato);
char Sacar (tipoelem* dato);
~Fiia(); //destructor necesario
h
Q #
¿Cómo se puede representar físicamente el TDH fila?
Fiia::Fila()
{ Frente = Final = NULL;}
Fila::~Fila()
{ Nodo *aux = Frente;
while (Frente != NULL)
{Frente = aux->sig;
delete aux;
aux = Frente; }
\ ;
. g
Pilas y filas
( EJERCICIOS ) ^
0 •
Ejercicios
' \ SACAR
^-. \ ENTRADA: la pila de donde se desea sacar
\^ \ SALIDA: la pila modificada
\ \ PRECONDICIÓN: la pila existe y no está vacía
\ \ POSTCONDICIÓN: la pila tiene un elemento menos eliminado por el extremo
\ '. del tope
\ \ OBSERVA
: ENTRADA: la pila de donde se desea observar
SALIDA: el valor del elemento que está en el tope de la pila
¡' PRECONDIOÓN: la pila existe y no está vacía
/ / POSTCONDICIÓN: ninguna
y
y Con estas especificaciones, responda los siguientes incisos:
• S
Pilas y filas
Q — •
Ejercicios
• 0
Pilas y íilas
[1] MANUEL 7
[2] ~ 3
[3] 5 Lista = 4
[4] FRANCISCO 1
Disponibles = 8
Í5] 6
[B] 0_
[7] CÉSAR 4
[8] 2
"~^~^ »** ^
I /
Para los incisos siguientes, muestre el estado del arreglo y de los apun
tadores, después de ejecutar la operación correspondiente. Maneje las
operaciones de filas y pilas sobre una lista circular de la manera más efi
ciente (evitando recorrer nodos). Para el primer inciso, tome el estado
original del arreglo; para los otros incisos, el estado del arreglo re
sultante del inciso anterior. \ \
Esto significa que tendrá que simularse una fila por medio de una
pila y que la implementadón de los métodos de la clase fila se realizará
en el nivel de aplicación de las pilas.
Escriba la implementación de los métodos de la clase fila, con
siderando esta representación y el diseño lógico 2.
^X \ r flUTOEUHLUflCION C\ z
\ \ ' '
\ \ I I
• 0
Pilas y filas
Lista \
i 1 1 r—i 1 i 1 1 i 1 1 '-
^ R -i». S --». T -I -»■ *~ M —
I 1 1 I L _l L I J I I
9 •
Capítulo j f p
KMTlMDt ' ^
DATOS LinCrLfS PAPJ
Lfl EÜSQUÜDO DE * ^
nomnoón
OBJETIVOS
• Comprender el concepto de búsqueda y su importancia en múltiples apli
caciones computacionales.
• Describir el algoritmo de la búsqueda secuencial.
• Describir el algoritmo de la búsqueda binaria, distinguiendo claramente sus
ventajas.
• Implantar los algoritmos de búsqueda en estructuras lineales que utilizan
los dos tipos de representación (por posiciones y por ligas).
• Entender las ventajas y desventajas de los algoritmos de búsqueda, según
la representación de la estructura y en conjunto con las operaciones de
inserción y eliminación de elementos.
0
Estructuras de datos lineales para la búsqueda de información
@ •
¿Cómo se puede ímplementar el proceso de búsqueda en una estructura lineal?
• Q
Estructuras de datos lineales para la búsqueda de información
15 JS
_ £i ^-^- si
"...:*: as ^ ^ : sa
fc" se - :=: 38
V I : I : )
Figura 7.1.
Q •
Ejercicios
( EJERCICIOS ) $
• Q
Estructuras de datos lineales para la búsqueda de información
arriba = 0; \ \ .
abajo = posición del último elemento en la tabla +1; "\ ^""^
mientras (arriba-abajo >l)y no se haya encontrado el elemento buscado hacer:
S actual = el cociente de dividir (arriba+abajo) entre 2;
si el elemento buscado < elemento de la posición actual entonces:
abajo = actual
si no
si el elemento buscado > elemento de la posición actual entonces:
arriba == actual
si no
ya se encontró el elemento l
TIM DOT EVA ROY KIM GUY AMY JON ANN JIM
KAY RON JAN
Q •
Ejercicios
/ / INFO SIG
/ 1 2
/ / 2 3
/ / / 3 4
4
--'''' 5
.---''' 5 6
6 7
7 D
LISTA = 0
DISPONIBLES = 1
a) Insertar a GABRIEL
b) Insertar a GUILLERMO
c) Insertar a ALEJANDRO
d) Insertar a LUIS
e) Dar de baja a GUILLERMO
f) Insertar a ROBERTO
g) Dar de baja a GABRIEL
• 0
Estructuras de datos lineales para la búsqueda de información
í H U T O E U ñ L U H C I Ó N Q, =
1
!
■ i
■._ — _ _ _ _ _ _ _ — _ _ _ — _ — _ _ _ _ . _ _ _ — _ _ _ _ _ _ _ _ _ _ _ j
INFO SIG /
i /
[1] MANUEL 7 /
[2] 3
[3] 5
[4] FRANCISCO 1
[5| 6 \
[6] 0 \
[71 CÉSAR 4
[8] 2 \ ^ _
0 •
Rutoeualuacíón
a) 4 b) 7 c) l d) 0 e) 2
a) I b) 2 c) 3 d) 4 e) 8
\ i
\\ *t
\ \
J t
/ t
/ t
/ i
* í|
Capítuloi Q
T teous DDIOHOS
DE BÚSQUEDA
OBJETIVOS
• Definir las características de las estructuras de datos jerárquicas.
• Describir la terminología de las estructuras de datos tipo árbol: nodo
raíz nodo hijo nodo padre ancestros descendientes nodo hoja sub-
árbol, altura y niveles.
• Describir el diseño lógico del TDA árbol binario de búsqueda (ABB),
incluyendo las operaciones de búsqueda, inserción y eliminación de
un elemento.
• Implantar el TDA ABB, comprendiendo el movimiento del apunta
dor en la ruta de búsqueda.
• Describir la forma en que se realizan los recorridos sobre un árbol
binario.
• Distinguir las ventajas de aplicar la recursividad en la implementación
de rutinas relacionadas con árboles binarios.
"
Estructuras jerárquicas y arboles buíanos de búsqueda
/ Ejemplos de jerarquías
c3 =" =
'= ° / /
' /
Esta estructura pudiera representar:
V Un árbol genealógico, un organigrama, los directorios de un sistema operativo, etc... j
0 •
¿Que es un árbol binario de búsqueda IflBB)?
c El nodo raíz es el 5.
>
*■ El hijo derecho de 5 es 8. El hijo derecho de 6 es 7
5 El hijo izquierdo de 5 es 3. El hijo izquierdo de 8 es B.
El nodo padre de 2 y 4 es 3. El nodo padre de 7 es 6.
Los nodos hojas son 1,4, 7 y 10.
^ 8 Los hermanos son (2 y 4], (6 y 9).
Los ancestros de 7 son 6, 8 y 5.
2 4 6 g Los descendientes de 8 son 6, 7, 9 y 10.
El subárbol derecho de 5 es el que tiene raíz 8.
7 1Q El subárbol izquierdo de 5 es el que tiene raíz 3.
El nodo del nivel cero es 5.
-^ Los nodos del nivel 1 son 3 y 8.
Los nodos del nivel 2 son 2, 4, 6 y 9.
V Los nodos del nivel 3 son 1,7 y 10. J
• 0
Estructuras jerárquicas y arboles binarios de búsqueda
3 9 1 3 1 5 9 1 2
3 7 3
2 1 6 / - * " '
5 7 4 5 7
/ /
V | )\ \
Figura 8.3. Ejemplos de árboles.
* \
i \
S f J
>
^5 ELEMENTOS: los elementos de un ABB se identifican como nodos. Cada uno
de ellos contiene un dato (simple o estructurado) único en el
árbol.
ESTRUCTURA: un ABB posee una estructura jerárquica (a excepción del árbol
vacío). Sólo hay un nodo raíz; los demás forman dos subár-
boles disjuntos. Cada nodo, excepto el raíz, tiene un único
padre y no tiene hijos o tiene uno o dos hijos. El hijo izquier
do siempre tendrá un valor menor y es la raíz del subárbol
izquierdo y el derecho siempre tendrá un valor mayor y es la
raíz del subárbol derecho.
V )
fia 0
Especificación lógica del TOfl RBB
( ^
OPERACIONES
CREAR
UTILIDAD: crea o inicializa un árbol.
ENTRADAS: el espacio de memoria donde se creará el árbol.
SALIDAS: tí árbol inicializado.
PRECONDICIÓN: ninguna
POSTCONDICIÓN: el árbol está inicializado (sin elementos).
BUSCAR
X UTILIDAD: busca un elemento dentro del árbol ABB.
"""""-•v ENTRADAS: el árbol ABB donde va a buscar y el elemento
N. (valor) por localizar.
\ \ SALIDAS: regresa falso si valor no se encuentra en el árbol o regresa
\ verdadero si encontró valor en el árbol y un apuntador P
\ almacena la posición dentro del árbol donde está valor.
\ PRECONDICIÓN: existe el árbol ABB.
POSTCONDICIÓN: ninguna.
, INSERTAR
UTILIDAD: inserta un nuevo elemento dentro del árbol ABB.
/ ENTRADAS: el árbol ABB donde va a insertar el elemento y el
/ / elemento nuevo.
/ / SALIDAS: el árbol tiene un nuevo elemento (nuevo) insertado como
/ / hoja en la posición que le correspondía, según su valor.
y^ PRECONDICIÓN: el árbol ABB existe y el elemento nuevo no está en él.
POSTCONDICIÓN: el árbol ABB contiene al elemento nuevo insertado como
,.-■'' una hoja.
BORRAR
UTILIDAD: elimina un elemento del árbol.
ENTRADAS: el árbol ABB de donde se va a eliminar el elemento y el
elemento (dato) a borrar.
SALIDAS: regresa falso si dato no se encuentra en el árbol; regresa •
verdadero si encontró dato en el árbol y lo pudo
eliminar, en cuyo caso, regresa el árbol modificado.
PRECONDICIÓN: el árbol ABB existe y el elemento dato se encuentra en
dicho árbol.
POSTCONDICIÓN: el árbol ABB contiene un elemento menos (dato).
^ )
• 0
Fstructuras jerárquicas y árboles binarios de búsqueda
RECORRER
UTILIDAD: despliega los elementos almacenados en el árbol.
ENTRADAS: el árbol ABB a desplegar y el orden en que se
desplegarán los elementos.
SALIDAS: cada nodo en el árbol se procesa exactamente una vez.
El orden en que se procesan los nodos
• depende del valor de orden. Si orden es:
PREORDEN: Cada nodo se procesa antes que cualquiera de los nodos
existentes en sus subárboles.
INORDEN: cada nodo se procesa exactamente después de procesar
todos los nodos de su subárbol izquierdo, pero antes de
procesar los de su subárbol derecho.
POSTORDEN: Cada nodo es procesado después de que se procesaron
los nodos existentes en ambos subárboles.
PRECONDICIÓN: existe el árbol ABB.
POSTCONDICIÓN: ninguna.
V ) : I
¿Cómo se realiza la búsqueda en un ABB? \ \
> \\
i
\\
La idea básica del algorimo de búsqueda consiste en comparar la in-
formación del nodo con la del valor buscado; si no son iguales, el
apuntador de búsqueda se mueve a la izquierda o a la derecha del valor
buscado, según sea menor o mayor, comenzando por la raíz y hasta
que se encuentre o no el valor.
El algoritmo se puede describir con los siguientes pasos:
o •
¿Cómo se realiza la inserción de un elemento en un fiBB ?
( ~* >
flL. / ia ,? ia 12
2i
7 21 ^ "^y pC / i
4 9 IB 23 & O 13 ^ 4 9 16 v 23 4 9 18 35
2 a 13 19 2 (J @ 19 2 S 13 19 ¿? 2 8 .13 19
¡ÉÍÍITOI
>> , . . . . ^
Figura 8.4. Movimiento de apuntadores para buscar el elemento 13.
¡r \
^ Buscar
J
V1& *" el 15 12 13
J 2i 7 0
4 2 4
<& $9 3 0 ¿? $[ 23 9 18 ^8
2 & <$ 19 2 ($ © 19 2 3' 13 19
X . Puesto que no existe.
13
se detecta el nodo padre
de! 15 en la inserción
V
Rgura 8.5. Inserción de un elemento en un ABB.
I )
. 6
Estructuras jerárquicas y arboles binarios de búsqueda
g •
¿Cómo se realiza la eliminación de un elemento en un flBB?
5 s 19
J& © 0 / ©
Se busca el elemento
19
I ® 9 « « J& &
9 2
/ 0 $ ~& <¡* El padre del nodo
/ borrado cambia su
y apuntador al hijo del
S / nodo borrado
^ y \
Figura 8.7. Eliminación de un nodo con un hijo: se elimina el 21.
)
3. El nodo por borrar tiene dos hijos. Puesto que el padre del que se va
a eliminar no puede heredar dos apuntadores, se busca un valor sus
tituto del valor por borrar y el nodo no se borra físicamente. Se
puede escoger como sustituto al predecesor del que se eliminará (el
valor mayor de todos los valores menores; o bien, de los nodos del
subárbol izquierdo el de más a la derecha), y se elimina físicamente
el nodo donde se encuentre (figura 8.8). Se puede asegurar que la
baja física del nodo sustituto cae en alguno de los dos primeros casos.
De igual manera, se puede considerar al sucesor como valor sustituto.
• @
Estructuras jerárquicas y arboles binarios de búsqueda
7 21 7 21 7 21
4 9 16 4 9 16 4 8 16
9 8 13 19 a B 13 19 a 13 19
PREDECESOR SUCESOR
Q •
¿Qué uentajas ofrece un HBB sobre el algoritmo de la búsqueda binaria?
• ñ
Estructuras jerárquicas y arboles binarios de búsqueda
f Raíz >L
8
KEH HH3—-■ S I S
6 T
Q •
¿De qué manera se implementan las operaciones y/o aplicaciones sobre arboles binarios?
* * \ \ class NodoÁrbol
\. (public:
\ \ tipoinfo info;
\ NodoÁrbol *izq, *der;
\ \ NodoArbolO {izq=der=NULL;}
NodoArbol(tipoinfo dato)
I {info=dato; izq=der=NULL;}
/
I / A i
/ / class ABB
/ / {prívate:
NodoÁrbol *raiz;
public:
..-"''* ABB() {raiz=NULL;}
~ABB() //se requiere un destructor
//otros métodos...
U
• Q
istruLturas jerárquicas y arboles binanos de búsqueda
NodoABB *p=raiz;
while (p!=NULL)
I if(p->info s s valor)
' return(p);
• else
p=(p->info > valor? p->izq: p->der):
I
return(NULL);
/
I
y *
¿En qué consisten los recorridos en un árbol binario?
• 6
Estructuras jerárquicas y árboles binarios de búsqueda
^ Ejemplo
f Preorden: = </&?$+^\
0^ Inorden: /&<? = +$
-A Postorden: &/?< + $ =
Preorden converso: =$+<?/&
<* ^ ^ Inorden converso: $+=?<&/
& Postorden converso: +$?&/<=
Nivel por nivel: =<$/? +&
V / /' /-
Figura 8.10. */ / /
r /
t /
i /
i ( EJERCICIOS 1 ® / /
Q •
Ejercicios
• g
Estructuras jerárquicas y árboles binarios de búsqueda
8. Para cada uno de los siguientes incisos, dados los recorridos, cons
truya el árbol binario correspondiente:
a) Inorden: ? / - X + % * * # & 3 l ¿ @
Postorden: ? ? - / X % * & X 3 ¿ $ @ #
b)Preorden: 3 1 9 4 7
Postorden: 7 4 9 1 3
6 •
Rutoeuaiuación
\ \ r— HUTOEUflLUnCIÓN < \ =
\ \ I I
\ 1 I
a) 5 b)8 c)9 d) 13 e) 15
• 0
Estructuras jerárquicas y árboles binarios de búsqueda
a) 5 b) 6 c) l d) 0 e) 2
A
a) Preorden converso: A$#+°*R3@X9
^ b) Postorden: °+ #$RX9@3*A
3 R # c) Inorden converso: $+ °#AR*X@93
d) Todos los anteriores
e) Ninguno de los anteriores
@ •
Rutoetialuación
: a ) U * Z M 8 P R E + C5
/ b)5C + E R P 8 M Z * U
/ / c)C 5 + R E M 8 P * Z U
/ / d) U Z * P 8 M E R + 5 C
/ / e)U*MR + C 5 Z 8 P E
• 0
Estructuras jerárquicas y árboles binarios de búsqueda
0 •
Capítulo Q
OBJETIVOS
Q
Arboles HUÍ
o •
¿Qué es un árbol balanceado?
Figura 9.2.
'---... Por lo tanto, se tiene que el número máximo de nodos en un árbol bi-
**\ nario de altura k es de: 2 M .
X \ Ahora bien, si la altura de un ABB determina el número máximo de
\ \ comparaciones al buscar un elemento, ¿cuántas comparaciones se
\ \ harán al buscar un elemento en un ABB ideal que tiene n elementos?
\ \ De acuerdo con el análisis que hemos hecho, la respuesta se obtiene
\ al encontrar el valor de k, dado el valor de n para la fórmula:
\ \ n = 2*-l.
Por lo tanto, despejando k, aplicando las leyes de los logaritmos, se
/ '} obtiene
/ / k = log2(» + 1).
/ Entonces, la cantidad máxima de comparaciones a realizar en un
/ ABB ideal de n elementos es:
y / log2(n+1)
En este caso, se puede comprobar que la fórmula coincide con la
„--'* de la búsqueda binaria en un arreglo, si se complementa con la fun
ción techo:
riog 2 («+ i)i.
Lo anterior nos lleva a concluir que, para que el peor caso de una
búsqueda en un ABB se cumpla con la mayor eficiencia posible, el #
ABB debe estar balanceado.
Sin embargo, las operaciones de un ABB no aseguran que se cum
pla el balanceo, por lo que se necesita una mejora en las operaciones,
sin demeritar su eficiencia. Hasta ahora, no se ha encontrado la forma
eficiente de mantener un ABB totalmente balanceado.
• ~ Q
Arboles flt/L
o o ?\ tC \
Figura 9.3. Ejemplos de árboles AVL. El contenido de un árbol AVL debe cumplir con las re
glas de un ABB,
o •
¿Cómo se realiza el proceso de inserción de un elemento en un árbol RllL?
( > ^ ^
\ \ V )
\ \ Figura 9.4. Árbol AVL con sus factores de balance en cada nodo.
• 0
Arboles flUL
1. El árbol AVL carece de nodo pivote. Esto significa que todos los an
cestros del nuevo nodo tienen un FB igual a cero (figura 9.5). En este
caso, el nuevo nodo no desbalancea el árbol y sólo se tendrán que
ajustar los valores de los FB de todos los ancestros, volviéndose
positivos o negativos, según el valor del nuevo elemento.
o >o oQ / /
i ' * ' /
oO oO o Os o oO +^ oO ' /
N>
Nuevo nodo
o
Nuevo nodo j
/ /
;
Al hacer- la inserción
sólo se aiustan los FB
y +
y\ +
\~
+
°o °o 0 oO oo ° o o o
oO O o O oo
Nuevo nodo Nuevo nodo
l
Figura 9.6. Existe nodo pivote y la inserción se realiza sobre el subárbol
)
más pequeño del nodo pivote.
0 •
¿Cómo se realiza el balanceo en un árbol flUI?
A—i ^
^ S ( Resto del árbol ) ( Resto del árbol )
+
C^\ Nodo pivote j T O
A © °& A
X~\^ Ajustar FB en
I \ h f\ A A / \ ruta de búsqueda
l\ A-A A-A ^
/■W'\ r~\
h\l'\o Nuevo nodo
y Nuera nodo J
Figura 9.7. Esquema de la rotación simple izquierda. Los triángulos representan subárboles de cualquier altura (la
misma para todos). La rotación hace un balanceo a partir del nodo pivote y el resto del árbol no se afecta. Obser
ve que el valor A es mayor que B y hay congruencia después de la rotación. La imagen de la RSD se obtiene
viendo este esquema a través de un espejo
. 0
Arboles HUL
r ,— =) , , >
Resto del árbol } ( Resto del árbol
T —— ■ 1
ROTACIÓN DOBLE
B Nodo pivote fe )v
/ \ ° Cc^ \ —*" A \
L Nuevo nodo
Figura 9.8. Esquema de la rotación doble izquierda. Los triángulos 1 y 4 representan subárboles de cualquier altu
ra; tas triángulos 2 y 3 son subárboles con una altura menor en un nivel, con respecto a I y 4. La rotación hace un
balanceo a partir del nodo pivote; el resto del árbol no se ve afectado. Observe que el valor C es mayor que B y me
nor que A, por lo que hay congruencia después de la rotación. El esquema de RDD se obtiene viendo este esquema
a través de un espejo.
e
-> Modificar apuntadores y FB (rutina que realiza la rotación
simple).
*
¿Cómo se realiza un balanceo en un árbol fllíL?
Si no,
-> Modificar apuntadores y FB (rutina que realiza la rotación
doble).
• — 3
Arboles HUL
Hijo izquierdo de P4 = P3
Hijo derecho de P4 = P2
-> ** seguir en 3.4
si no
Hijo izquierdo de P3 = hijo derecho de P4
Hijo derecho de P2 = hijo izquierdo de P4
• Hijo derecho de P4 = P3
Hijo izquierdo de P4 = P2
-> ** ira 3.b .-—
y'"
3.a Si la información del nuevo nodo es menor que la información de P4:
modificar FB desde el hijo derecho de P3 hasta el padre del
nuevo nodo
modificar FB del nodo señalado por P2 (ahora vale +1)
si no /
Si la información del nuevo nodo es mayor a la información de P4:
modificar FB desde el hijo izquierdo de P2 hasta el padre
del nuevo nodo
modificar FB del nodo señalado por P3 (ahora vale -1)
modificar FB del nodo señalado por P2 (ahora vale 0)
e •
Ejemplo
^ Ejemplo
* \ o0 - es ggi o °C>
X. *
^^ *
\ \ La inserción inicial se realiza como en un ABB:
+
0 Jtot, ■ &. oo
/ /
>^ /
^ El nodo pivote es el 45 y la inserción provoca una rotación simple a la
izquierda, que genera el siguiente árbol:
• Q
Rrboles RUI
^J Ejemplo (continúa)
0
Casos
C a s o s (figura 9.13)
• Q
Arboles mu
1 +
CAS0 1 A ° AS
Altura
sin cambio
/ 1 2 / 1\ / 2 \
í = i A_A '—* A_A
A> ° .----■
CASO 2 J&-- A^V
Altura
—*■ reducida x*"
CASO 3.1
,; +
■ A A 0\ "
Q
B AJ
¿ A
+
A
A B Altura
sin cambio
/ ^TAV °/B£ \
/^ Altura
/ ^ / \ reducida
^¿AÁ\ AAAAAA
+
CASO 3.3 X
~X¿1+ * ÍT AV>a+
G p Altura
\ Z A ^A reducida
A AA A A AA A
/ \ /\ /\ M / \ M /a\ M
í=sá=i tutu
v y
^^ Figura 9.13. Esquemas de rotación para eliminar un elemento.
Casos
• 0
Rrboles miI
% Ejemplo
tr@ / /
t /
t /
I /
\ \V
B balanceo se realiza por medio de una rotación doble izquierda; el
árbol queda en la siguiente forma:
l )
I .
Ejemplo
^ Ejemplo
• @
Arboles RUI
class NodoAVL
{ public:
tipoinfo info; \
char FB; lio altura del subarbol \
NodoAVL *izq,*der; } ; \ ^
class AVL
i prívate:
NodoAVL *raiz;
public:
i ¡métodos correspondientes);
Q •
¿Cómo se puede representar el TDR árbol RUI en memoria?
• Q
Árboles BUL
\ \
/* VERIFICACIÓN DE CASOS SEGÚN EL NODO PIVOTE */ \ \
if (p2 == NULL) modiftca_FB(*raiz. nuevo): /* SI NO EXISTE NODO \
PIVOTE */ \ N.
else *\ ^^^^_
if(((p2->FB==l)&&tnuevo<p2->info))¡¡((p2->FB== })&& (nueva>p2- " \
>info)Jmodifica_FB(p2, nuevo); f* INSERCIÓN EN SUBÁRBOL "'---._
PEQUEÑO DEL PIVOTE */
else
/* CASOS DE ROTACIÓN */
/* P3 SE AJUSTA AL SUBÁRBOL MÁS GRANDE DE P2 Y COMPARAN-
DO EL VALOR DEL NUEVO NODO CON RESPECTO A P3 SE DECIDE
SI ES UNA ROTACIÓN SIMPLE O DOBLE */
if (p2->FB = = ¡) { p3 = p2->der;
if (nueva > p3->infa) rotacion_simple(raiz, pl,
p2,p3, nuevo);
else
{ p4 = pS->izq; rotación_dobie{raíz, p¡, p2, p3,
p4, nuevo):}
}
else { p3 = p2->izq;
if (nuevo < p3->infa) rotación _simple(raiz, pl,
p2, p3, nuevo):
else
{p4 = p3->der: rotación_dable(raiz.p¡.p2,p3,p4.
nueva);}
i
Q •
Ejercicios
i ( EJERCICIOS ) &
O
1. Realice la implementación de una rutina que sirva para verificar si
un ABB es un árbol AVL.
• [fl
Arboles RUÍ
O 0
Inserte Inserte Inserte
5
cuart0
primer segundo tercer elemento , T M
elemento elemento elemento quinto elemento
i
°o—"rijo ^ v >
Inserte Inserte
sexto elemento séptimo elemento
Q •
Ejercicios
\ & \ & \
/ t
• 8
Arboles MJL
1 2 3 4 5 6 7 9 9 10
1 1 1 i 1 1 1 1 1 i — 1 '• ^^"-^
INFO 5 - 7 13 15 9 - 17 11 3
' RAÍZ = 4
IZQ 10 0 0 1 0 3 2 5 0 0
DISP = 7
D E F I 6 0 0 a 0 9 0 0 a O
L I L I l L I I I I
8 •
Hutoeuauuación
í HUTOEURLUflCIÓN C\ -
i !
k _ _ _ _ _ . _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ . _ j
1
\ \ 5 0
\ 2 CONDORES 0 ' 0
\ 3 0 0
• 4 BORREGOS 6 2
5
I 3 ' 0~
6
/ ;'' ÁGULASBLANCAS 0 7
7
/ / AZTECAS 0 0
/ / RAÍZ = 4 DISPONIBLES = 1
. 0
Hrboles RUL
y •
Capítulo t-z
• ^H II
auros ^
OBJETIVOS
3
Grafos
¿Qué es un grafo?
El grafo es una red de elementos conectados entre sí. En la actualidad
se le considera una de las herramientas más utilizadas para modelar
problemas reales, ya que, generalmente, algunos componentes de estos
problemas interactúan. lo que fácilmente puede representarse en un
grafo.
El grafo podría explicarse como la red de carreteras de un país
(figura 13.1), que tiene un conjunto de ciudades conectadas a través
de caminos. No todas las poblaciones tienen la misma cantidad de vías,
y no necesariamente se puede llegar directamente de una ciudad a otra.
l A\ J
Torreón ^V^ Uopi«rty
g _ •
¿Cual es la especificación lógica del TDfi grafo?
Sg /" \
ELEMENTOS: un grafo consiste de nodos y arcos. En general, cada nodo
puede contener más de un valor, sin embargo, el caso par
ticular es que almacene una única llave, de tal forma que
por ésta se identifique a cada elemento tipoinfo.
ESTRUCTURA: posee una estructura de red. Cada arco establece una relación
uno-a-uno entre dos nodos. Un par de nodos puede estar
conectado por un único arco, pero cada nodo puede conec
tarse a cualquier conjunto de nodos.
V '. /
• Q
Grafos
( \
CREARGRAFO
ENTRADA: Ninguna
SALIDA: El grafo GRAFO inicializado.
PRECONDICIÓN: Ninguna.
POSTCONDICIÓN: El grafo queda inicializado.
BUSCARNODO
ENTRADA: El grafo GRAFO y el elemento por buscar NODO
SALIDA: VERDADERO si el elemento NODO está en el grafo
GRAFO y un apuntador P almacena la posición de ese
elemento en el grafo; FALSO en caso contrario.
PRECONDICIÓN: El grafo GRAFO existe.
POSTCONDICIÓN: Ninguna.
BUSCARARCO
ENTRADA: El grafo GRAFO y el arco por buscar (NODOl, NOD02).
SALIDA: VERDADERO si el arco formado por NODOl,
NOD02 existe en el grafo GRAFO; FALSO si no.
PRECONDICIÓN: El grafo GRAFO existe.
POSTCONDICIÓN: Ninguna.
INSERTARNODO
ENTRADA: El grafo GRAFO y el elemento por insertar NODO
NUEVO.
SALIDA: El grafo GRAFO contiene un elemento más.
PRECONDICIÓN: El grafo GRAFO existe y el elemento NODO NUEVO
no existe en el grafo.
POSTCONDICIÓN: El grafo GRAFO contiene un elemento más.
INSERTARARCO
ENTRADA: El grafo GRAFO y el arco por insertar (NODOl,
NOD02)
SALIDA: El grafo GRAFO contiene un arco más.
PRECONDICIÓN: El grafo GRAFO existe, los elementos NODOl,
NOD02 existen en el grafo, y el arco definido por
NODOl, NOD02 no existe en el grafo.
POSTCONDICIÓN: El grafo GRAFO contiene un arco más.
BORRARARCO
ENTRADA: El grafo GRAFO y el arco por borrar (NODOl,
NOD02).
SALIDA: El grafo GRAFO tiene un arco menos.
PRECONDICIÓN: El grafo GRAFO existe y el arco definido por NODO1,
NOD02 existe en el grafo.
POSTCONDICIÓN: El grafo GRAFO tiene un arco menos.
V )
% *
¿Cómo se puede representar el TDR Grafo?
í >
BORRAR NODO
ENTRADA: El grafo GRAFO y el elemento a borrar NODOVIEJO.
SALIDA: El grafo GRAFO tiene un elemento menos.
PRECONDICIÓN: El grafo GRAFO existe y el elemento NODOVIEJO existe
en el grafo y no tiene conexiones (arcos definidos).
POSTCONDICIÓN: El grafo GRAFO tiene un elemento menos.
V _ ) !
¿Cómo se puede representar el TDA Grafo?
Hay diferentes formas de representar un grafo; entre las más comunes
están:
Matriz de adyacencias
Una de las representaciones más sencillas de un grafo es la denomi
nada matriz de adyacencias, que consiste básicamente en un arre
glo bidimensional de tamaño n X n, donde n es la máxima cantidad
de nodos en el grafo. Cada casilla de la matriz será llenada con ver
dadero o falso, según exista o no un arco que conecte los dos nodos
involucrados (figura 13.2). Para el caso de los grafos no dirigidos, la
matriz será simétrica; sin embargo, esto no ocurre en los digrafos,
donde se debe considerar la dirección explícita de cada uno de los
arcos.
Para el caso de los grafos ponderados, la matriz puede llenarse con
el peso asociado a cada uno de los arcos.
La principal ventaja de este tipo de representación es su simplici
dad, ya que resulta relativamente fácil realizar cada una de las opera
ciones descritas para un grafo. Desafortunadamente, esta representa
ción tiene una fuerte desventaja: está limitada a un número máximo de
nodos en el grafo, lo que provoca que, en cierto momento, sea imposi
ble almacenar más información o que, por el contrario, si se supone un
número máximo muy grande, se desperdicie una gran cantidad de me
moria. Para el caso de un grafo no dirigido el desperdicio sería mayor.
ya que, al ser simétrica la matriz, la información está duplicada.
A B C D E '
Q¡L jQ. A F F V V I V "
\^ B F F V V F
pxrfV_— -© C V V F~ F F
J * / D V V F F V
E V F F V F
V )
o
0^
Grafos
Lista de adyacencias
En esta representación, generalmente dinámica, se trata de evitar el
problema de restricción de espacio. Básicamente consiste en definir
una lista encadenada de nodos y, para cada uno de ellos, encadenar una
lista con los nodos adyacentes. La idea es similar a la de la matriz; sin
embargo, no define las casillas de los nodos que no tienen un arco
común, ahorrando un poco de espacio.
En este tipo de representación se desperdicia mucho espacio cuan
do se almacena un grafo no dirigido ya que, al igual que en la matriz
de adyacencias, la información de cada arco está duplicada; pues hay
un arco de un nodo a otro y viceversa. Sin embargo, esta representa
ción es la más utilizada cuando se tiene que almacenar un grafo disper
so (sparse graph), donde la cantidad de arcos es mucho menor que el
cuadrado del número de nodos (existen pocas conexiones).
Este tipo de representación se muestra en la figura 13.3:
f NODOS A
B B J-*-HTT~H o l/|
T
"D]V| A I W B I -W E 1/1
Lista de arcos
Una tercera alternativa de representación, usada preferentemente cuan
do se tienen digrafos es la lista de arcos. En esta representación se
mantiene una lista de nodos (al igual que en la lista de adyacencias)
pero, en lugar de almacenar los nodos vecinos, se mantiene una lista de
arcos para cada nodo, en la que se tiene la información necesaria para
determinar cuál nodo es el primer elemento cid arco (origen) y cuál es
el seoundn MestinrO Fs una rpnrpspnt'irión Hnndp s;p minimiza el dPS-
oerdfcio i ^ o ^ ^ ^ ^ d o d e c ^ o S oara su ma
ycaaa^
figura iT*
Q •
¿Cómo se puede recorrer un grafo?
~ \ .Apuntador al siguiente
* Apuntador al siguiente * arc D d m d e N 0 D a
¥ arco donde NODO DC H „ c r in r l
Apuntador al es desuno
V siguiente nodo J
Figura 13.4.
NOOOS
A
r —-. A A
BüáaZT' í
Figura 1 3 . 5 . Representación del grafo en lista de arcos.
. @
Gratos
Nota: el orden del recorrido de los nodos vecinos depende de cómo es
té representado el grafo.
^ Ejemplo
ABEHCGIJDF
Figura 13.6.
v J
g •
¿Cuáles son algunas aplicaciones importantes de gratos?
^t Ejemplo
fs\ se supone que los elementos del grafo están almacenados en order?\
alfabético, el recorrido primero en profundidad, partiendo del nodo A
sería:
EJEMPLO DE DEPTH FIRST
• — 6
Gratos
más corta (o el costo más pequeño) de un nodo del grafo hacia el res
to de los nodos. Estas dos aplicaciones son vitales en actividades como
la instalación de redes computacionales, optimización de rutas y algo
ritmos de transporte.
A continuación se presentan los algoritmos correspondientes a estas
dos aplicaciones:
^ Ejemplo
2 fiJ 2
A B EM A B
9
B
« * c B
D E D E
7
7 0 D c E F/ D/ D Colaphorizada
fe 12 10 8 9 3 * - »
^ ^ l Figura 13.8. J
y •
!
. o
brafos
U Ejemplo
— <a> ®———#
K
/*£_ ^a D — (^ -*- CMC
7
Cola Priorizada
V. Figura 13.9. J
6 •
Ejercicios
<|| Ejemplo
<L I
Matriz original Cerradura transitiva
| 1 2 3 4 1 2 3 4
1 0 1 0 0 1 1 1 1 1
2 0 0 0 1 2 1 1 1 1
3 1 D 0 0 3 1 1 1 1
4 0 0 1 G 4 1 1 1 1
\^ Figura 13.10. J
EM
2. Trace un grafo dirigido que corresponda a la siguiente relación: x es
tá relacionada con y si x-y es divisible entre 3 (considere que x y y
son los enteros del 1 hasta el 12)) Para el grafo obtenido:
• 0
Gratos
1 2 3 4 5 6 7 8
INFO A C E D E GRAFO = 6
SG
I ^J^J^X^l-I- D!SP1=5 LISTADENODOS
ADY 6 1 ID" T 9
1 2 3 4 5 6 7 8 9 10
OEST r g a 1 "4 | 3 | 3 6 | 3
SE ~~5~ ~7 j j o " D [ D i O ~0~ ~4~ " a " DISP2 = 3 LISTA DE ADYACENCIAS
■ I 1 ^ — 1 — ^ ■ 1 1 I p I 1 , J. , 1 ,1 I
0- .
flutoeualuación
a) b)
c) d)
; AUTOEUflLUnCIÓNC\ -
i !
b - - - - - - - - - - - _ _ - _ - _ - _ _ _ _ _ _ _ - _ — _ j
a) 10 b)20 c)25 d) 9 e) 15
• Q
Graíos
a)HGJDIEFCAB b)HCABFEGIDJ
c)HCFGAIDEBJ d)HCFAIGDJBE
a) 22 b) 27
c) 31 d)33
1 —7 DV
. 1 2
C - 1 - E
0 •
flutoeualuación
a). b).
o o o a
^1\|/* Ni—i \
\ \
\ *
6 ó 6— *
\ i
/ j
/ i
/ t
J i
/ i
• 0
OBJETIVOS
• Definir que es un heap.
• Entender la forma en que se puede representar un heap en memoria.
• Describir el diseno logico del TDA heap, incluyendo las operacio
nes de creation de un heap, insertion y elimination de elementos
del heap.
• Comprender las aplicaciones de un heap utilizado como cola priori-
zada.
• Describir el algoritmo de construction de un heap a partir de una lis
ta de elementos.
Q
Heaps
( A "I
5 8
4 r | 6
V J
Figura 12.1
*íp ELEMENTOS: los elementos de un árbol heap son nodos. Cada uno contiene un
dato (simple o estructurado tipoinfo) único en el árbol.
ESTRUCTURA: un árbol heap posee una estructura jerárquica (a excepción del ár
bol vacío). Cada nodo contiene un elemento de un conjunto orde
nado de valores; los nodos forman un árbol binario completo, de tal
forma que cada padre contiene un elemento de mayor prioridad que
^
Q •
¿Como se puede representar el TDfl heap?
sus dos hijos (la prioridad se establece con relación a los va
lores almacenados, es decir, a menor valor, mayor prioridad, o a
mayor valor, menor prioridad). La relación de la prioridad se
puede establecer como mayor o mayor-igual.
OPERACIONES
CREARHEAP
ENTRADA: Ninguna
SALIDA: El árbol heap creado.
PRECONDICIÓN: Ninguna
POSTCONDICIÓN: El árbol heap creado sin elementos.
CONVIERTEHEAP
ENTRADA: Una lista de N elementos.
SALIDA: El árbol heap de N elementos creado con base en la
lista dada.
PRECONDICIÓN: Ninguna
POSTCONDICIÓN: El árbol heap de N elementos creado.
INSERTAR
ENTRADA: Árbol heap sobre el que se realizará la inserción y el
elemento a insertar nuevo.
SALIDA: El árbol heap contiene un nuevo elemento nuevo.
PRECONDICIÓN: El árbol heap existe.
POSTCONDICIÓN: El árbol heap tiene un nuevo elemento colocado de
acuerdo con su prioridad.
BORRAR
ENTRADA: Árbol heap sobre el que se realizará la baja.
SALIDA: El árbol heap condene un elemento menos (se eliminó
el elemento de mayor prioridad la raíz del heap).
PRECONDICIÓN: El árbol heap existe.
POSTCONDICIÓN: El árbol heap tiene un elemento menos.
V )
¿Cómo se puede representar el TDA heap?
• 0
Heaps
í 1 2 3 4 5 6 7 B 9 10
rr- P T 1—■ r T T 1 j r———
Figura 12.2.
C ^ ^
/ N. »> 1 2 3 4 5 E 7 8 9 10
JK JK l*H 8 l 4 l 1 l a H a l I H
l!
Figura 12.3.
)
Con lo anterior se pudiera pensar que cualquier arreglo de valores se
puede transformar en un heap para aprovechar todas las facilidades que
ofrece este tipo de estructura de datos.
1. Todos los elementos del arreglo que corresponderían a las hojas del
árbol heap cumplen con sus propias condiciones. Dado que es un
árbol casi completo, entonces se cumple que la cantidad de elemen
tos que son hojas del heap es N/2 o N/2 + 1, dependiendo de si existe
• una cantidad par o impar de elementos en el arreglo.
¿Como generar un árbol heap a partir de un arreglo de elementos?
l.Aux=AP
2. Hijos = 2*AP
(hijos señala al hijo izquierdo del nodo apuntado por AP)
3. Mientras haya hijos de aux (hijos <= maxlista) y alguno de ellos sea
mayor:
- Encontrar el hijo mayor de aux (hijomay)
- Si hijomay > aux
-> intercambiar valores de aux e hijomay
aux = hijomay
hijos = 2*aux
si no
salir del ciclo. Jfe
• Q
Heaps
fS Ejemplo
r N
>
A continuación se muestra, paso a paso, la construcción de un árbol
heap a partir de una secuencia de valores que no necesariamente repre
sentan un heap.
1. Localice, dentro del arreglo (figura 12.4), los elementos que esta
rían como hojas del árbol heap, que se ubican en la segunda mitad
del arreglo.
5 jg> ^ S 5 17 19 21 28 ... I
@ ^ 0 1 2 3 4 5 6 ...
Figura 12.4.
t
hea
_ ^ P heap
8 8 5 |2ET|T9~[BI]77 | T T j 8 21 28 19 5 17 | . . . "
1 2 3 4 5 6 ... 1 3 3 4 5 6 . . .
í í
heap
I y
SB 21 8 19 5 17
1 2 3 4 5 6 ...
A
I
Figura 12.5.
o •
¿Cómo se utiliza una estructura heap en una cola priorizada?
f heap A
• Q
Heaps
U Ejemplo
f
A continuación se muestra un ejemplo de cómo eliminar el elemento^
de mayor prioridad en el heap (su raíz) y cómo añadirle nuevos ele
mentos, de forma que se conserve como una cola priorizada (figuras
12.6, 12.7 y 12.8).
Eliminación de la raíz
I"28I 21 I 17 I loT~5~] 8 I ...
i 1 1 1 1 1 i 1
ES 1 2 3 4 5 6.,.
0 5 8
fiel 21 I 17 I 1 9 | 5 I 8 I ... I
I I 1 I I !—_!
1 2 3 4 5 B ...
8 21 17 19 5 ^y¿ ...
1 2 3 4 5 6 ...
8 l 21 17 T19 T 5 T ...
1 9 3 4 5...
8 21 | 17 19 5 I ...
1 1 1—_J—_! 1
1 2 3 4 5 ...
211 8 l 17 p ü I 5 I I ...
1 2 3 4 5 ...
21| 19 I 7 l 8 I 5 I I ...
l i l i l í
1 2 3 4 5 . . .
Figura 12.6. ,
V y
o •
Ejemplo
( ^
* " %
I
/ ° \ / \ ~2B~ 21 [ 17 19 5 a so I... I
" 1 2 3 4 5 6 7 B ...
28 i 21 117 I 19 I 5 I 8 I 20 I 1777
I I I L_l I I I ¡'
1 2 3 4 5 6 7 8 ...
28 21 20 19 5 8 17
1 2 3 4 5 6 7 8 ...
28 21 20 19 5 8 17 7T1
1 2 3 4 5 6 7 8 ...
Figura 12.8.
V )
• fj
Heaps
Ejemplo
JN
A continuación se muestra un ejemplo del comportamiento del algorit-
mo de ordenamiento heapsort.
8 5 4 3 9 6 2
8 5 4 3 9 6 2
8 5 6 3 9 4 2
8 9 6 3 5 4 2
8 9 6 3 5 4 2
HEAP 9 8 6 3 5 4 2
2 8 6 3 5 4 I 9
HEAP 8 5 6 3 2 4 9
4 5 6 3 2
HEAP 6 5 4 3 2 8 9
Figu ra 12.9.
J
Ejercicios
2 5 4 3 6 8 9|
HEAP 5 3 4 2 í 6 '8 9
2 3 4 [~5 6 8~ 9
HEAP 4 3 2 I 5 6 ~8 9
2 3 I 4 ~~5~ 6 8~ 9
HEAP 2 3 r^ 5 ¡j 8 9
' —
2 3 I 4 5 6 ~~8 9
-
HEAP 3 2 [~~4 5 6 8 9
2 |3 4 ~5 B - "8 9
2 j3 4 5 6 8 ^9
Termina [s""-^ 4 5 B 8 9~
( EJERCICIOS \ ^
o
1. Se tiene un heap de 10 elementos con base en prioridades; cada ele
mento tiene una prioridad única, es decir, existen prioridades del 1
al 10. Si la prioridad 10 es la mayor y la 1 es la menor, ¿qué posi
ciones del arreglo que representa el heap puede ocupar el elemento
con la prioridad 2?
Tabla 12.1
Q •
Ejercicios
c 10:50:53 A 10:55:45
A 10:52:03 A 10:58:12
C 10:53:25 C 1V.Or.22
Tabla 12.2
• Q
Heaps
í nUTOEUHLUñCIÓNQ, =
' !
i i
a)84 39 56 21 39 42 21 21 81
b)84 39 81 21 39 42 56 21 21
c)84 81 56 39 39 42 21 21 21
d)84 81 56 21 39 42 21 21 39
e) Ninguna de las anteriores.
m
70 <3> (Sí ^
OBJETIVOS
■ Definir en qué consiste una estructura de datos sin relación o conjunto.
• Describir las características primordiales de los conjuntos ordinales y es-
tructurados.
• Explicar las formas de representación para un TDA conjunto.
• Describir en qué consiste la técnica hashing, como otra opción para imple-
mentar la búsqueda eficiente.
- Definir qué es una función hashing y cuáles son las alternativas para su di-
seño eficiente.
• Entender la importancia de contar con una estrategia para el manejo de ele-
mentos colisionados.
- Describir las diversas estrategias para el manejo de colisiones.
B
Hashing
¿Qué es un conjunto?
Considerando la definición matemática típica, un conjunto es. simple
mente una colección de objetos. Los objetos no mantienen ninguna
relación aparente entre ellos (como descendiente de..., anterior a...) y
tampoco están obligados a compartir atributos comunes, es decir, no
^ necesitan pertenecer a la misma clase; sencillamente están agrupados
en una misma estructura.
En el área computacional la noción de conjunto se restringe, ya que
se define como una agrupación finita de objetos, con características
comunes, que no presentan relación alguna entre sí. Esto quiere decir
que los elementos que pertenecen a un conjunto deberán compartir al
menos el atributo de tener el mismo tipo de datos. / /
De esto último se deduce que, en términos computacionales, se
pueden tener dos clases de conjuntos: con elementos atómicos o y con
elementos estructurados.
@ •
¿Cómo se puede representar un conjunto de elementos estructurados?
• 9
Hashing
8 •
¿Como diseñar una función hashing?
Selección de dígitos
Consiste, básicamente, en seleccionar algunos de los dígitos que confor
man la llave y con ellos generar un índice para el espacio de almacena- *
miento. Por ejemplo:
Residuales (división)
Esta función consiste, básicamente, en utilizar como índice el residuo de
dividir la llave con el tamaño máximo de almacenamiento, esto es:
• Q
Hashing
Esta es una de las técnicas más comunes debido a su sencillez. Sin em
bargo, para mejorar su eficiencia (de la distribución uniforme de índices)
se sugiere que el tamaño de espacio de almacenamiento sea un número
primo (para evitar que varias llaves obtengan el mismo residuo y, por
tanto, el mismo índice).
• Cuadrática (multiplicación)
Consiste en elevar al cuadrado el valor de la llave y, del resultado,
seleccionar los dígitos centrales (los más involucrados en las opera
ciones de multiplicación y suma); la cantidad de dígitos depende
exclusivamente del rango de valores válidos para el índice. Dicha
función se representa como:
H(llave) = dígitos_centrales (llave2)
Por ejemplo:
Folding (plegamiento)
Consiste, básicamente, en agrupar algunos de los dígitos que conforman
la llave y aplicarles algunas operaciones que permitan generar un índice
para el espacio de almacenamiento. Por ejemplo:
H ( d ^ d ^ d , ) = d, + d2 + 4 + d4+ d5
donde (k=d,<= 9 y ( k = H < = 4 5
8 •
¿Cómo funciona la metodología de direccionamiento abierto?
• Direccionamiento abierto
• Encadenamiento
• Prueba lineal
• Prueba cuadrática
• Prueba aleatoria
• Prueba doble hashing
. o
Hashing
^ Ejemplo
/^Para ilustrar el comportamiento de la prueba lineal cuando se utiliza un^
tamaño de paso N=l, suponga que sobre un arreglo de 11 posiciones
se insertará la secuencia de llaves (figura 11.1): 7, 17,6, 33, utilizan
do como función hashing: H(llave)=llave moa 11. La secuencia de
movimientos sería:
—r~~i—i—i—i—i—i—i—i—i—
7
I I I I 1 I I | I I
0 1 2 3 4 5 6 7 8 9 10
17 7
l l l l i l l I l l I
0 1 2 3 4 5 6 7 8 9 10
17 7
I i II M I i i I
G 1 2 3 4 5 6 7 B 3 10
Q •
Ejemplo
17 7
0 1 2 3 4 5 6 7 8 9 10
i i i i i i ITTI i |
17 7
0 1 2 3 4 5 6 7 8 9 10
— i — r — i — i — r — i — i — i — i — i —
17 7 o
1 , 1 1 1 1 1 1 1
0 1 2 3 4 5 6 7 8 9 10
i n I I I I I I I I !
33 17 7 6
0 1 2 3 4 5 6 7 3 9 10
Suponga que en el estado actual de la tabla se decide agregar un par de
nuevos elementos: 28 y 52 (figura 11.2). Siguiendo el mismo proceso
de solución de colisiones se llegaría al siguiente estado de la tabla :
. . . 1 . 1 1 . 1—
33 17 7 6 28 52 \
— l — ! 1 — , — I — , 1
0 1 2 3 4 5 6 7 8 9 10
¿Cómo se modificaría el estado actual de la tabla si se decidiera añadir
el elemento 76 (figura 11.3)? La solución de esta colisión requeriría los
siguientes pasos:
—1 1 1 1 1 1 1 1 1
33 171 7 6 28 52 •
I I 1 I I I . 1 I I ,
0 1 2 3 4 5 8 7 8 9 10
33 17 7 6 28 52
' 0 1 2 3 4 5 6 7 B 9 ' 1 0
33 I 17 7 6 ] 28 52 '
0 1 2 3 4 5 6 7 8 9 10
—i—r~i—T~T—i—r~r—i—i—i
33 76 17 7 6 28 52
[ i : i l l
■ '0■■■2■3■4 -'- - - -'- ^L_0
Hashlng
3 •
¿Como funciona la metodología de Encadenamiento?
• 0
Hashing
( * ^ / / ^
1ra i r-' / /
9 2 / /
3 | 3 : /
4 4 _
5 ^□>n>n>a »_f |
6 6 V' \
7 7 \
8 8 \ \
l 1Ü 10 ) \ X
Rgura 11.4.
El algoritmo para este método es sumamente sencillo;
J ,' 0 1 2 3 4 5 6 7 8 9 10 11
/ / V I i l I, I, I i J J
^ ^ / Figura 11.5.
,..*'*' El algoritmo con el que trabaja este método es el siguiente:
s
0\
Hashing
( EJERCICIOS ) &
1. Se desea diseñar una función hashing para trabajar con llaves de tres
letras (L,L2L3).
Al aplicar la función se deberá generar un valor entre 0 y n - 1,
donde n es el tamaño de la tabla.
Al insertar la secuencia de llaves: PAL, LAP, PAM, MAP, PAT,
PET, SET, SAT, TAT, BAT. ¿cuál de las siguientes funciones has
hing es la mejor para los valores de «= 11, 13, 17 y 19?
6 •
Ejercicios
• 6
Hashing
MANEJO DE COLISIONES
6 •
Ejercicios
para manejar las colisiones, ¿cuáles serían las siguientes tres posi
ciones de la tabla que se verificarían si se insertara la llave 678 y la
posición 21 está ocupada?
• a
Hashinq
1
2 143012
3 198911
4 153926
5 152621
6 520851
7 -
8 191972
9 335872
10 151090
11 190890
12 150588
13 232371
|—±- .
Ejercicios
• Q
Hashing
REHASH1NC,
UTILIDAD: Sirve para obtener la posición de la tabla donde se insertará un
objeto, una vez que se sabe que colisionó.
ENTRADA: Tabla de hashing, la posición i donde colisionó inicialmente el
objeto y la llave del objeto.
SALIDA: Posición i de la tabla que está desocupada, en donde se puede
insertar el objeto.
PRECONDICIÓN: La tabla de hashing no está llena y el objeto no existe en la
tabla.
POSTCONDICIÓN: Ninguna.
@ •
Rutoetialuacion
• flUTOEUHLUflCIÓN <\ =
■
i i
h _ _ _ _ _ _ _ _ — _ _ _ _ _ _ _ — _ _ _ _ _ J
a) 1 b) 2 c) 3 d) 4 e) 5
d) 18,21,26 e)2,0, 11
a) 3 1 / 1 0 b)21/6 c)31/6
d)21/10 e)16/10
• 0
Hashing
0 1 2 3 4 5 6 7 8 9 ID
I I i i . I I
6 •
Capítulo^CI
OBJETIVOS
6
Arboles B
¿Qué es un árbol B?
Un árbol B es un tipo especial de árbol con determinadas propiedades
que lo hacen útil para guardar y accesar eficientemente a grandes can
tidades de información en memoria secundaria. Bayer y McCreight de
sarrollaron en 1970 la idea de los árboles B, motivados por encontrar
» una nueva técnica para administrar grandes volúmenes de información.
Al igual que en un ABB, en un árbol B la búsqueda de un elemen
to requiere del recorrido de un camino, desde la raíz del árbol hacia al
guna de las hojas; estos árboles están completamente balanceados, por
lo que se garantiza eficiencia en los algoritmos de búsqueda, inserción
y eliminación. Sin embargo, el proceso de inserción y baja de elemen- S
tos varía ligeramente respecto a un árbol binario tradicional.
A diferencia del árbol binario balanceado (AVL), los árboles B pue
den guardar en sus nodos más de un elemento y tener más de dos hi
jos, por lo que son árboles multicamino. Esta propiedad permite que
se almacenen grandes cantidades de información sin que la altura del
árbol sea muy grande, lo que optimiza los algoritmos de acceso en
memoria secundaria.
Una definición general del árbol B es la siguiente: \
( 7^ ^
. 10 15 20 (30 35 40 4 5 ;
^ . )
Figura 10.1. Ejemplo de un árbol B. Este árbol puede ser de orden 2 o de orden
3, sin romper ninguna de las reglas.
@ •
¿Cómo se realiza el proceso de inserción en un árbol B?
• 0
HrbolesB
* Se crea un nuevo nodo, que toma como único elemento el valor me-
Rrbo,e
dio y este nodo pasa a ser la nueva raíz del árbol.
Termina el proceso de inserción.
^c Ejemplo
aa 3B, 43 )
^ 30.38,43 ~*)
30.3a, 43. 56 ~ )
Vj )
6 •
¿Cómo es el proceso para eliminar un elemento en el árbol B?
H E j e m p l o (continúa)
^—-C 43 |.3~~—^-
( 3033 ") f SO, 56 )
• 0
Arboles B
( 10 15 aO ) (3035 40 4 ^
( 16 18 19 ) f31 32 33 34) 41 42 44 )
S F=^ N "^ \ .
/ 101530) ■ 3035 4045 **»,
Q_ #
¿Cómo es el proceso para eliminar un elemento en el árbol B?
( \
( 4 15 30 ) (3013540«I
<\Hx^ _-i~fiT2r>--_
( 133 ) ( 10 11 14 ) i ( gl 3334 ) C 3B 37 3B ) ¡ ( 36 37 3838) ( 47(43)49 )
\ \ ( 4 15 30 > ( 30 35 40 ")
^ ^
y / ( -' ( 41530 \
--o ('3035 40 431
>
_„„#-* (fjje3 ) ( 101114 ) ( 8133 34 ) ( 38 3 7 3 8 ) ( 3 6 3 7 3 6 3 3 ) I ( 474849 )
( IB 18 19 ) ( 3 1 33 3334) ( 41 43 45 )
, ñoratí* ™ « s 1
( 15 3 0 3 5 ) í" 30 3540 \
( IBiaiB ) ( 363738 ) ( 41 43 45 )
V )
Figura 10.9 Si el árbol es de orden 3, la eliminación del elemento 1 provoca la
unión del nodo donde se encontraba con su hermano adyacente y, además, la
transferencia de un elemento al nodo padre, para completar su cantidad mínima
de elementos. Observe que se movió un nodo de un hermano a otro.
• Q
Hrboles V,
16 IB 19 ) 26 27 es ( 41 4245^)
A - B¡*a ei elemento 23
_X T3Í3O30354048)~^
^ ■ ^ / /
0 •
¿Que uentajas ofrece un árbol B?
. 0
Arboles B
f — =T~^
ORDEN NUMERO DE ELEMENTOS
104 105 i D 6 1D? 108 109
16 4 5 5 6 7 8
32 3 4 4 5 6 6 .---""
64 3 3 4 4 5 5 ,-**'*
L ■ f-c . | . — 1 . —j- —,. — » ■■ I / * j S ^
v y / y<
Figura 1011 /
N •
¿Qué es un árbol B ?
Inserain del
' Hüsmsfito 2 8
/
/ ./ v
/ / (-5469 1012) ( 80 BIES 83") ( 85883031 )
'
"( 33 34 35 3¿P)
Ventajas de un árbol B*
• Mejor aprovechamiento del espacio interno de cada nodo en el árbol.
• En promedio, menor altura que un árbol B, por lo que genera mejores •
búsquedas.
Desventaja de un árbol B*
• Los algoritmos de inserción y eliminación son más complejos que en
un árbol B, por lo que se genera sobrecarga en el proceso.
Los árboles B+ surgen como una variante de los árboles B, para hacer
más eficiente su uso ante las necesidades de implementación de un ma-
nejador de bases de datos. La característica principal de estos árboles
es que contienen a todos los elementos del árbol en el nivel de los no
dos hoja Los niveles superiores contienen un mapa de llaves que
permite hacer las búsquedas aleatorias con la eficiencia ya conocida.
• Q
Rrboles B
( 7^ ^
Z
Mapa de llaves \^
(para realizar
Ventajas de un árbol B+
Desventajas de un árbol B+
6 •
Ejercicios
- \ \ vI ^ ])
\ V Figura 10.14. Árbol 2-3 en que los nodos guardan un elemento, pero simulan al
\ \ árbol B utilizando el apuntador derecho para señalar a un hermano o hijo.
Los árboles 2-3 representan una opción para manejar un árbol par-
/ i cialmente balanceado en memoria principal; además de los árboles
/ / AVL, aunque no son tan populares.
/ j
/ i
/ i
i ( EJERCICIOS ) &
% /
o
1. Dado el siguiente árbol B de orden 2: •
, < - - ^ ^ ,
(3035 j g0 5BB370)
• 0
Arboles B
5 10 15 20 ( 3 0 35 40 45 i
( i 534 ) ( 1 1 12 13 14^) ( 2 1 22 23 24 26 27 28 29 36 37 38 33 . 4 6 47 48 4 8
( S7 89 ~) ( i B 171B19^) 31 32 33 34 ¡ 4142 43 44
0 •
Ejercicios
. 1 2 3 4 5 6 0 1 9 3 4 5 6
f
I 6 0 [ l o | S0| 3 0 , 4 0 ' 5 0 | 6 0 2| al 4| 5 6J 7 I B
/ / CANTTELEM PADRE ELEM HIJOS
_
/ _ 1 Í 3 4 5 6 ~~0 i 1 3 4 5 6~~
6
/ r^i rn \' i2¡31 ~ i * 1 ° i °i °i °i °i °i °i °
/ / CANT.ELEM PADRE ELEM ^ ^ HUOS
; / / 1 S 3 4 5 6~~ ~~0 1 2 3 4 5 ÉT~
■^ / ^ ral PTJ 1111 igj 13| 14J 15| - ] ¡ o| O] O, O I O| O | O "
--''' CANT.ELEM PADRE ELEM ~~ HÜDS
.---''
1 2 3 4 5 6 0 1 2 3 4 5 6
PH n i I21J25Í27 2B\ - I -] 01 DI D 0 0 I 01 O
CANTJELEM PADRE ELEM HUOS
~J 2 3 4 5 6 ~~0 í 2 3 4 5 6
G p l rri 31 32 34 35 37 38 0 | 0 | 0 | Ol Ol OJ O
CANTJELEM PADRE ELEM HIJOS
C 1 2 3 4 5 6 0 1 2 3 4 5 6
Q [Tí [TI J4BJ47l48l - I - I -J ' Ol Ol OJ Ol OÍ Ol OJ
CANT_ELEM PADRE ELEM HIJOS
-, 1 2 3 4 5 6 0 1 2 3 4 5 6
/ Ríl [~T| "53|55| 571 - I * I - I ~0 0 O O O O 0
CANT.ELEM PADRE ELEM HIJOS
Q 1 2 3 4 5 6 0 1 2 3 4 5 6
H H JB4JBBJ B9J - I • j • I j Ol Ol 0¡ OJ o l OJ Og
CANTJELEM PADRE ELEM HUOS
_^ — o
Arboles S
10. Se tiene un árbol B de orden x con una altura w que guarda la se
cuencia de llaves desde 1 hasta k. Todos los nodos contienen la
mínima capacidad de elementos. ¿Cuántas llaves mínimo es nece
sario eliminar para que el árbol tenga una altura w - 1?
11. Se tiene un árbol B de orden x con una altura w que guarda la se
cuencia de llaves desde 1 hasta k. Todos los nodos contienen la
mínima capacidad de elementos. ¿Cuántas llaves mínimo es nece
sario insertar para que el árbol tenga la altura w + 1 ?
■yj 0
Ejercicios
12. Se tiene un árbol B de orden % con una altura w que guarda la se
cuencia de llaves desde 1 hasta k. ¿Cuál es el rango de valores
que puede tomar k si se sabe que w = 3 y x = 1 ?
13. Se tiene m árbol B de orden x con una altura w que guarda la se
cuencia de llaves desde 1 hasta *. Todos los nodos contienen la
mínima capacidad de elementos. ¿Cuál es la altura del árbol al
eliminar el elemento 1?
**X, 14. Se tiene un árbol B de orden x con una altura w que guarda la se-
^\ *\ cuencia de llaves desde 1 hasta k. Todos los nodos contienen la
^X \ mínima capacidad de elementos. ¿Cuál es el valor de k si se sabe
\ \ que x ss 5 y w = 3?
\ i
\ %
\ \ 15. Se tiene un árbol B de orden x con una altura w que guarda la se-
\ \ cuencia de llaves desde 1 hasta k. Todos los nodos contienen la
máxima capacidad de elementos. ¿Cuántas llaves mínimo es ne-
í cesario eliminar para que el árbol tenga una altura w - 1?
/ / 16. Se tiene un árbol B de orden x con una altura w que guarda la se-
/ / cuencia de llaves desde 1 hasta k. Todos los nodos contienen la
/ / máxima capacidad de elementos. ¿Cuántas llaves mínimo es ne-
/ / cesario insertar para que el árbol tenga la altura w + 1 ?
17. Coloque una V o una F, según sean verdaderas o falsas las aseve-
„.---''' raciones que se mencionan a continuación:
a) En un árbol B*, el proceso de inserción que se realiza en un
nodo hoja que está a 2/3 de su capacidad es idéntico al que se
realizaría en un árbol B.
b) En un árbol B*, la inserción de un elemento en un nodo lleno •
provoca siempre la creación de otro nodo.
c) Los nodos de un árbol 2-3 tienen capacidad para guardar dos
elementos y los apuntadores para tres hijos, incluyendo un
campo booleano que indica si un apuntador es hijo o hermano.
d) Todo árbol 2-3 es un árbol B* de orden 1.
e) En un árbol B+ de altura m, la llave x puede existir, a lo más,
en m nodos (cada nodo en un nivel diferente del árbol).
f) Los árboles B tienen una mayor resistencia a crecer que los
árboles B*.
g) En cuanto a la forma del árbol, todo árbol B es un árbol B* y
viceversa.
h) El proceso de insertar un elemento en un nodo que no está lleno
de un árbol B* es diferente al proceso del mismo caso en un
. _ 0
Arboles B
• 19. Si un árbol B+ tiene una altura x, ¿en cuántos niveles máximo del
árbol puede estar contenida la llave /? ¿En cuántos niveles míni-
mo del árbol puede estar contenida la llave /?
o *
Rutoeualuación
■ nuTOEunLuncióN Q , .
i i
i i
■._____ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ J
1. Dado un árbol B de orden 100 con una altura de siete niveles cuyos
nodos contienen la mínima capacidad de elementos, ¿cuántos ele
mentos tendrá el nodo raíz después de eliminar un elemento?
a) 100 elementos
b) 99 elementos
c) 200 elementos
d) 1 elemento
e) Ninguna de las anteriores
. 0
Arboles B
^ 5 1015gQJ ( M 35 40 45
a) de 1 ak
b) de 1a x
c) de 1 a 2k
d) de 1 a 2x
& e)de1ajc/2