Вы находитесь на странице: 1из 15

Unidad II

ESTRUCTURAS DINAMICAS DE LOS DATOS

Las estructuras dinmicas de los datos son estructuras que <<crecen a medida que se ejecutan un
programa>>. Una estructura dinmica de datos es una coleccin de elementos llamados nodos- que
son normalmente registros. Al contrario que un array, que contiene espacio para almacenar un nmero
fijo de elementos, una estructura dinmica de datos, se amplia y contrae durante la ejecucin del
programa, basada en los registros de almacenamiento de datos del programa.

Las estructuras dinmicas de datos se pueden dividir en dos grandes grupos:

Lineales

pilas
colas
listas enlazadas

rboles
No lineales
Grafos

Las estructuras de datos se utilizan para almacenamiento de datos del mundo real, que estn
cambiando constantemente. Un ejemplo tpico ya lo hemos visto como estructura esttica de datos: la
lista de pasajeros de una lnea area. Si esta lista se mantuviera en orden alfabtico en un array, sera
necesario hacer espacio para insertar un nuevo pasajero por orden alfabtico. Esto requiere utilizar un
bucle para copiar los datos del registro de cada pasajero en el siguiente elemento del array. Si en su
legar se utilizara una estructura dinmica de datos, los nuevos datos del pasajero se pueden insertar
simplemente entre dos registros existentes con un mnimo esfuerzo.

Colas
Una cola es una lista lineal o un arreglo unidimensional donde los elementos se eliminan solo por un
extremo llamado frente y las inserciones se realizan solo por el otro extremo llamado final. Los
trminos frente y final se usan en una lista para describir pilas.
El concepto de cola es ampliamente utilizado en la vida real; cuando nos situamos en la taquilla de un
cine para obtener nuestra entrada o cuando nos paramos en el autoservicio de un restaurante solemos
hacerlo en una cola. Esto significa que formamos una fila en la que el primero en llegar es el primero
en obtener el servicio y salir de la misma. Esta poltica de funcionamiento se denomina FIFO (First in,
First out) es decir el primer elemento en entrar es el primer elemento en salir.
En la vida real puede perfectamente ocurrir que alguien pretenda saltarse su turno en una cola o
incluso que abandone la misma antes de que le toque el turno. Sin embrago, en ambos casos se esta
incumpliendo la poltica de funcionamiento de la cola y estrictamente hablando esta deja de serlo. En
el mbito se las estructuras de datos definiremos una cola del siguiente modo:
Una cola es un conjunto ordenado de elementos homogneos, en el cual los elementos se eliminan por
unos de sus extremos denominado cabeza y se aade por el otro extremo denominado final.

Los elementos de una cola se almacenan normalmente contiguos en la memoria de la computadora un


elemento detrs de otro- en posiciones sucesivas o adyacentes.
Las operaciones que se pueden realizar con las colas o listas lineales contiguas son:
1. Insertar, eliminar o localizar un elemento.
2. Determinar el tamao de la lista
3. Recorrer la lista para localizar un determinado elemento.
4. Clasificar los elementos de la lista en forma ascendente o descendente.
5. copiar la lista
6. Borrar la lista.
Las colas son otro tipo de estructura lineal de datos, similar a las pilas, diferencindose de ellas en el
modo de insertar/eliminar elementos.
Una cola (queue) es una estructura lineal de datos en la que las eliminaciones se realizan al principio
de la lista, frente (front) y las inserciones se realizan en el otro extremo, final (rear).
Por ello, las colas se usan para almacenar datos que necesitan ser procesados segn el orden de
llegada.
x[1] x[2] x[3]
x[n-1] x[n]
Insercin
Eliminacin

Frente

Final

Tipos de Colas:

Cola Lineal
Cola Circular
Doble Cola
Cola de Prioridades.

La Siguiente Figura (a) es un diagrama esquemtico de una cola con cuatro elementos, donde AAA
es elemento al frente y DDD elemento al final. Obsrvese que los elementos al frente y al final de la
cola son tambin, respectivamente el primero y el ltimo elemento de la cola el cual tiene que ser
AAA. Este se elimina de la cola (b) donde BBB es ahora el elemento al frente. A continuacin,
suponga que se aade EEE a la cola y luego se aade FFF. Los cuales deben ser aadidos al final de la
cola, como se indica en la Figura (c).
Obsrvese que ahora es FFF el elemento final dela cola. Ahora suponga que se elimina otro
elemento de la cola; debe ser BBB quien deje la cola (d).
Obsrvese que en ese tipo de estructura, EEE se eliminara antes que FFF, ya que ha sido
colocado en la cola antes que l. Sin embargo, EEE tendr que esperar hasta que CCC y DDD sean
eliminados.

Figura (1)
(a)

AAA

(b)

(c)

BBB

BBB

CCC

DDD

BBB

CCC

DDD

CCC

DDD

EEE

FFF

CCC

DDD

EEE

FFF

(d)

Ahora veamos la Representacin de una cola a travs de un Arreglo.

Figura (2)
FRENTE: 1
FINAL: 4

AAA BBB CCC DDD


1

...

...

...

...

...

(a)

FRENTE: 2
FINAL: 4

BBB CCC DDD


1

...

(b)

FRENTE: 2
FINAL: 6

BBB CCC DDD EEE


1

FFF
6

...

(c)

FRENTE: 3
FINAL: 6

CCC DDD EEE


1

FFF
6

...

(d)

>>> Representacin de colas


Las colas se pueden representar en la computadora de varias formas, normalmente mediante listas
unidireccionales o arreglos lineales. A menos que se indique lo contrario, nuestras colas se mantendrn
en una arreglos lineal COLA con dos variables punteros: FRENTE, conteniendo la posicin del
elemento al frente de la cola y FINAL , conteniendo la posicin del ltimo elemento de la cola. La
condicin FRENTE = NULO indicar que la cola est vaca.
La figura (2) muestra la forma en que el arreglo de la figura (1) se guardar en
memoria mediante un Arreglo COLA de N elementos. La figura (2) tambin indica la forma en que los
elementos sern eliminados en la cola y la forma en que los nuevos elementos sern aadidos a la cola.
Obsrvese que siempre
que un elemento es eliminado de la cola, el valor de FRENTE se
decrementa en 1; esto se puede implementar por la siguiente asignacin:
FRENTE = FRENTE + 1
De forma similar, siempre que se aade un elemento a la cola, el valor de FINAL se
incrementa en 1 ; esto se puede implementar por la asignacin
FINAL = FINAL + 1

Esto significa que tras N inserciones, el elemento final de la cola ocupar COLA [N] o en otras
palabras, eventualmente la cola ocupara la ltima parte del arreglo. Esto ocurre incluso aunque la cola
misma no contenga muchos elementos.
Suponga que queremos insertar un elemento ITEM en una cola en el momento en
que la cola ocupa la ultima parte del arreglo o sea, cuando FINAL = N. Una forma de hacerlo es
moviendo simplemente la cola entera al principio del arreglo, cambiando FRENTE y FINAL
convenientemente y luego insertando el elemento ITEM de la forma anteriormente explicada. Este
procedimiento puede ser muy costoso. El procedimiento que nosotros adoptaremos asume que el
arreglo COLA es CIRCULAR o sea, que COLA [1] viene tras COLA [N] en el arreglo Con esta
presuncin, insertamos ITEM en la cola asignando ITEM a COLA [1]. Especficamente, en vez de
incrementar FINAL a N + 1, lo reinicializamos a FINAL = 1 y luego asignamos
COLA [FINAL] = ITEM
De forma similar, si FRENTE = N y se elimina un elemento de COLA, reinicializamos a FRENTE =
1 en vez de incrementar FRENTE a N+1.
Suponga que nuestra cola contiene slo un elemento, o sea, que
FRENTE = FINAL NULO
Y suponga que se elimina el elemento. Entonces asignamos
FRENTE = NULO Y FINAL = NULO
Para indicar que la cola est vaca.

La siguiente Figura (3) muestra como se puede mantener una cola circula a travs de un arreglo.

COLA circular con N = 5 posiciones de memoria. Obsrvese que la cola siempre ocupa
posiciones consecutivas excepto cuando ocupa posiciones al principio y al final del arreglo. Si se ve la
cola como un arreglo circular, esto tambin significa qu ocupa posiciones consecutivas. Adems,
como se indica en la figura (3m), la cola estar vaca slo cuando FRENTE = FINAL y se elimina un
elemento. Por esta razn, se asigna NULO a FRENTE y a FINAL en la Figura (3m).

Ahora ya podemos establecer formalmente el procedimiento INSERCOLA que inserta un elemento


ITEM en una cola. Lo primero que hacemos en el procedimiento es ver si hay desbordamiento, es
decir ver si la cola est o no llena.

Figura (3)
(a)

nicialmente Vaca:

COLA
FRENTE: 0
FINAL: 0
1

(b) Se insertan A, B y C:

FRENTE:1
FINAL: 3

(c) elimina A:

FRENTE: 2
FINAL: 3
1

(d) Se insertan D y E

(e) Se eliminan B y C

(f) se inserta F:

FRENTE: 2
FINAL:5

FRENTE: 4
FINAL: 5

FRENTE: 4
FINAL: 1

C
2

E
4

D
1

F
1

E
4

D
2

5
E

5
6

(g) Se elimina D:

(h) Se insertan G y H:

(i) Se elimina E:

(j) Se elimina F:

FRENTE: 5
FINAL: 1

FRENTE: 5
FINAL: 3

FRENTE: 1
FINAL:3

F
1

F
1

F
1

FRENTE: 2
FINAL: 3
1

(k) Se inserta K:

(l) Se eliminan G y H:

(m) Se elimina K, cola vaca:

FRENTE: 2
FINAL: 4

FRENTE:4
FINAL: 4

E
2

E
4

K
4

K
1

FRENTE:0
FINAL:0

Procedimiento INSERCOLA
INSERCOLA ( COLA , N, FRENTE, FINAL, ITEM)
/*Este procedimiento inserta un elemento ITEM en una cola */
1. /* La cola est llena? */
Si FRENTE = 1 y FINAL = 1, o FRENTE = FINAL + 1, entonces:
Escribir : DESBORDAMIENTO y volver.
2. /* Encontrar el nuevo valor de FINAL */
si FRENTE = NULO entonces :
/* la cola estaba vaca al empezar */
hacer FRENTE = 1 y FINAL = 1
si no,
si FINAL = N entonces:
hacer FINAL = 1
si no
hacer FINAL = FINAL +1
/* fin de condicional */
3. hacer COLA [FINAL] = ITEM
/* insertar nuevo elemento */
4. Volver.

Procedimiento ELIMCOLA
ELIMCOLA ( COLA , N, FRENTE, FINAL, ITEM)
/*Este procedimiento elimina un elemento ITEM en una cola */
1. /* La cola est vaca? */
Si FRENTE = NULO, entonces:
Escribir : SUBDESBORDAMIENTO y volver.
2. Hacer ITEM = COLA [FRENTE]
1. /* Encontrar el nuevo valor de FRENTE */
si FRENTE = FINAL, entonces :
/* la cola slo tena un elemento */
hacer FRENTE = NULO y FINAL = NULO
si no, si FRENTE = N , entonces:
hacer FRENTE = 1
si no:
hacer FRENTE = FRENTE + 1
/*fin del condicional */
4. Volver.

Bicola:
Una Bicola es una lista lineal en la que los elementos se pueden aadir o quitar por cualquier extremo
pero no por la mitad. El trmino bicola hace referencia a que se puede ver como una cola
bidireccional.
Hay varias formas de representar una bicola en una computadora. A menos que se indique lo
contrario, asumiremos que nuestras bicolas se mantienen en un arreglo circular BICOLA con punteros
IZQ y DER, que apuntar a los dos extremos de la bicola. Asumiremos que los elementos entre el
extremo izquierdo y el extremo derecho. El trmino <<circular >> viene de3l hecho de que asumimos
que BICOLA [1] va detrs de BICOLA [N] en el arreglo. La figura (4) muestra dos bicolas, cada una
con cuatro elementos contenidos en un arreglo de N = 8 posiciones de memoria. La condicin IZQ =
NULO se usar para indicar que la bicola est vaca.
Existen dos variantes de la doble cola:
Bicola de entrada restringida.
Bicola de salida restringida.
Que son estructuras intermedias entre las colas y las bicolas. Especficamente, una
bicola de entrada restringida es una bicola que slo permite inserciones por uno de los dos extremos
de la lista, pero que permite que las eliminaciones se realicen en cualquier extremo de la lista.
Y una bicola de salida restringida es una bicola que slo permite la eliminacin de elementos por uno
de los dos extremos pero permite que se inserten por cualquiera de los dos.
Los procedimientos que insertan y eliminan elementos en bicolas y las variaciones de esos
procedimientos se dan como problemas suplementarios. Al igual que con las colas, se pueden
complicar si (a) hay desbordamiento, o sea, si se va insertar un elemento en un bicola que ya est
llena o si (b) hay subdesbordamiento, o sea, si se intenta eliminar un elemento de una bicola que esta
vaca.
IZQ: 4
DER: 7

AAA

BBB

CCC

DDD

(a)

IZQ: 7
DER: 2

YYY

ZZZ

WWW XXX

(b)

Cola de Prioridades:
Una cola de prioridades es un conjunto de elementos tales que a cada uno se le ha asignado una
prioridad y de forma que el orden en que los elementos son eliminados y procesados sigue las
siguientes reglas:
1. Un elemento de mayor prioridad son procesados de acuerdo con el orden en que fueron
aadidos a la cola.
2. Dos elementos con la misma prioridad son procesados de acuerdo con el orden en que fueron
aadidos a la cola.
Un prototipo de cola de prioridades es un sistema de tiempo compartido: los programas de mayor
prioridad se procesan primero y los programas con la misma prioridad forman una cola estndar.
Existen varias formas de mantener una cola de prioridades en
memoria. Unas de ellas es a travs de una lista unidireccional y mediante mltiples colas. La
facilidad o dificultad al aadir o eliminar elementos de la cola de prioridades depender
claramente de la representacin que se elija.
Representacin de colas de prioridades por lista nica
Una forma de mantener una cola de prioridades es mediante una lista unidireccional, tal como
sigue:

Figura (4)
PRINCIPIO

AAA

BBB

CCC

EEE

DDD

FFF

GGG

(a) Cada nodo dela lista contendr tres elementos de informacin: un campo de informacin
INFO, un nmero de prioridad NPR y un nmero de enlace ENL.
(b) Un nodo X precede a un nodo Y en la lista (1) si X tiene mayor prioridad que Y o (2) si ambos
tienen la misma prioridad pero X fue aadido a la lista antes que Y. Esto significa que el orden
de la lista corresponde al orden de la cola de prioridades.
10

Los nmeros de prioridad tendrn el significado habitual: a menor nmero, mayor prioridad.
La Siguiente figura (4) muestra un diagrama esquemtico de una cola de prioridades con siete
elementos. El diagrama no nos dice si BBB fue aadido a la lista antes que DDD o despus. Por
otro lado, el diagrama nos dice que BBB fue insertado antes que CCC, ya que BBB y CCC tienen
el mismo numero de prioridad y BBB aparece antes que CCC en la lista.

La Figura (5) muestra la forma en que aparecer la cola de prioridades en memoria usando los
arreglos lineales INFO, NPR, y ENL.

PRINCIPIO

INFO
5

DISP
2

1 BBB
2
3 DDD
4 EEE
5 AAA
6 CCC
7
8 GGG
9 FFF
10
11
12

NPR

ENL

6
7
4
9
1
3
10
0
8
11
12
0

4
4
1
2
5
4

La principal propiedad de esta representacin en una lista unidireccional de una cola de prioridades es
que el elemento de la cola que ha de ser procesado el primero siempre esta al principio de la lista. Por
lo tanto, la eliminacin y procesado de un elemento de la cola de prioridades es una tarea muy simple.
A continuacin se delinea el algoritmo.
(a) Este algoritmo eliminan y procesa el primer elemento de una cola de prioridades que se
mantiene en memoria como una lista unidireccional.
1.
2.
3.
4.

Hacer ITEM = INFO [PRINCIPIO] /* esto salva el dato del primer nodo */
Eliminar el primer nodo dela lista.
Procesar ITEM
Salir.

La adiccin de un elemento de la cola de prioridades es mucho ms complicada que la eliminacin de


un elemento de la cola, ya que necesitamos encontrar el lugar adecuado para insertar el elemento. A
continuacin se esboza el algoritmo.
11

(b) Este algoritmo aade ITEM con nmero de prioridad N a una cola de prioridades mantenida en
memoria por una lista unidireccional.
1. recorrer la lista hasta encontrar un nodo X cuyo nmero de prioridad exceda a N.
Insertar ITEM delante del nodo X.
2. Si no se encuentra tal nodo, insertar ITEM como ultimo elemento de la lista.
El anterior algoritmo de insercin se puede ver como un objeto con peso que s <<Sumerge>> entre
niveles de elementos hasta que encuentra un elemento de peso mayor.
La principal dificultad del algoritmo radica en el hecho de que ITEM se inserta delante del
nodo X. Esto significa que, mientras se recorre la lista, se debe seguir el rastro tambin de la direccin
del nodo que proceda al que se est accediendo.
Considere la cola de prioridades de la figura (4) suponga que un elemento XXX con numero
de prioridad 2 se va a insertar en la cola. Recorremos, la lista, comparando los nmeros de prioridad.
Obsrvese que DDD es el primer elemento de la lista cuyo numero de prioridad excede al de XXX.
Por tanto, XXX se inserta en la lista delante de DDD, como se ilustra en la figura (5). Obsrvese que
XXX va tras BBB y CCC, que tienen la misma prioridad que XXX. Suponga ahora que se va a
eliminar un elemento de la cola. Ser AAA el primer elemento de la lista. Suponiendo que no se
insertan ms elementos, el siguiente elemento que se eliminaran ser BBB, CCC y despus XXX, etc.

Figura (4)
PRINCIPIO

AAA

BBB

CCC

EEE

FFF

DDD

GGG

Figura (5)
PRINCIPIO

AAA

XXX

BBB

CCC

EEE

DDD

FFF

GGG

12

Representacin de colas de prioridades por arreglos


Otra forma de mantener una cola de prioridades en memoria es usar una cola separada para cada nivel
de prioridad (para cada numero de prioridad). Cada una de esas colas aparecer por s misma como un
arreglo circular y deber tener su propio par de punteros. FRENTE y FINAL. De hecho, si a cada cola
se le reserva la misma cantidad de espacio, se puede usar un arreglo hecho, si a cada cola s le reserva
la misma cantidad de espacio, se puede usar un arreglo bidimensional COLA en vez de arreglos
lineales. La Figura (6) muestra esta representacin para la cola de prioridades de la figura (5). Observe
que FRENTE [K] y FINAL [K] contienen, respectivamente, los elementos al frente y al final de la fila
K de COLA, la fila que mantiene la cola de Elementos con nmero de prioridad K.
Figura (6)

FRENTE

FINAL

2
3
4
5
6
AAA
1
2 BBB CCC XXX
3
DDD EEE
4
GGG
5

A continuacin se delinea los algoritmos de eliminacin o insercin de elementos en una cola de


prioridades mantenida en memoria por una arreglo bidimensional COLA, como se acaba de ver.
(a) Este algoritmo elimina y procesa el primer elemento de una cola de prioridades mantenida por
una arreglo bidimensional COLA.
1. /* Encontrar la primera cola no vaca */
Encontrar el menor K tal que FRENTE [K] NULO.
2. Eliminar y procesar el elemento al frente de la fila K de COLA.
3. Salir.
(b) Este algoritmo aade un ITEM con nmero de prioridad M a una cola de prioridades
mantenida por un arreglo bidimensional COLA.
1. Insertar ITEM como el elemento final de la fila M de COLA.
2. Salir.

13

Resumen
De nuevo se ve la oposicin entre el espacio y e tiempo cuando se eligen diferentes
estructuras de datos para un problema dado. La representacin por una arreglo de una cola
de prioridades es ms eficiente en tiempo que la lista unidireccional. Esto es porque cuando
se aade un elemento a una lista unidireccional, se debe realizar una bsqueda lineal en la
lista. Por otro lado, la representacin por lista unidireccional de la cola de prioridades puede
ser mas eficiente en espacio que la representacin de una arreglo. Esto es porque al usar la
representacin por arreglo se da desbordamiento cuando el numero de elementos de uno de
los niveles de prioridad excede la capacidad de ese nivel, mientras que con la lista
unidireccional, el desbordamiento slo se da cuando el numero total de elementos excede la
capacidad total.

Ejercicios:
(a) Considere la siguiente cola de caracteres, donde COLA es un arreglo circular de seis
celdas de memoria:
FRENTE = 2, FINAL = 4

COLA = _, A, C, D, _.

Describir la cola a medida que se realizan las siguientes operaciones:


1) Se aade F a la cola
2) Se eliminan dos letras
3) Se aaden K, L, y M a la cola.
4) Se eliminan dos letras,
5) Se aade R a la cola.
6) Se eliminan dos letras
7) Se aade S a la cola
8) Se eliminan dos letras
9) Se elimina una letra
10) Se elimina una letra
(b) Considere la siguiente bicola de caracteres donde BICOLA es un arreglo circular con seis
celdas de memoria:
IZQ = 2 ; DER = 4
BICOLA = _, A, C, D, _, _.
Describir la bicola a medida que se realizan las siguientes operaciones:
1)
2)
3)
4)

Se aade F a la derecha de la bicola.


Se eliminan dos letras de la derecha
Se aaden K, L Y M a la izquierda de la bicola
Se elimina una letra de la izquierda

14

5) Se aade R a la izquierda de la bicola.


6) Se aade S a la derecha de la bicola.
7) Se aade T a la derecha de la bicola.
Considere la cola de prioridades de la figura (5) ,mantenida como una lista unidireccional.

PRINCIPIO

INFO
5

DISP

1 BBB
2
3 DDD
4 EEE
5 AAA
6
CCC
7
8
GGG
9
10 FFF
11
12

NPR
2
4
4
1
2
5
4

ENL
6
7
4
9
1
3
10
0
8
11
12
0

(a) Describir la estructura fsica tras aadir a la cola (XXX,2) (YYY,3) (ZZZ,2) y (WWW,1).
(b) Describir la estructura si, tras las inserciones anteriores, se elimina tres elementos.
***Problema resuelto
(a) se recorre la lista para encontrar el primer elemento cuyo numero de prioridad exceda el de
XXX. Es DDD, as que se inserta XXX antes que DDD (tras CCC) en la primera celda vaca,
INFO [2]. Entonces se recorre la lista para encontrar el primer elemento cuyo numero de
prioridad exceda el de YYY. De nuevo es DDD. Por lo tanto, insertamos YYY antes de DDD
(tras XXX), en la siguiente celda vaca, INFO[7]. Luego recorremos la lista para encontrar el
primer elemento cuyo numero de prioridad exceda el de ZZZ. Es YYY. Por lo tanto, insertamos
ZZZ antes de YYY (tras XXX) en la siguiente celda vaca, INFO [10]. Por ultimo, recorremos la
lista para encontrar el primer elemento cuyo numero de prioridad exceda el de WWW. Es BBB.
Por lo tanto, insertamos WWW antes de BBB (tras AAA) en la siguiente celda vaca, INFO
[11].
(b) Se eliminan los tres primeros elementos de la lista unidireccional. Especficamente primero se
elimina AAA y su celda de memoria, INFO [5], se aade a la lista DISP. Entonces se elimina
WWW y su celda de memoria, INFO [11], se aade a la lista DISP. Por ultimo, se elimina BBB y
su celda de memoria, INFO [1], se aade a la lista DISP.
NOTA: REALIZAR LA REPRESENTACIN DE UNA COLA DE PRIORIDADES EN UN LISTA
UNIDIRECCIONAL

15

Вам также может понравиться