You are on page 1of 45

Mdulo 2

Estructuras de
datos.
2.1- Introduccin.
Qu entendemos por ESTRUCTURA? Respuestas vlidas podran ser, por
ejemplo:

Una organizacin

Un esquema

Un ordenamiento

Estructura de Datos En el mdulo 1 hemos visto que un DATO es la informacin que


manejamos dentro de nuestros algoritmos, por lo cual podemos inferir que
Es una coleccin de una ESTRUCTURA de DATOS es un esquema que nos permite manipular
datos que son tiles datos a fin de facilitarnos la resolucin de un problema, para el cual
para la organizacin y aplicaremos algoritmos.
pensados para facilitar
las operaciones que ella Es claro que un punto crtico en la solucin de un problema reside
necesita. 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.

1
Abstraccin.
Una forma de resolver un problema es analizar las caractersticas y
Abstraccin
condiciones del mismo y de este anlisis armar un modelo, el cual nos
Es describir los datos y ayuda para llegar a una solucin.
las operaciones sin
considerar los factores Ese modelo es un concepto abstracto, el cual fue creado por nosotros para
de su implementacin 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).

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

Ahora podemos referirnos a lo visto en el mdulo 1, cuando describamos


Tipo de Datos los TIPOS de DATOS; en dicha unidad ese concepto nos ayud a realizar
operaciones y ejercicios.
Es la forma de
implementar un tipo de Podemos, en este momento, ampliar dicho concepto y entender qu es
datos abstracto 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.

2
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.

3
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)

PILA Las operaciones que podemos realizar son:


Determinar si la pila est vaca
Maneja el concepto Determinar si la pila est llena
LIFO. Insertar un nuevo elemento a la pila
Eliminar el elemento de la cima, en orden inverso a la insercin
El ltimo elemento en
Crear una lista
entrar es el primero en
salir
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.

4
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

5
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

PILA 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
Una de sus aplicaciones cuando el subprograma llamado termina su ejecucin.
es permitir retornar al
programa principal La direccin de retorno es siempre la siguiente instruccin a la de la
luego de ejecutar un llamada.
subprograma
El 1 en retornar ser el ltimo en efectuar la llamada y por eso
utilizaremos una pila, dado la particularidad LIFO que mencionamos.

6
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).

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

2.4- Colas.
Las caractersticas de esta estructura de datos son:
COLAS
INSERCIN: los elementos que la forman por un extremo llamado FINAL
Maneja el concepto
FIFO ELIMINACIN: slo se realiza por un extremo llamado FRENTE

El primer elemento en Es fcil acceder al primero de la cola, es el que est disponible y tambin es
entrar es el primero en fcil ingresar a la cola; slo hay que colocarse detrs del ltimo.
salir
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.

7
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

8
Procesamiento de las colas

ALGORITMO 39

Insercin
Si ((FRENTE=1 and FINAL=N) o (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

9
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
Bicolas de entrada restringida, si bien podemos eliminar en cualquiera
ELIMINACIN e de los extremos, la insercin slo se hace por el final.
INSERCIN: puede
hacerse en ambos Bicolas de salida restringida, al contrario que la anterior, la insercin se
extremos puede hacer por cualquiera de los extremos pero se elimina slo por el
frente.
INSERCIN: 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
fin si
fin si

10
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 frente

11
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


LISTAS LINEALES una computadora en posiciones sucesivas de memoria; cuando se
almacenan en cinta magntica, los elementos se presentan en sucesin en
Se almacenan en la cinta.
posiciones sucesivas de
memoria. 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

12
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.

LISTAS ENLAZADAS 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
Cada elemento contiene la posicin del siguiente elemento.
contiene la posicin del
siguiente elemento de Los elementos de una lista son enlazados por medio de los campos enlace.
la lista.
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,

13
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

14
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.

LISTAS ENLAZADAS EN Necesitamos tambin una variable especial llamada COMIENZO que
MEMORIA 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
Necesitamos de la lista, los 2 arrays tendrn el mismo nmero de elementos tal que:

Variable de inicio: INFO(I) ser la informacin del nodo que ocupa la posicin I en el
COMIENZO array.

Indicador de fin: NULO 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

15
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

16
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

17
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:

18
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:

19
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.

20
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

21
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

22
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

23
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

24
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.

25
Los rboles representan estructuras no lineales y dinmicas.
RBOLES
Un rbol se define como un conjunto finito de elementos llamados nodos
Un conjunto finito de
que guardan entre ellos una relacin jerrquica.
elementos, con un nodo
especial llamado RAZ y Existe un nodo diferenciado llamado raz del rbol, y los dems nodos
nodos inferiores forman conjuntos diferentes cada uno de los cuales es a su vez un rbol, a
llamados HIJOS 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.

26
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.

27
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

28
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.

ABCXDE

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

29
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.

30
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.

31
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:

32
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))

33
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

34
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

35
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

36
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.

37
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.

38
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:

39
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.

40
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.

41
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

42
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.

43
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

44