You are on page 1of 45

Mdulo 2

Estructuras de
datos.


1


2.1- Introduccin.
Qu entendemos por ESTRUCTURA? Respuestas vlidas podran ser, por
ejemplo:
Una organizacin
Un esquema
Un ordenamiento
En el mdulo 1 hemos visto que un DATO es la informacin que
manejamos dentro de nuestros algoritmos, por lo cual podemos inferir que
una ESTRUCTURA de DATOS es un esquema que nos permite manipular
datos a fin de facilitarnos la resolucin de un problema, para el cual
aplicaremos algoritmos.
Es claro que un punto crtico en la solucin de un problema reside
justamente en encontrar una estructura de datos acorde a este objetivo y
por extensin la facilidad que dicha estructura tenga en su tratamiento por
el lenguaje elegido.
Podemos identificar a las estructuras segn la forma en la cual se
desempea al momento de ejecutar un programa. Por tal motivo, tenemos
estructuras:
ESTTICAS: donde su tamao es fijo (como ser vectores, cadenas).
DINMICAS: donde su tamao es variable (como ser pilas, colas, listas).
Tambin podemos subdividir a este tipo en:
Lineal: aquellas en que el almacenamiento se hace en zonas
contiguas.
No Lineal: aquellas en los cuales el almacenamiento puede hacerse
en cualquier zona, donde el concepto de siguiente es lgico y no
fsico.




Estructura de Datos
Es una coleccin de
datos que son tiles
para la organizacin y
pensados para facilitar
las operaciones que ella
necesita.



2

Abstraccin.
Una forma de resolver un problema es analizar las caractersticas y
condiciones del mismo y de este anlisis armar un modelo, el cual nos
ayuda para llegar a una solucin.
Ese modelo es un concepto abstracto, el cual fue creado por nosotros para
poder resumir el problema planteado, de una manera que nos resulta
manejable.
Los pasos son por medio de acercamientos sucesivos al entorno real.
Partimos desde una visin de alto nivel y luego la vamos refinando
aadiendo detalles y consideraciones particulares, hasta que obtenemos
una descripcin detallada o de bajo nivel.
Al llegar a esta instancia tenemos una descripcin detallada, que puede ser
implementada en cualquier lenguaje de programacin.
En la etapa de diseo, el profesional de sistemas analiza cmo relacionar
los datos con las operaciones necesarias, a fin que pueda cumplir con los
detalles que se especificaron en la descripcin detallada del problema. Lo
hace independizndose de cmo terminar la implementacin; se
concentra en los aspectos propios de la resolucin del problema planteado
a partir del modelo especificado. Este proceso se conoce como abstraccin.
Si profundizamos un poco ms, veremos que, si por ejemplo, para resolver
un problema se necesitan utilizar variables con contenido decimal, no debe
ser un problema a resolver en este momento cmo o dnde se almacenar
esta informacin. Por lo cual el programador, a esta etapa, la maneja con
un tipo de datos abstracto (TDA).




Ahora podemos referirnos a lo visto en el mdulo 1, cuando describamos
los TIPOS de DATOS; en dicha unidad ese concepto nos ayud a realizar
operaciones y ejercicios.
Podemos, en este momento, ampliar dicho concepto y entender qu es
justamente lo que estamos viendo como tipo de datos abstracto. Debemos
hacer notar que los mismos son genricos, existiendo algunos tipos de
datos particulares y especficos del lenguaje de programacin.
Abstraccin
Es describir los datos y
las operaciones sin
considerar los factores
de su implementacin


VENTAJA
Independizar el diseo del programa de la
implementacin especfica de los datos






Tipo de Datos
Es la forma de
implementar un tipo de
datos abstracto



3

2.2- Pilas.
Normalmente en el da muchas veces hablamos y consideramos el
concepto de PILA, por ejemplo:
pilas de libros
pilas de cajas
pilas de ropa
En mi caso, reconozco que sobre mi escritorio, tengo una pila de libros.
Veamos juntos las caractersticas que podemos identificar de sa, mi pila
de libros:
Hay un libro que me encanta, de ciencia ficcin El Hombre del
Bicentenario, de Asimov, pero lamentablemente hace mucho que no lo leo
por falta de tiempo, por eso est entre los primeros de la pila.
Si quiero leerlo debo sacar primero los libros tcnicos que estoy leyendo
cotidianamente y que se encuentran ms arriba.
Adems es que es muy fcil agregar un nuevo libro, slo debo dejarlo
encima del ltimo y ya forma parte de la pila.
Tambin veo que no es tan fcil sacar el primero, el de Asimov, ya que
debo mover toda la pila para ello.
En el caso de la PILA las inserciones y tambin el borrado de elementos
slo se pueden realizar en uno de los extremos.

Una PILA es una lista lineal de elementos en la cual cada
elemento slo puede ser insertado o eliminado por un
extremo denominado CIMA, es decir, los elementos se van a
sacar de la pila en orden inverso al que se insertan (pila LIFO,
Last In, First Out -ultimo en entrar primero en salir-).

La Pila es una estructura de datos de acceso restrictivo a sus elementos,
adems esta estructura facilita el poder utilizar el concepto de recursividad
en sistemas.


4

Este tipo de estructura tiene las siguientes caractersticas:
Es una estructura lineal
Tiene una secuencia finita de elementos
Cualquier insercin o eliminacin se pueden efectuar en un solo
extremo (cima)

Las operaciones que podemos realizar son:
Determinar si la pila est vaca
Determinar si la pila est llena
Insertar un nuevo elemento a la pila
Eliminar el elemento de la cima, en orden inverso a la insercin
Crear una lista

Cmo representamos una Pila?
La podemos representar con un vector lineal







Donde:
Tope o cima: indica la direccin del ltimo elemento de la pila
n: nmero mximo de elementos de la pila
Podemos identificar situaciones particulares:
Si tope es igual a n significa que la pila est llena.
Si tope es igual a 0 significa que la pila est vaca.

PILA
Las inserciones y borrados slo se realizan en uno de los
extremos llamado CIMA.

PILA
Maneja el concepto
LIFO.
El ltimo elemento en
entrar es el primero en
salir



5

2.3- Las pilas y los
lenguajes de
programacin.
Las caractersticas propias de la Pila nos permite utilizarlas en varias
aplicaciones facilitndonos:
Controlar, desde el Sistema Operativo, la ejecucin de todas las rdenes
de un archivo batch.
Recordar al programa principal el punto de llamada de un subprograma y
retornar al mismo cuando ste termine.
Formar cadenas de caracteres.
Separar texto.
Evaluar expresiones matemticas.
Deshacer la ltima operacin realizada, por ejemplo, en un procesador
de texto u otros programas similares.
Ahora bien, sobre la PILA podemos realizar las operaciones de:
- PUSH: poner o meter
- POP: sacar
Las pilas pueden ser representadas por medio de una lista unidireccional o
por un array lineal.
Representaremos las pilas por medio de un array lineal.
Tendremos un puntero especial apuntando a la CIMA y una variable
MAXPILA que determina el tamao mximo de la pila.
Para controlar el OVER-UNDERFLOW hay que saber determinar el tamao
de la pila, porque si lo hacemos demasiado grande no habr OVERFLOW
pero tendremos una prdida importante de memoria y viceversa.
Procesamiento de las pilas
ALGORITMO 36


6

1- Algoritmo INSERTAR (Push)
PUSH
Si (CIMA=MAXPILA)
entonces OVERFLOW
sino CIMA CIMA + 1
PILA(CIMA) ELEMENTO
fin_si
Si (CIMA=0)
entonces UNDERFLOW
sino ELEMENTO PILA(CIMA)
CIMA CIMA + 1
fin_si

ALGORITMO 37
2- Algoritmo SACAR (POP)
POP
Si (CIMA=0)
entonces imprimir(Pila Vacias)
sino CIMA CIMA - 1
fin_si

En la mayor parte de las aplicaciones de PUSH y POP al implementar la pila
se crea una funcin booleana vaca que nos devuelve verdadero o falso.

ALGORITMO 38
funcin VACIA(PILA:array[1..MAXPILA],CIMA:entero):boolean
inicio
Si (CIMA=0)
entonces VACIA verdadero
sino VACIA falso
fin si
fin

Cada vez que un subprograma llama a otro, en la pila del sistema tiene que
almacenarse la direccin del programa que llama, a la que se debe regresar
cuando el subprograma llamado termina su ejecucin.
La direccin de retorno es siempre la siguiente instruccin a la de la
llamada.
El 1 en retornar ser el ltimo en efectuar la llamada y por eso
utilizaremos una pila, dado la particularidad LIFO que mencionamos.
PILA
Una de sus aplicaciones
es permitir retornar al
programa principal
luego de ejecutar un
subprograma



7

Te comento una curiosidad que tenan algunas viejas calculadoras de
bolsillos, las mismas permitan ingresar las expresiones sin utilizar
parntesis. El orden de las operaciones se realizaban por la posicin de los
operadores y de los operandos, esto se llama Notacin Polaca
(desarrollada por Jan Lukasiewicz, como se imaginan de nacionalidad
polaca).






2.4- Colas.
Las caractersticas de esta estructura de datos son:
INSERCIN: los elementos que la forman por un extremo llamado FINAL
ELIMINACIN: slo se realiza por un extremo llamado FRENTE
Es fcil acceder al primero de la cola, es el que est disponible y tambin es
fcil ingresar a la cola; slo hay que colocarse detrs del ltimo.
Una cola es una lista de elementos en la que la eliminacin de stos de
dicha lista slo se puede hacer por un extremo de la cola (FRENTE) y las
inserciones se van a realizar por otro extremo al que llamaremos (FINAL).





Tenemos innumerables casos de uso de Colas en la vida diaria, bancos,
cajas de supermercados, cines, etc.
En Informtica la asociamos a colas de impresin, colas de prioridades.
COLAS
Maneja el concepto
FIFO
El primer elemento en
entrar es el primero en
salir

PROPUESTA:
Investigue sobre este tipo de notacin en Internet;
seguramente podr ver una aplicacin prctica del
concepto de PILA







8

Implementacin de las colas en
memoria
Las colas se pueden enlazar:
- listas circulares unidireccionales enlazadas.
- arrays lineales circular.
Para eliminar un elemento de la cola incrementamos FRENTE en 1 y para
aadir se los incrementamos a FINAL.
El problema que se plantea muchas veces es cmo insertar un elemento en
la cola cuando est ocupada la ltima posicin del array.
La solucin ser que el array COLA sea circular y as en el caso de que
FINAL=FRENTE insertaramos el siguiente elemento en COLA[1] siempre
que no est ocupada.





Para saber si est o no ocupada se ver con FRENTE. (frente<>1)
De forma anloga, si FRENTE=FINAL el siguiente elemento que borra es
FRENTE(1).
En el procesamiento debemos contemplar las siguientes situaciones:
INSERTAR: controlar el OverFlow
BORRAR: controlar el UnderFlow
VACIO, cuando Frente = 0







9

Procesamiento de las colas
ALGORITMO 39
Insercin
Si ((FRENTE=1 and FINAL=N) (FRENTE=FINAL + 1))

Entonces OVERFLOW
sino Si (FRENTE=0)
entonces FRENTE=1
FINAL =1
sino Si (FINAL=N)
entonces FINAL 1
sino FINAL FINAL + 1
fin_si
fin_si
COLA(FINAL) ELEMENTO
fin_si

ALGORITMO 40
Borrado
Si (FRENTE=0)
entonces UNDERFLOW
sino ELEMENTO COLA(FRENTE)
si (FRENTE=FINAL)
entonces FRENTE 0
FINAL 0
sino si ( FRENTE=N)
entonces FRENTE 1
sino FRENTE FRENTE + 1
fin_si
fin_si
fin_si

ALGORITMO 41
funcin VACIA(COLA:array[1..N] of CHAR,FRENTE:entero):boolean
inicio
si (FRENTE=0)
entonces VACIA verdadero
sino VACIA falso
fin_si
fin

10


BICOLAS
Podemos mencionar tambin las BICOLAS que son, como su nombre lo
indica, las que permiten que los elementos que se aaden o eliminan,
puedan hacerlo en cualquier extremo.
Podemos identificar a:
Bicolas de entrada restringida, si bien podemos eliminar en cualquiera
de los extremos, la insercin slo se hace por el final.
Bicolas de salida restringida, al contrario que la anterior, la insercin se
puede hacer por cualquiera de los extremos pero se elimina slo por el
final.
Los algoritmos seran:
En todos los casos inicializamos
Frente 1
Final 0

BICOLA DE ENTRADA RESTRINGIDA:
ALGORITMO 42
INSERCION
Si (final = mximo)
entonces Overflow
si no final = final + 1
cola(final) valor
fin si

ALGORITMO 43
ELIMINACION
Si (frente > final)
entonces Underflow
si no escribir (frente o atrs,resp)
si (resp=frente)
entonces x cola(frente)
frente = frente + 1
si no si(resp=atrs)
entonces x cola(final)
final = final -1
si no ERROR
fin si
BICOLAS
ELIMINACIN e
INSERCIN: puede
hacerse en ambos
extremos
INSERCIN: slo por el
final


11

fin si
fin si
BICOLA DE SALIDA RESTRINGIDA:
ALGORTIMO 44
INSERCION
Si (frente > final)
entonces Overflow
si no escribir (frente o atrs,resp)
si (resp=frente)
entonces cola(frente) valor
si no si(resp=atrs)
entonces final final + 1
cola(final) valor
si no ERROR
fin si
fin si
fin si

ALGORITMO 45
ELIMINACION
Si (frente = 0)
entonces Underflow
si no x Cola(frente)
frente frente + 1
fin si









BICOLAS
Bicolas de entrada restringida: se elimina en
cualquier extremo, se inserta slo al final
Bicolas de salida restringida: se inserta en
cualquier extremo, se elimina slo al final






12

2.5- Listas Enlazadas.
Listas.
Todos tenemos una idea de que estamos hablando cuando nos referimos a
LISTAS.
Llamamos as a la lista de componentes para armar una computadora, la
lista de ingredientes para preparar una comida, la lista de direcciones de
correo electrnico, etc., es decir que ya estamos familiarizados con este
concepto.
Podemos deducir de estos ejemplos que siempre se trata de un conjunto
de elementos que tienen algo en comn, es decir que son del mismo tipo.
Por lo tanto consideramos que la definicin que presentamos a
continuacin no nos resultar compleja aunque s un poco ms especfica.

DEFINICIN DE LISTA:
Es un conjunto de elementos de un tipo dado que se
encuentran ordenandos y pueden variar en nmero

Los elementos en una lista lineal se almacenan en la memoria principal de
una computadora en posiciones sucesivas de memoria; cuando se
almacenan en cinta magntica, los elementos se presentan en sucesin en
la cinta.
Esta asignacin de memoria se denomina almacenamiento secuencial,
aunque tambin existe otro tipo de almacenamiento que es el encadenado
o enlazado.
Las listas, as definidas, se denominan contiguas y las operaciones que se
pueden hacer con stas son:
1. - Insertar; eliminar o localizar unos elementos
2. - Determinar su tamao (N de elementos de la lista)
3. - Recorrer la lista para localizar algn elemento
4. - Clasificar los elementos en orden ascendente o descendente
5. - Unir dos o ms listas en una sola
LISTAS LINEALES
Se almacenan en
posiciones sucesivas de
memoria.


13

6. - Dividir una lista en varias sublistas
7. - Copiar la lista
8. - Borrar la lista
Para permitir operaciones con listas como arrays se deben dimensionar a
stos con tamao suficiente para que contengan todos los posibles
elementos de la lista.
Las listas enlazadas o de almacenamiento enlazado o encadenado son
mucho ms flexibles y potentes, y su uso es mucho ms amplio que las
listas contiguas.

Listas enlazadas
Una lista enlazada o encadenada es un conjunto de elementos en los que
cada elemento contiene la posicin o direccin del siguiente elemento de
la lista.
Cada elemento de una lista enlazada debe tener al menos dos campos, uno
que contiene el valor del elemento y otro campo enlace o linkeador que
contiene la posicin del siguiente elemento.
Los elementos de una lista son enlazados por medio de los campos enlace.
Las listas enlazadas tienen una terminologa propia que se suele utilizar
normalmente.
Los valores se almacenan en un nodo.
Los componentes de un nodo se llaman campos.
Un nodo tiene al menos un campo dato o valor y un enlace con el
siguiente campo.





El ltimo nodo de una lista enlazada se suele representar por:
un enlace con la palabra reservada NIL,

LISTAS ENLAZADAS
Cada elemento
contiene la posicin del
siguiente elemento de
la lista.


14

una barra inclinada ( / ),
con el smbolo elctrico, de masa
La implementacin de una lista enlazada depende del lenguaje.
Utilizaremos el trmino puntero para describir el enlace entre dos
elementos o nodos de una lista enlazada.
Un puntero es una variable cuyo valor es la direccin o posicin de otra
variable.
En las listas enlazadas no es necesario que los elementos estn
almacenados en posiciones fsicas adyacentes, ya que el puntero indica
dnde se encuentra el siguiente elemento de la lista.
Una lista enlazada se define por el tipo de sus elementos:
campo de informacin (datos)
campo de enlace (puntero)
Un puntero de cabecera que permite acceder al primer elemento de la
lista.
Un medio para detectar el ltimo elemento de la lista: el puntero nulo (nil).
LISTA ENLAZADA
Su almacenamiento no es contiguo, cada elemento tiene un
puntero a la direccin del prximo

Procesamiento de listas enlazadas
Para que una lista pueda procesarse se necesitan 2 informaciones
fundamentales:
1. -Saber cul es el primer elemento de la lista, y esto la referencia el
puntero especial COMIENZO.
2. -Saber qu datos contiene la lista, y eso lo brinda el campo de
informacin de cada nodo de la lista.
Las operaciones que podemos realizar con una lista enlazada son:
Acceder a un nodo concreto y recuperar la informacin
Insertar un nuevo nodo en un lugar concreto de la lista

15

Borrar un nodo de la lista

Representacin de las listas enlazadas
en memoria
Hay 2 mtodos:
1. - Implementacin por arrays
En este caso, como mnimo se necesitan dos arrays lineales a los que
vamos a llamar INFO y ENLACE que contienen la parte de informacin, el
array INFO y el campo PUNTERO: array enlace de cada nodo de la lista.
Necesitamos tambin una variable especial llamada COMIENZO que
contendr la posicin ocupada por el primer nodo de la lista, y necesitamos
adems, una marca especial que es el puntero NULO 0 que indica el final
de la lista, los 2 arrays tendrn el mismo nmero de elementos tal que:
INFO(I) ser la informacin del nodo que ocupa la posicin I en el
array.
ENLACE(I) contendr el ndice que apunta al siguiente nodo al I en
la lista.
Con esta representacin de las listas, incluso podemos almacenar varias
listas con el mismo par de arrays, con la condicin de que para cada lista
tenga su variable comienzo de la lista.
Con esta implementacin seguimos encontrndonos con los
inconvenientes del array por su tamao pero presenta una ventaja por las
inserciones y los borrados porque slo tenemos que cambiar el campo
enlace.

2. - Implementacin por medio de punteros
Es la implementacin ms eficaz, sobre todo en cuanto al tamao porque
usaremos slo lo que necesitamos.
La lista estar compuesta por nodos.
Cada nodo tiene 2 campos:
DATO o INFO
LISTAS ENLAZADAS EN
MEMORIA
Necesitamos
Variable de inicio:
COMIENZO
Indicador de fin: NULO


16

ENLACE o SIG: campo enlace o puntero que apunta, es decir,
contiene la direccin del siguiente nodo de la lista.
Para poder acceder a la lista, existe un puntero externo, que apunta al
primer nodo de la lista y que se llama COMIENZO, el ltimo nodo de la lista
contiene en su campo SIG el valor que lo representaremos con: NIL, X o
toma de tierra.
La notacin que vamos a dar para los algoritmos ser la siguiente:
PTR ---------> puntero para movernos a travs de la lista variable de tipo
puntero a un nodo de la lista.
DATO (PTR) --> el campo informacin del nodo apuntado por PTR.
ENLACE (PTR)----> el campo enlace del nodo apuntado por PTR.








ALGORITMO 47
Algoritmo de recorrido
Inicio
PTR START
Mientras (PTR <> 0) hacer
Leer DATO(PTR)
PTR ENLACE(PTR)
FIN MIENTRAS
FIN

PRUEBA DE ESCRITORIO





17

Comparando entre los dos mtodos podemos decir que dependiendo de la
aplicacin es decir de las operaciones que se desean ejecutar y de la
longitud que tiene la lista a implementar.
En una implementacin con matrices es necesario especificar en el
momento de la compilacin, la longitud mxima de la lista, si no se
conoce se deber usar punteros, pues si se supera ese valor se
producir un error en tiempo de ejecucin.
En una implementacin con punteros, insertar y eliminar
elementos, no depende de la longitud de la lista, en cambio, el
tiempo necesario para acceder a un elemento es proporcional a la
longitud de la misma.
Si para la implementacin se usan matrices, el tiempo para acceder
a un elemento es constante en cambio el tiempo necesario para
insertar o quitar un elemento depende de la longitud de la lista.
Cuando se usan matrices se desperdicia espacio de memoria
debido a que la matriz se debe dimensionar para el tamao mximo
de la lista, aunque sta se encuentre prcticamente vaca. Si se usan
punteros la estructura es dinmica y slo se usa el espacio necesario
para almacenar los elementos que contenga en el momento, como
contrapartida el uso de punteros necesita espacio adicional al de los
datos para almacenar el puntero.

Recorrido de una lista enlazada
Se utiliza:
Una variable puntero PTR que apunta al nodo procesado en cada
momento.
SIG(PTR) apuntar al siguiente nodo a ser procesado: PTR SIG(PTR).
ALGORITMO 48
Algoritmo RECORRIDO
inicio
PTR COMIENZO
mientras (PTR <> NIL) hacer
{ procesar el nodo INFO (PTR) }
PTR SIG(PTR)
fin_mientras
fin


18

Bsqueda en una lista enlazada.
Para buscar una informacin en una lista tenemos que recorrer dicha lista
secuencialmente desde el comienzo de la misma hasta encontrar lo que
buscamos o bien lleguemos al final de la lista.
Algoritmo de bsqueda en una lista no ordenada.
Se trata de devolver en la variable LUG la posicin del nodo de la lista que
contiene el valor del elemento buscado.
EJERCICIO 49
Algoritmo BUSQUEDA_NO_ORDENADA
inicio
LUG 0
PTR COMIENZO
mientras ((PTR <> NIL) y (LUG=0)) hacer
si (INFO(PTR)=ELEMENTO)
entonces LUG PTR
sino PTR SIG (PTR)
fin_si
fin_mientras
si (LUG=0)
entonces ' NO ENCONTRADO '
fin_si
fin

Ejemplo:





19

PRUEBA DE ESCRITORIO




Si la lista est ORDENADA en ascendente y encuentro un elemento mayor
que el que busco es porque este ltimo no se encuentra.

EJERCICIO 50
Algoritmo BUSQUEDA_ORDENADA
Inicio
MARCA 0
LUG 0
PTR COMIENZO
mientras ((PTR<>NIL) y (MARCA=0)) hacer
si (INFO(PTR)=ELEMENTO)
entonces LUG PTR
MARCA 1
sino si (ELEMENTO<INFO(PTR))
entonces MARCA 1
sino PTR SIG(PTR)
fin_si
fin_si
si (LUG=0)
entonces escribir( NO ENCONTRADO)
fin_si
fin_mientras
fin

Ejemplo:



20


PRUEBA DE ESCRITORIO





OVERFLOW y UNDERFLOW
Una lista sufre un OVERFLOW cuando se intenta insertar un elemento en
dicha lista estando la lista de espacio disponible vaca, es decir, cuando no
hay ms memoria libre.
Una lista sufre UNDERFLOW cuando intentamos borrar un elemento de la
lista estando sta vaca.
Estas 2 situaciones habr que controlarlas siempre que hagamos una
insercin y siempre que hagamos un borrado.

Insercin en una lista enlazada
Se pueden dar 3 casos:
1. -Que el nodo insertar pase a ser el primero de la lista. Entonces tendr
que variar la variable comienzo.
3. -Que el nodo insertar pase a ser el ltimo de la lista por lo que SIG
tendra que pasarlo a NIL
3. -Insertar un nodo a partir de otro concreto.
En cualquiera de los casos habra que hacer lo siguiente:
A) Estudiar si existe espacio libre en la lista DISP. Si DISP=NIL entonces se
producira un OVERFLOW y no puedo hacer la insercin.


21

B) Extraer el primer nodo de DISP al que llamaremos nuevo y actualizar los
punteros necesarios en esta lista.
C) Rellenar el nuevo nodo con la informacin que queremos insertar en l.
D) Reajustar los campos de enlace que sean necesarios en la lista con la
que estamos trabajando.
Consideremos que junto con la lista enlazada con la que se est trabajando
existe una lista especial (DISP) que contiene las posiciones de memoria
libre.
Esta lista tiene su propia variable de COMIENZO.
En la prctica lo que hacemos para insertar o borrar un elemento de la lista
es asignarle o liberar memoria mediante unas instrucciones especiales.
Al hacer una insercin tendremos que tomar un nodo de la lista, rellenarlo
con los datos que nos interese y enlazarlo con la lista con la que estamos
trabajando y cuando hacemos un borrador de la lista hay que aadir el
nodo que queremos borrar a la lista DISP.
En cualquier caso, toda insercin o borrado de un nodo en la lista DISP se
va ha hacer por convenio con el primer elemento de dicha lista.

1- Algoritmo de insercin al principio de la lista
ALGORITMO 51
Si (DISP=0)
Entonces escribir(OVERFLOW)
sino NUEVO DISP
DISP SIG(DISP)
INFO(NUEVO) ELEMENTO
SIG(NUEVO) COMIENZO
COMIENZO NUEVO
Fin_si







22

PRUEBA DE ESCRITORIO




2- Algoritmo de insercin de un nodo a partir de otro nodo determinado.
Suponemos que nos dan un valor LUG que representa la localizacin de un
nodo A y se trata de insertar un nuevo nodo a partir del nodo A.
ALGORITMO 52
PRIMERO = 1
DISP = 1
INICIO
LEER(VALOR,LUGAR)
SI (DISP= (-1))
ENTONCES ESCRIBIR(LISTA LLENA)
SI NO NUEVO DISP
DISP ENLACE(DISP)
DATO(NUEVO) VALOR
SI PRIMERO <> DISP
ENTONCES AUX ENLACE(LUGAR)
ENLACE(LUGAR) NUEVO
ENLACE(NUEVO) AUX
SI NO ENLACE(LUGAR) NUEVO
FIN SI
FIN SI
FIN

3- Algoritmo de insercin de un nodo al final de la lista.
ALGORITMO 53
Si (DISP=NIL)
Entonces OVERFLOW
sino PTR COMIENZO
mientras (PTR<>NIL)
PTR SIG(PTR)
fin_mientras
NUEVO DISP
DISP SIG(DISP)
INFO(NUEVO) ELEMENTO


23

SIG(NUEVO) NIL
SIG(PTR) NUEVO
fin_si

Insercin de un nodo en una lista
ordenada.
Para disear el algoritmo en este caso, es necesario calcular previamente la
posicin LUG donde tengo que insertar el elemento y en funcin de esa
posicin aplicar luego alguno de los algoritmos dados.
PASOS
1. -Ver si existe espacio en DISP
2. -Si la lista est vaca o si el elemento a insertar es menor que el primero
de la lista aplico el algoritmo de insercin.
3. -Si no se cumplen las condiciones anteriores tendr que localizar la
posicin LUG que le corresponde al nodo e insertarlo all.

Borrado de una lista enlazada
Se pueden dar 3 casos:
1. - Que el nodo a borrar sea el primero de la lista.
2. - Borrar un nodo conocido su predecesor.
Caso particular: borrar un nodo que est el final de la lista
3. - Borrado de un nodo que contiene un determinado elemento de
informacin.
En todos los algoritmos el nodo borrado se tendr que devolver a lista DISP
y se insertar al comienzo de la misma y adems se tendr que comprobar
que la lista no est vaca.
1) Borrado de un elemento al comienzo de la lista
ALGORITMO 54
Si (COMIENZO=NIL)
entonces UNDERFLOW
sino BORRADO COMIENZO

24

COMIENZO SIG(COMIENZO)
SIG(BORRADO) DISP
DISP BORRADO
fin_si

2) Borrado de un nodo conocido su predecesor
El algoritmo elimina de la lista el nodo N que ocupa la posicin LUG, y LUGP
es la variable que apunta al predecesor de N.
ALGORITMO 55
Si (COMIENZO=NIL)
entonces UNDERFLOW
sino SIG(LUGP) SIG(LUG)
SIG(LUG) DISP
DISP LUG
fin_si

3) Borrado de un nodo que contiene un determinado elemento de
informacin.
ALGORITMO 56
Si (COMIENZO= NIL)
entonces UNDERFLOW
sino Si (INFO(COMIENZO)=ELEMENTO)
entonces BORRADO COMIENZO
COMIENZO SIG(COMIENZO)
SIG(BORRADO) DISP
DISP BORRADO
sino LUGP COMIENZO
LUG SIG(COMIENZO)
mientras (LUG<>NIL y INFO(LUG)<>NIL)
LUGP LUG
LUSG SIG(LUG)
Fin_mientras
Si (INFO(LUG)=ELEMENTO)
entonces SIG(LUGP) SIG(LUG)
SIG(LUG) DISP
DISP LUG
sino escribir(NO ENCONTRADO O NO
EXISTE)
fin_si
fin_si
fin_si

25

Listas circulares con cabecera
Una lista enlazada con cabecera es una lista que contiene al comienzo de la
misma un nodo llamado cabecera.
Este nodo no es til (no tiene informacin para usar).
Hay 2 listas:
1. - Lista con cabecera y tierra
Contiene al principio un nodo cabecera.
Contiene el campo enlace con valor nulo.
2. - Lista circular con cabecera
Es la ms utilizada
Contiene al principio un nodo cabecera
El ltimo nodo de la lista apunta al nodo cabecera.
El primer nodo que se analiza al recorrer la lista ser SIG[COMIENZO]
porque COMIENZO no tiene informacin til.
Ventajas
Su usan ms que las listas enlazadas debido a 2 razones:
1- No necesitamos el puntero nulo ya que el campo SIG de todos los nodos
contiene informacin (direcciones).
2- Cada nodo tiene un predecesor y as el primer nodo de la lista tiene
Predecesor.


2.6- rboles.
Introduccin
El inconveniente de las estructuras de datos dinmicas lineales es que cada
elemento slo tiene un elemento siguiente, es decir, slo puedo moverme
una posicin.

26

Los rboles representan estructuras no lineales y dinmicas.
Un rbol se define como un conjunto finito de elementos llamados nodos
que guardan entre ellos una relacin jerrquica.
Existe un nodo diferenciado llamado raz del rbol, y los dems nodos
forman conjuntos diferentes cada uno de los cuales es a su vez un rbol, a
estos rboles se los denomin subrboles.
Del nodo raz van a salir las ramas que van conectando las ramas inferiores.
Un rbol vaco es aquel que no tiene ningn nodo.
Con esta estructura de datos podemos realizar varias aplicaciones, como
ser:
Registrar la historia de eventos
rboles genealgicos
Anlisis de circuitos elctricos
Frmulas matemticas
Numerar captulos y secciones de un libro

Terminologa de los rboles binarios en general
Para referirnos a los rboles se utilizan trminos propios del parentesco
familiar:





NODO: Es cada uno de los elementos del rbol (A, B, C, D1, D2, F, G y H).
RAZ: Es un nodo especial del que descienden todos los dems nodos. Este
nodo es el nico que no tiene "padre" (nodo A).
HOJA: (o nodo terminal) Es donde termina el rbol, no tiene ningn
descendiente (nodos D1, D2 y H).
HIJO: Cada nodo que no es hoja y tiene debajo de l 1 o varios nodos.
RBOLES
Un conjunto finito de
elementos, con un nodo
especial llamado RAZ y
nodos inferiores
llamados HIJOS



27

PADRE: Todo nodo excepto la raz, tiene asociado un NICO nodo
predecesor al que llamaremos padre.
HERMANO: Son los nodos que son hijos de un mismo padre (D1 y D2).
NODO INTERNO: Cualquier nodo que no sea una hoja.
NIVEL: Cada nodo de un rbol tiene asignado un nmero de nivel superior
en una unidad a su padre.
CAMINO: Una sucesin de enlaces que conectan dos nodos.
RAMA: Camino que termina en una hoja.
PROFUNDIDAD (altura) DE UN RBOL :Es el mximo nmero de nodos de
una rama.
PESO DE UN RBOL: Nmero de hojas de un rbol.
BOSQUE: Coleccin de 2 o ms rboles.

rbol binario
Se define como un conjunto finito de nodos de forma que contiene un
nodo diferenciado llamado raz y donde cada nodo puede tener 0, 1 2
subrboles a los que se llamar hijo derecho e izquierdo.

Terminologa de rboles binarios
rboles binarios similares
Dos rboles, T y T' se dice que son similares si tienen la misma estructura.









28

rboles binarios equivalentes o copias
Si son similares y tienen los mismos contenidos en sus nodos, es decir, son
exactamente iguales.






rboles binarios equilibrados
Si sus alturas o profundidades se diferencian como mximo en una unidad.

rboles binarios completos
Un rbol binario es completo o extendido si cada nodo del rbol tiene 0 2
hijos.
El nmero mximo de nodos de un nivel "i" es 2 i cuando el nivel anterior
est completo y adems cada nodo tenga dos hijos.
Un rbol binario lleno es aquel en el que todos los niveles estn completos.
La altura de un rbol binario lleno de N elementos es
h=Log
2
(N + 1) .. N=2
n
1











29

Representacin de rboles binarios en
memoria
Dado un rbol binario hay 2 formas de representarlo:
Representacin enlazada o de punteros
Representacin secuencial o con arrays
El principal requerimiento para cualquier representacin es que para
cualquier rbol T se tenga acceso directo a la raz de dicho rbol y dado un
nodo N del rbol se tenga acceso directo a sus hijos.
Representacin enlazada o de punteros
El rbol se representa por medio de una lista enlazada especial en la que
cada nodo tiene 3 campos:
- IZQ; campo enlace o puntero al hijo izquierdo del nodo, si dicho hijo no
existe, contiene NIL.
- DER; campo enlace o puntero al hijo derecho.
- RAIZ; variable que apunta al nodo raz del rbol.
Un rbol estar vaco cuando RAIZ <--- NIL.
Para las inserciones y borrados utilizaremos la lista DISP, va a ser una lista
enlazada normal en la que cada nodo tendr los 3 campos siendo el IZQ el
campo enlace.








Representacin secuencial
Con 3 arrays: INFO, DER y IZQ y una variable puntero RAIZ.

A B C X D E


30

Cada nodo vendr representado por una posicin K tal que la posicin K de
INFO, INFO[K], contiene la informacin de K.
IZQ[K] --> contiene la posicin del array donde est almacenado el hijo
izquierdo de K.
DER[K] --> contiene la posicin del array en la que est almacenado el hijo
derecho de K.
Para las inserciones y borrados utilizaremos la lista DISP que enlazar las
posiciones del array. La variable puntero DISP apuntar a la primera
posiciones libre del array y el resto de las posiciones se enlazarn entre s
mediante el campo IZQ.
Con 1 array: sea T un rbol binario lleno a casi lleno, para este tipo de rbol
lo ms eficiente es utilizar un nico array para almacenarlo siguiendo las
siguientes normas:
El array lo llamaremos ARBOL y en ARBOL[1] meteremos la raz del rbol.
Para cada nodo N que ocupe la posicin K del rbol, su hijo izquierdo se
encuentra almacenado en la posicin (2 * K) y su hijo derecho en la
posicin (2 * k + 1).
Para poder mantener un rbol con esta representacin si la profundidad
del rbol es h el array en el que se almacena tiene que tener como mnimo
2 h -1 posiciones porque se es el nmero mximo de nodos que puede
tener un rbol lleno de profundidad h.
El inconveniente de esta representacin es que si no est lleno se pierde
mucho espacio y que adems no podemos insertar bajando de nivel
porque no hay profundidad.











31

Recorrido de rboles binarios
Recorrido de un rbol es el proceso que consiste en acceder una sola vez a
cada nodo del rbol; hay 3 maneras estndar de recorrer un rbol y en las
tres se dan los mismos pasos y tambin coinciden en que se recorre
primero su rbol izquierdo y luego el derecho.
Las tres maneras se diferencian en el momento que se accede al nodo raz.
1. PREORDEN: 1 se procesa la raz.
2 subrbol izquierdo.
3 subrbol derecho.
2. INORDEN: 1 subrbol izquierdo.
2 se procesa la raz.
3 subrbol derecho.
3. POSTORDEN: 1 subrbol izquierdo.
2 subrbol derecho.
3 se procesa la raz.

Algoritmo de recorrido INORDEN
Se inicia recorriendo a partir de la raz todos los nodos de la rama
izquierda.
Cada nodo por el que se pasa se almacena en una pila en la que
previamente hemos cargado como primer elemento la marca nula.
Una vez finalizado este recorrido se comienza a procesar el primer
elemento de la pila que coincidir con el elemento que est ms a la
izquierda del rbol procesado.
Por cada nodo procesado se examina si tiene hijo derecho y en caso de que
exista nos posicionamos en l y repetimos el proceso anterior.
Si no existe hijo derecho se saca el siguiente nodo de la lista y este proceso
contina hasta que sacamos de la pila la marca nula.



32

ALGORITMO 57
Algoritmo RECORRIDO_INORDEN
inicio
CIMA 1
PILA(CIMA) NIL
PTR RAIZ
Mientras ( PTR<>NIL)
CIMA CIMA + 1
PILA(CIMA) PTR
PTR IZQ(PTR)
fin_mientras
PTR PILA(CIMA)
CIMA CIMA - 1
mientras (PTR<>NIL)
{PROCESO INFO(PTR)}
SI (DER(PTR)<>NIL)
entonces PTR DER(PTR)
mientras (PTR<>NIL)
CIMA CIMA + 1
PILA(CIMA) PTR
PTR IZQ(PTR)
fin_mientras
fin_si
PTR PILA(CIMA)
CIMA CIMA - 1
fin_mientras
fin



2.7- rboles binarios de
bsqueda
Un rbol binario de bsqueda es aquel en el que los elementos estn
organizados de tal manera que facilitan las bsquedas y para ello sigue la
siguiente definicin:
El rbol depende de un campo clave que es distinto para cada nodo
y est ordenado respecto a ese campo, tal que si T es un rbol
binario, es de bsqueda si cada nodo N del rbol tiene la siguiente
propiedad:

33

El campo clave de n es mayor que cualquiera de los campos clave
de los nodos del subrbol izquierdo de n y de la misma manera el
campo clave de n es menor el campo clave de todos los nodos que se
encuentran en el subrbol derecho de n.
Esto supone que si hago un recorrido inorden del rbol obtendremos sus
elementos ordenados por el campo clave en orden ascendente.
Ejemplo:








Dos rboles binarios de bsqueda pueden no ser iguales aun teniendo la
misma informacin, va a depender del orden en el que ingrese la
informacin.

Bsqueda de un elemento
El algoritmo localiza la posicin PTR del nodo que contiene el valor del
elemento y en PAD dejamos la localizacin del nodo padre de PTR, la
filosofa del algoritmo consiste en comenzar comparando el elemento con
la raz del rbol y luego ir recorriendo dicho rbol por la derecha o por la
izquierda segn si el elemento es mayor o menor que el nodo que estamos
examinando y as hasta encontrar el elemento o llegar a una hoja del rbol.
ALGORITMO 58
Algoritmo BUSQUEDA
inicio
PTR RAIZ
PAD NIL
mientras ((PTR<>NIL) y (INFO(PTR)<>ELEMENTO))
SI (ELEMENTO < INFO(PTR))




34

entonces PAD PTR
PTR IZQ(PTR)
sino PAD PTR
PTR DER(PTR)
fin_si
fin_mientras
SI (INFO(PTR)=ELEMENTO)
entonces escribir(ENCONTRADO)
fin_si
fin

Insercin de un elemento
Los pasos son:
1 Mirar si hay espacio disponible en la lista DISP.
2 Ver si el elemento est en el rbol y si no est, localizar la posicin
dnde debe ser insertado, para lo que utilizar el algoritmo de bsqueda
tal que PAD ser el nodo al que hay que enganchar el nodo que insertamos.
3 Averiguar si debe insertarse como el hijo derecho o izquierdo de
PAD.
4 Finalmente, el nodo tiene que quedar como una hoja.

ALGORITMO 59

Algoritmo INSERCION
inicio
Si (DISP = NIL)
entonces 'OVERFLOW'
sino {llamar algoritmo de bsqueda}
si (INFO(PTR)=ELEMENTO)
entonces escribir(YA EXISTE)
sino NUEVO DISP
DISP IZQ(DISP)
INFO(NUEVO) ELEMENTO
IZQ(NUEVO) NIL
DER(NUEVO) NIL
SI (PAD=NIL)
entonces RAIZ NUEVO
sino SI (ELEMENTO< INFO(PAD))
entonces IZQ(PAD) NUEVO

35

sino DER(PAD) NUEVO
fin_si
fin_si
fin_si
fin_si
fin

Eliminacin de un elemento
Dado un rbol binario de bsqueda del que se quiere eliminar un nodo con
la informacin elemento lo primero que hay que hacer es controlar la
situacin de UNDERFLOW, despus buscar el nodo y una vez encontrado el
nodo se pueden dar 3 casos:
1. - que el nodo no tenga hijos
2. - que el nodo tenga un hijo
3. - que tenga dos hijos
* Cuando el nodo a borrar tiene uno o ningn hijo
ALGORITMO 60
SI ((IZQ(PTR)=NIL) y (DER(PTR)=NIL))
entonces HIJO NIL
sino SI (IZQ(PTR)<>NIL)
entonces HIJO IZQ[PTR]
sino HIJO DER(PTR)
fin_si
fin_si

SI ( PAD=NIL)
entonces RAIZ HIJO
sino SI (PTR=IZQ(PAD))
entonces IZQ(PAD) HIJO
sino DER(PAD) HIJO
fin_si
fin_si
* Cuando el nodo a borrar tiene 2 hijos

ALGORITMO 61
{una vez encontrado PTR}
SI ((IZQ(PTR)<>NIL) y (DER(PTR)<>NIL))
PADSUC PTR

36

SUC DER(PTR)
mientras (IZQ(SUC)<>NIL) hacer
PADSUC SUC
SUC IZQ(SUC)
fin_mientras
HIJO DER(SUC)
SI (SUC=IZQ(PADSUC))
entonces IZQ(PADSUC) HIJO
sino DER(PADSUC) HIJO
fin_si
SI (PAD=NIL)
Entonces RAIZ SUC
sino SI (PTR=IZQ(PAD))
entonces IZQ(PAD) SUC
sino DER(PAD) SUC
fin_si
fin_si
IZQ(SUC) IZQ(PTR)
DER(SUC) DER(PTR)
fin_si
* Algoritmo general de borrado

ALGORITMO 62
SI (RAIZ=NIL)
entonces 'UNDERFLOW'
sino {llamar algoritmo de bsqueda NODO_ELEM}
SI (INFO<>ELEMENTO)
entonces escribir(No existe el nodo a borrar)
sino SI (IZQ(PTR)<>NIL y DER(PTR)<>NIL)
entonces {borrado 2 hijos}
sino {borrado 0 1 hijo}
fin_si
IZQ(PTR) DISP
DISP PTR
fin_si
fin_si

Aplicaciones de los rboles binarios
Reconocimiento de patrones
Una de las aplicaciones ms importantes de los rboles es utilizarla en el
reconocimiento de patrones que es una de las ramas de la inteligencia

37

artificial y en general en la mayora de las aplicaciones en que se necesita
hacer bsquedas.
La filosofa de reconocimiento de patrones es llegar a una conclusin al ir
movindonos en el rbol segn unas determinadas pistas.
Se pueden representar muchos patrones en forma de rboles binarios. El
truco est en asignar los significados adecuados a los movimientos de ir
hacia la izquierda o la derecha.
El inconveniente es que como lo que usamos son rboles binarios, estas
relaciones de bsqueda o patrones slo pueden ser binarias.

Transformacin de una notacin algebraica en otra
La transformacin de una notacin a otra se puede realizar estructurando
los exponentes como un rbol binario tal que un recorrido sea notacin
infija, un recorrido preorden la notacin prefija y uno postorden la postfija.
La primera tarea es construir el rbol teniendo en cuenta que cada
subrbol tendr como raz un operador y los hijos o son operados u otros
subrboles.
Para equilibrar 0 + a ( b + c * d)


2.8- Tablas Hash
Una tabla Hash es un contenedor asociativo (tipo Diccionario) que permite
un almacenamiento y posterior recuperacin eficientes de elementos
(denominados valores) a partir de otros objetos, llamados claves.
Una tabla hash se puede ver como un conjunto de entradas.
Cada una de estas entradas tiene asociada una clave nica, y por lo tanto,
diferentes entradas de una misma tabla tendrn diferentes claves.
Esto implica, que una clave identifica unvocamente a una entrada en una
tabla hash. Por otro lado, las entradas de las tablas hash estn compuestas
por dos componentes:
La propia clave
La informacin que se almacena en dicha entrada.

38


La estructura de las tablas hash es lo que les confiere su gran potencial, ya
que hace de ellas unas estructuras extremadamente eficientes a la hora de
recuperar informacin almacenada.
El tiempo medio de recuperacin de informacin es constante, es decir, no
depende del tamao de la tabla ni del nmero de elementos almacenados
en la misma.
Una tabla hash est formada por un array de entradas, que ser la
estructura que almacene la informacin, y por una funcin de dispersin.
La funcin de dispersin permite asociar el elemento almacenado en una
entrada con la clave de dicha entrada. Por lo tanto, es un algoritmo crtico
para el buen funcionamiento de la estructura.
Cuando se trabaja con tablas hash es frecuente que se produzcan
colisiones. Las colisiones se generan cuando para dos elementos de
informacin distintos, la funcin de dispersin les asigna la misma clave.
Como se puede suponer, esta solucin se debe arreglar de alguna forma.
Para ello las tablas hash cuentan con una funcin de resolucin de
colisiones.
Existen dos tipos de tablas hash, en funcin de cmo resuelven las
colisiones:
Encadenamiento separado: Las colisiones se resuelven
insertndolas en una lista. De esa forma tendramos como estructura
un vector de listas. Al nmero medio de claves por lista se le llama
factor de carga y habra que intentar que est prximo a 1.
Direccionamiento abierto: Utilizamos un vector como
representacin y cuando se produzca una colisin la resolvemos
reasignndole otro valor hash a la clave hasta que encontremos un
hueco.

39

Operaciones bsicas de las tablas
hash
Insertar
El proceso de insercin en una tabla hash es muy simple y sencillo. Sobre el
elemento que se desea insertar se aplica la funcin de dispersin. El valor
obtenido tras la aplicacin de esta funcin ser el ndice de la tabla en el
que se insertar el nuevo elemento.
Veamos este proceso con un ejemplo. Sobre la siguiente tabla hash se
desea introducir un nuevo elemento, la cadena azul. Sobre este valor se
aplica la funcin de dispersin, obteniendo el ndice 2.

El resultado de la insercin sera el siguiente:

En el caso de que se produzca una colisin al tratar de insertar el nuevo
elemento, el procedimiento ser distinto en funcin del tipo de hash con el
que se est tratando, y tal cual vimos anteriormente tenemos:

40

Encadenamiento separado: El nuevo elemento se aadir al final de
la lista que se inicia en la posicin indicada por el valor que retorn la
funcin de dispersin.
Direccionamiento abierto: En este caso, se busca una nueva
posicin en la que almacenar el nuevo valor.

Borrar
El borrado en una tabla hash es muy sencillo y se realiza de forma muy
eficiente.
Una vez indicada la clave del objeto a borrar, se proceder a eliminar el
valor asociado a dicha clave de la tabla.
Esta operacin se realiza en tiempo constante, sin importar el tamao de la
tabla o el nmero de elementos que almacene en ese momento la
estructura de datos. Esto es as ya que al ser la tabla una estructura a la
que se puede acceder directamente a travs de las claves, no es necesario
recorrer toda la estructura para localizar un elemento determinado.
Si sobre la tabla resultante de la insercin del elemento azul realizamos el
borrado del elemento negro, la tabla resultante sera la siguiente:


Otras operaciones
Una de las principales operaciones que se pueden realizar en las tablas
hash es la redispersin. La redispersin se suele realizar cuando el factor de
carga (nmero de elementos / capacidad de la tabla) de la tabla supera
cierto umbral.

41

La redispersin consiste en pasar todos los elementos de la tabla original a
una nueva tabla de un tamao mayor. De esta forma, se reduce el factor de
carga de la tabla.


2.9- Colas de
prioridad
Veremos en detalle esta aplicacin de la estructura de datos ya vista, Colas:
Cuando tenemos un sistema monoprocesador con problemas de
paralelismo y concurrencia, podemos ver que la solucin es que los
procesos que quieran ejecutarse se vayan almacenando en una cola. Esto
nos permite que, a medida que acaba un proceso en CPU, comience a
ejecutarse el siguiente de la COLA.
Para solucionar esto, a cada proceso se le asigna una prioridad tal que se
ejecutarn primero los de prioridad ms alta. Inclusive se puede manejar la
cantidad de procesos permitidos por prioridad e inclusive asociar otras
variantes a la prioridad, ejemplo tiempo de espero mximo permitido,
tiempo de ejecucin permitido, uso de memoria, etc.
Una cola de prioridades es un conjunto de elementos tal que cada uno se le
ha asignado una prioridad de forma que el orden en el que los elementos
son eliminados de la cola siguen el siguiente orden:
Los elementos son procesados por orden de mayor prioridad
Los elementos que tienen igual prioridad, segn el orden en el que
llegaron, es decir en forma convencional.
Existen varias formas de implementar las colas de prioridades:
1. - Por medio de una lista unidireccional
2. - Por mltiples colas
La lista enlazada tendr la siguiente estructura:
- Un campo INFO
- Un campo enlace SIG; que apunta al siguiente elemento de la cola.
- Un campo NPR; que contiene la prioridad de ese elemento.

42

En el procesado, un nodo X preceder a un nodo Y si X tiene mayor
prioridad que Y o si X, teniendo la misma prioridad que Y, lleg antes que Y.
Podemos identificar dos tipos de colas de prioridades:
Con ordenamiento descendente
Con ordenamiento ascendente
En las colas de prioridad ascendente (CPA) se pueden insertar elementos
en forma arbitraria y solamente se puede remover el elemento de menor
prioridad.
Las operaciones que podemos hacer:
Insert(CPA,x), inserta el elemento x en la cola CPA.
x=minRemove(CPA) asigna a x el valor del elemento menor
(de su prioridad) y se remueve de la cola.
En las colas de prioridad descendente (CPD) es similar, pero slo permite la
supresin del elemento ms grande; las operaciones que podemos realizar
con este tipo de cola son:
insert(CPD,x)
x=maxRemove(CPD)
La operacin empty se aplica a cualquier cola.
Las operaciones de insert y borrar slo se aplica si no est vaca.
Los elementos de la cola de prioridad no necesitan ser nmeros o
caracteres para que puedan compararse directamente, de hecho pueden
ser estructuras complejas ordenadas en uno o varios campos.
En las colas de prioridad se pueden sacar los elementos que no estn en el
primer sitio del extremo donde salen los elementos, dado que el elemento
a retirar puede estar en cualquier parte del arreglo.
Cuando se requiere eliminar un dato de una cola de prioridad se necesita
verificar cada uno de los elementos almacenados para saber cul es el
menor (o el mayor). Esto trae algunos problemas, el principal es que el
tiempo necesario para eliminar un elemento puede crecer tanto como
elementos tenga la cola.
Para resolver este problema hay varias soluciones:
1. Se coloca una marca de ``vaco'' en la casilla de un elemento
suprimido. Este enfoque realmente no es muy bueno, porque de
cualquier modo se accesan los elementos para saber si es una

43

localidad vaca o no lo es. Por otro lado, cuando se remueven
elementos, se van creando lugares vacos y despus es necesario
hacer una compactacin, reubicando los elementos en el frente de
la cola.
2. Cada supresin puede compactar el arreglo, cambiando los
elementos despus del elemento eliminado en una posicin y
despus decrementando en 1. La insercin no cambia. En promedio,
se cambian la mitad de los elementos de una cola de prioridad para
cada supresin, por lo que esta operacin no es eficiente.

Resumen
En esta unidad hemos visto ESTRUCTURAS DE DATOS y los conceptos de:
Abstraccin, que es describir los datos y las operaciones sin considerar
los factores de su implementacin.
Pila, como una lista lineal de elementos en la cual cada elemento slo
puede ser insertado o eliminado por un extremo denominado CIMA.
Pilas y los lenguajes de programacin, donde aprendimos las operaciones
y los algoritmos tpicos para ejecutarlos.
Colas, que es una lista de elementos en la que la eliminacin slo se
puede hacer por un extremo de la cola (FRENTE) y las inserciones se van a
realizar por otro extremo llamado (FINAL).
Lista enlazada o encadenada que es un conjunto de elementos en los que
cada elemento contiene la posicin o direccin del siguiente elemento de
la lista.
rboles, a los cuales definimos como un conjunto finito de elementos
llamados nodos que guardan entre ellos una relacin jerrquica.
rboles binarios de bsqueda, son aquellos en el que los elementos estn
organizados de tal manera que facilitan las bsquedas.
Tabla Hash, el cual es un contenedor asociativo (tipo Diccionario) que
permite un almacenamiento y posterior recuperacin eficientes de
elementos (denominados valores) a partir de otros objetos, llamados
claves.
Colas de Prioridades, las cuales resultan una aplicacin especfica y muy
til en el manejo de los trabajos en un sistema de computacin.


44


Bibliografa Bsica

Weiss, M.A. (2000). Estructura de Datos en Java. Adisson Weasley.

Bibliografa Ampliatoria
Lage Fernando. (ao de edicin) Fundamentos de algoritmo y programacin.
Nueva Librera.
Ramirez Felipe. (2008) Introduccin a la programacin. Alfaomega.
Perez Berro. (ao de edicin) Algoritmo y Programacin. Nueva Librera.
R.C.T. Lee. (2007). Introduccin al diseo y anlisis de algoritmos. Mxico. Mc
Graw Hill.
Cairo B. (ao de edicin) Metodologa de la Programacin. Editorial.
Joyanes Aguilar. (2000). C. Algoritmos, programacin y estructuras de datos.
Editorial.
Perez Julio. (ao de edicin) Matemtica Discreta y Algoritmos. Editorial.
Joyanes Aguilar. (2005) Algoritmo y estructura de datos una perspectiva en C.
Mc Graw Hill.
De Giusti (2001) Algoritmos datos y programas. Pearson.
Knuth Donald. (1995) Algoritmos fundamentales. REVERTE.
Hernandez Roberto. (2001) Estructuras de datos y algoritmos. Prentice Hall.
Sanchez Velsquez (1998) Introduccin al anlisis de algoritmos. Trillas.
Torres Carmen (1992). Diseo y anlisis de algoritmos. Thomson
Paraninfo,S.A.

www.uesiglo21.edu.ar

You might also like