Está en la página 1de 29

U UN NI IV VE ER RS SI ID DA AD D

J JO OS S C CA AR RL LO OS S M MA AR RI I T TE ER RG GU UI I

CARRERA PROFESIONAL DE
ING. SISTEMAS E INFORMTICA

ESTRUCTURA DE DATOS II



E Es st tu ud di ia an nt te e: :
E Ed dg ga ar r V Va ar rg ga as s T To or rr re es s

D Do oc ce en nt te e: :
L Li ic c. . K Ki il lb be er rt t T To om ma as s C Ch hu us si i

Tacna Per
2011

CAPITULO I

TIPOS DE DATOS

Definicin: El tipo de un dato es el conjunto de valores que puede tomar durante el
programa. Si se le intenta dar un valor fuera del conjunto se producir un error.
La asignacin de tipos a los datos tiene dos objetivos principales:
Por un lado, detectar errores en las operaciones
Por el otro, determinar cmo ejecutar estas operaciones
Un lenguaje fuertemente tipeado es aquel en el que todos los datos deben de tener un
tipo declarado explcitamente, y adems que existen ciertas restricciones en las
expresiones en cuanto a los tipos de datos que en ellas intervienen. Una ventaja de los
lenguajes fuertemente tipeados es que se gasta mucho menos esfuerzo en depurar
(corregir) los programas gracias a la gran cantidad de errores que detecta el compilador.

Clasificaciones en los tipos de datos
Existen muchas clasificaciones para los tipos de datos. Una de estas es la siguiente:
- Dinmicos
- Estticos
El tipo cadena
Estructurados
Simples
Ordinales
No-ordinales

Tipos estticos
Casi todos los tipos de datos son estticos, la excepcin son los punteros. Que un tipo de
datos sea esttico quiere decir que el tamao que ocupa en memoria no puede variar
durante la ejecucin del programa. Es decir, una vez declarada una variable de un tipo
determinado, a sta se le asigna un trozo de memoria fijo, y este trozo no se podr
aumentar ni disminur.

Tipos dinmicos.
Dentro de esta categora entra slamente el tipo puntero. Este tipo te permite tener un
mayor control sobre la gestin de memoria en tus programas. Con ellos puedes manejar
el tamao de tus variables en tiempo de ejecucin, o sea, cuando el programa se est
ejecutando. Los punteros quizs sean el concepto ms complejo a la hora de aprender un
lenguaje de programacin.

Tipos simples
Como su nombre indica son los tipos bsicos. Son los ms sencillos y los ms fciles de
aprender. Los tipos simples ms bsicos son: entero, lgico, carcter y real. Y la
mayora de los lenguajes de programacin los soportan, no como ocurre con los
estructurados que pueden variar de un lenguaje a otro.

Tipos estructurados
Mientras que una variable de un tipo simple slo referencia a un elemento, los
estructurados se refieren a colecciones de elementos.
Las colecciones de elementos que aparecen al hablar de tipos estructurados son muy
variadas: tenemos colecciones ordenadas que se representan mediante el tipo array,
colecciones sin orden mediante el tipo conjunto, e incluso colecciones que contienen
otros tipos, son los llamados registros.

Tipos ordinales
Dentro de los tipos simples, los ordinales son los ms abundantes. De un tipo se dice
que es ordinal porque el conjunto de valores que representa se puede contar, es decir,
podemos establecer una relacin uno a uno entre sus elementos y el conjunto de los
nmeros naturales.
Dentro de los tipos simples ordinales, los ms importantes son:
El tipo entero.
El tipo lgico.
El tipo carcter.

Tipos no-ordinales
Simplificando, podramos reducir los tipos simples no-ordinales al tipo real. Este tipo
nos sirve para declarar variables que pueden tomar valores dentro del conjunto de los
nmeros reales. A diferencia de los tipos ordinales, los no-ordinales no se pueden
contar. No se puede establecer una relacin uno a uno entre ellos y los nmero
naturales. Dicho de otra forma, para que un conjunto se considere ordinal se tiene que
poder calcular la posicin, el anterior elemento y el siguiente de un elemento cualquiera
del conjunto.Cul es el sucesor de 5.12? Ser 5.13, o 5.120, o 5.121, ...



ESTRUCTURAS SECUENCIALES

INTRODUCCION
Supongamos que nos enfrentamos a un problema como este: Una empresa que cuenta
con 150 empleados, desea establecer una estadstica sobre los salarios de sus empleados,
y quiere saber cual es el salario promedio, y tambin cuantos de sus empleados gana
entre $1250.00 y $2500.00.
Si tomamos la decisin de tratar este tipo de problemas con datos simples, pronto nos
percataramos del enorme desperdicio de tiempo, almacenamiento y velocidad. Es por
eso que para situaciones de este tipo la mejor solucin son los datos estructurados.
Un arreglo puede definirse como un grupo o una coleccin finita, homognea y
ordenada de elementos. Los arreglos pueden ser de los siguientes tipos:
- De una dimensin.
- De dos dimensiones.
- De tres o ms dimensiones.


Arreglos Unidimensionales
Un arreglo unidimensional es un tipo de datos estructurado que est formado de una
coleccin finita y ordenada de datos del mismo tipo. Es la estructura natural para
modelar listas de elementos iguales.
El tipo de acceso a los arreglos unidimensionales es el acceso directo, es decir, podemos
acceder a cualquier elemento del arreglo sin tener que consultar a elementos anteriores o
posteriores, esto mediante el uso de un ndice para cada elemento del arreglo que nos da
su posicin relativa.
Para implementar arreglos unidimensionales se debe reservar espacio en memoria, y se
debe proporcionar la direccin base del arreglo, la cota superior y la inferior.

REPRESENTACION EN MEMORIA
Los arreglos se representan en memoria de la forma
siguiente:
x : array[1..5] of integer

Para establecer el rango del arreglo (nmero total de
elementos) que componen el arreglo se utiliza la
siguiente formula:
RANGO = Ls - (Li+1)

Donde:
ls = Lmite superior del arreglo
li = Lmite inferior del arreglo
Para calcular la direccin de memoria de un elemento dentro de un arreglo se usa la
siguiente formula:
A[i] = base(A) + [(i-li) * w]
Donde:
A = Identificador nico del arreglo
i = Indice del elemento
li = Lmite inferior
w = Nmero de bytes tipo componente
Si el arreglo en el cual estamos trabajando tiene un ndice numerativo utilizaremos las
siguientes frmulas:
RANGO = ord (ls) - (ord (li)+1)
A[i] = base (A) + [ord (i) - ord (li) * w]

Arreglos Bidimensionales
Este tipo de arreglos al igual que los anteriores es un tipo de dato estructurado, finito
ordenado y homogneo. El acceso a ellos tambin es en forma directa por medio de un
par de ndices.
Los arreglos bidimensionales se usan para representar datos que pueden verse como una
tabla con filas y columnas. La primera dimensin del arreglo representa las columnas,
cada elemento contiene un valor y cada dimensin representa una relacin
La representacin en memoria se realiza de dos formas: almacenamiento por columnas
o por renglones.
Para determinar el nmero total de elementos
en un arreglo bidimensional usaremos las
siguientes frmulas:
RANGO DE RENGLONES| (R1) =
Ls1 - (Li1+1)
RANGO DE COLUMNAS (R2) = Ls2
- (Li2+1)
No. TOTAL DE COMPONENTES = R1 * R2

REPRESENTACION EN MEMORIA POR COLUMNAS

x : array [1..5,1..7] of integer
Para calcular la direccin de memoria de un elemento se usan la siguiente formula:
A[i,j] = base (A) + [((j - li2) R1 + (i + li1))*w]
REPRESENTACION EN MEMORIA POR RENGLONES


x : array [1..5,1..7] of integer
Para calcular la direccin de memoria de un elemento se usan la siguiente formula:
A[i,j] = base (A) + [((i - li1) R2 + (j + li2))*w]
Donde:
i = Indice del rengln a calcular
j = Indice de la columna a calcular
li1 = Lmite inferior de renglones
li2 = Lmite inferior de columnas
w = Nmero de bytes tipo componente

Arreglos Multidimensionales
Este tambin es un tipo de dato estructurado, que est compuesto por n dimensiones.
Para hacer referencia a cada componente del arreglo es necesario utilizar n ndice, uno
para cada dimensin
Para determinar el nmero de elementos en este tipo de arreglos se usan las siguientes
frmulas:
RANGO (Ri) = lsi - (lii + 1)
No. TOTAL DE ELEMENTOS = R1 * R2* R3 * ...* Rn
Donde:
i = 1 ... n
n = No. total de dimensiones
Para determinar la direccin de memoria se usa la siguiente formula:
LOC A[i1,i2,i3,...,in] = base(A) + [(i1-li1)*R3*R4*Rn + (i2-li2)*R3*R2*... (in -
lin)*Rn]*w

Operaciones Con Arreglos
Las operaciones en arreglos pueden clasificarse de la siguiente forma:
Lectura
Escritura
Asignacin
Actualizacin
Ordenacin
Bsqueda
a) LECTURA
Este proceso consiste en leer un dato de un arreglo y asignar un valor a cada uno
de sus componentes.
La lectura se realiza de la siguiente manera:
Para i desde 1 hasta N haz
x<--arreglo[i]

b) ESCRITURA
Consiste en asignarle un valor a cada elemento del arreglo.
La escritura se realiza de la siguiente manera:
Para i desde 1 hasta N haz
Arreglo[i]<--x

c) ASIGNACION
No es posible asignar directamente un valor a todo el arreglo, por lo que se
realiza de la manera siguiente:
Para i desde 1 hasta N haz
Arreglo[i]<--algn_valor
d) ACTUALIZACION
Dentro de esta operacin se encuentran las operaciones de eliminar, insertar y modificar
datos. Para realizar este tipo de operaciones se debe tomar en cuenta si el arreglo est o
no ordenado.
Para arreglos ordenados los algoritmos de insercin, borrado y modificacin son los
siguientes:
1.- Insertar.
Si i< mensaje (arreglo contrario caso En arreglo[i]<--valor i<--i+1 entonces>
2.- Borrar.
Si N>=1 entonces
Inicio
i<--1
Encontrado<--falso
Mientras i<=n y encontrado=falso
Inicio
si arreglo[i]=valor_a_borrar entonces
Inicio
Encontrado<--verdadero
N<--N-1
Para k desde i hasta N haz
Arreglo[k]<--arreglo[k-1]
Fin
En caso contrario
i<--i+1
Fin
Fin
Si encontrado=falso entonces
Mensaje (valor no encontrado)


3.- Modificar.
Si N>=1 entonces
Inicio
i<--1
Encontrado<--falso
Mientras i<=N y encontrado=false haz
Inicio
Si arreglo[i]=valor entonces
Arreglo[i]<--valor_nuevo
Encontrado<--verdadero
En caso contrario
i<--i+1
Fin
Fin

Matriz Poco Densa Regular
Una Matriz poco densa es aquella que est formada por elementos que en su mayora
son ceros. Este tipo de matrices son matrices cuadradas que se dividen en los siguientes
tipos:
Matriz triangular superior
Matriz triangular inferior
Matriz tridiagonal

MATRIZ TRIANGULAR SUPERIOR
En este tipo de matriz los elementos iguales a cero se encuentran debajo de la diagonal
principal. Ejemplo:

Para evitar el desperdicio de memoria que se ocasionara al almacenar una matrz en
donde la mayora de los elementos son ceros, es conveniente traspasar a un arreglo
unidimensional todos los elementos diferentes de cero.
El arreglo con los elementos distintos de cero de la matrz anterior es el siguiente:

Una vez que hallamos vaciado la matriz, es indispensable conocer el lugar dentro del
arreglo unidimensional en el cual quedaron situados los elementos, y esto se logra con
la siguiente formula:
LOC(A[i,j])=base(A) + (n*(i-1)) - ((i-2)*(i-1))/2 + (j-1)
Donde:
A=Matrz triangular superior
n=No. total de elementos
j= renglones
i=columnas


MATRIZ TRIANGULAR INFERIOR
En este tipo de matrices los elementos iguales a cero se
encuentran por encima de la diagonal principal. Ejemplo:

Una vez que vaciamos la matriz en un arreglo unidimensional,
la formula para obtener las posiciones de los elementos es la siguiente:

LOC(A[i,j])=base(A) + ((i-1)*i)/2 + (j-1)

MATRIZ TRIDIAGONAL
En sta, los elementos diferentes de cero se encuentran en la
diagonal principal en las diagonales por debajo encima
de sta. Ejemplo:

Y el arreglo con los elementos diferentes de cero
correspondiente a esta matrz es el siguiente:

La localizacin de los elementos distintos de cero en el arreglo unidimensional se
realiza aplicando la siguiente formula:
LOC(A[i,j])=base(A) + 2*i + (j-3)

Ordenaciones en Arreglos
La importancia de mantener nuestros arreglos ordenados radica en que es mucho ms
rpido tener acceso a un dato en un arreglo ordenado que en uno desordenado.
Existen muchos algoritmos para la ordenacin de elementos en arreglos, enseguida
veremos algunos de ellos.

a) Seleccin Directa
Este mtodo consiste en seleccionar el elemento ms pequeo de nuestra lista para
colocarlo al inicio y as excluirlo de la lista.
Para ahorrar espacio, siempre que vayamos a colocar un elemento en su posicin
correcta lo intercambiaremos por aquel que la est ocupando en ese momento.
El algoritmo de seleccin directa es el siguiente:
i <- 1
Mientras i<= N haz
min <-i
j <- i + 1
Mientras j <= N haz
si arreglo[j] < [min] entonces
min <-j
j <- j + 1
Intercambia (arreglo[min],arreglo[i])
i <- i +1

b) Ordenacin por Burbuja
Es el mtodo de ordenacin ms utilizado por su fcil comprensin y
programacin, pero es importante sealar que es el ms ineficiente de todos los
mtodos.
Este mtodo consiste en llevar los elementos menores a la izquierda del arreglo
los mayores a la derecha del mismo. La idea bsica del algoritmo es comparar
pares de elementos adyacentes e intercambiarlos entre s hasta que todos se
encuentren ordenados.
i <- 1
Mientras i < N haz
j <- N
Mientras j > i haz
Si arreglo[j] < arreglo[j-1] entonces
Intercambia (arreglo[j],arreglo[j-1])
j < j - 1
i <- i +1

c) Ordenacin por Mezcla
Este algoritmo consiste en partir el arreglo por la mitad, ordenar la mitad
izquierda, ordenar la mitad derecha y mezclar las dos mitades ordenadas en un
array ordenado. Este ltimo paso consiste en ir comparando pares sucesivos de
elementos (uno de cada mitad) y poniendo el valor ms pequeo en el siguiente
hueco.
Procedimiento mezclar(dat,izqp,izqu,derp,deru)
Inicio
izqa <- izqp
dera <- derp
ind <- izqp
Mientras (izqa <= izqu) y (dera <= deru) haz
si arreglo[izqa] < dat[dera] entonces
temporal[ind] <- arreglo[izqa]
izqa <- izqa + 1
en caso contrario
temporal[ind] <- arreglo[dera]
dera <- dera + 1
ind <- ind +1
mientras izqa <= izqu haz
temporal[ind] <- arreglo[izqa]
izqa <- izqa + 1
ind <- ind +1
mientras dera <= deru haz
temporal[ind] <=dat[dera]
dera <- dera + 1
ind <- ind + 1
para ind <- izqp hasta deru haz
arreglo[ind] <- temporal[ind]
Fin
Bsquedas en Arreglos
Una bsqueda es el proceso mediante el cual podemos localizar un elemento con un
valor especfico dentro de un conjunto de datos. Terminamos con xito la bsqueda
cuando el elemento es encontrado.
A continuacin veremos algunos de los algoritmos de bsqueda que existen.

a)Bsqueda Secuencial
A este mtodo tambien se le conoce como bsqueda lineal y consiste en empezar al
inicio del conjunto de elementos, e ir atravez de ellos hasta encontrar el elemento
indicado hasta llegar al final de arreglo.
Este es el mtodo de bsqueda ms lento, pero si nuestro arreglo se encuentra
completamente desordenado es el nico que nos podr ayudar a encontrar el dato que
buscamos.
ind <- 1
encontrado <- falso
mientras no encontrado y ind < N haz
si arreglo[ind] = valor_buscado entonces
encontrado <- verdadero
en caso contrario
ind <- ind +1

b)Bsqueda Binaria
Las condiciones que debe cumplir el arreglo para poder usar bsqueda binaria son que
el arreglo este ordenado y que se conozca el numero de elementos.
Este mtodo consiste en lo siguiente: comparar el elemento buscado con el elemento
situado en la mitad del arreglo, si tenemos suerte y los dos valores coinciden, en ese
momento la bsqueda termina. Pero como existe un alto porcentaje de que esto no
ocurra, repetiremos los pasos anteriores en la mitad inferior del arreglo si el elemento
que buscamos resulto menor que el de la mitad del arreglo, o en la mitad superior si el
elemento buscado fue mayor.
La bsqueda termina cuando encontramos el elemento o cuando el tamao del arreglo a
examinar sea cero.
encontrado <- falso
primero <- 1
ultimo <- N
mientras primero <= ultimo y no encontrado haz

mitad <- (primero + ultimo)/2
si arreglo[mitad] = valor_buscado entonces
encntrado <- verdadero
en caso contrario
si arreglo[mitad] > valor_buscado entonces
ultimo <- mitad - 1
en caso contrario
primero <- mitad + 1

c) Bsqueda por Hash
La idea principal de este mtodo consiste en aplicar una funcin que traduce el valor del
elemento buscado en un rango de direcciones relativas. Una desventaja importante de
este mtodo es que puede ocasionar colisiones.
funcion hash (valor_buscado)
Inicio
Hash <- valor_buscado mod numero_primo
fin
Inicio <- hash (valor)
il <- inicio
Encontrado <- falso
Repite
Si arreglo[il] = valor entonces
Encontrado <- verdadero
En caso contrario
il <- (il +1) mod N
Hasta encontrado o il = inicio

CAPTULO II

2. ESTRUCTURAS DE DATOS

La mayora de los algoritmos empleados para resolver el problema de flujo en una
red, requieren de una manipulacin eficiente de la informacin contenida en los
nodos y en los arcos.

Durante varios aos, muchos analistas se han dedicado a desarrollar diversas
maneras de almacenar y manejar datos empleando la memoria del computador. Se
ha demostrado que la eleccin de un esquema adecuado para manipular datos
relacionados a un determinado problema, tiene un efecto importante en el
desenvolvimiento del algoritmo destinado a su solucin.

Una correcta manipulacin de los datos, produce mejoras en la eficiencia de los
algoritmos que resuelven los problemas de flujo en la red. Estos esquemas de
almacenamiento y manipulacin ms conocidos como estructuras de datos, nos
permiten efectuar varias operaciones bsicas como insertar datos, eliminar datos,
conocer el contenido de la estructura etc. A continuacin se analizan estructuras
tales como: arreglos, listas enlazadas en una direccin, listas doblemente enlazadas,
pilas y colas. Tales estructuras pueden ser implementadas utilizando arreglos o
punteros.

La implementacin mediante arreglos tiene el inconveniente de que el tamao de
mismos debe estar definido de antemano, lo que limita nuestra capacidad de
almacenamiento, caso contrario a lo que sucede con los punteros. En algunas
ocasiones tenemos un nmero, al que llamaremos clave, asociado con cada elemento
de un conjunto. Y se requiere desarrollar varias operaciones como: hallar el
elemento con la mnima clave, insertar un elemento en el conjunto, eliminar un
elemento del conjunto que posea una clave dada, decrementar la clave de un
elemento. Para tales casos se ha desarrollado una estructura de datos que permite
una ejecucin eficiente de esas operaciones conocida como Montculo. Se
analizarn las propiedades inherentes a los montculos, y se har especial nfasis en
el montculo ms eficiente que se ha desarrollado, conocido como Montculo de
Fibonacci.

2.1. Arreglos

Un arreglo es la estructura de datos ms simple empleada para almacenar y
manipular elementos. Se representan mediante una serie de elementos, y cada
uno le corresponde un ndice, el que seala su posicin en el arreglo.

Al arreglo lo denotaremos con la letra A, y a los ndices con la letra i, por lo
que A(i), comprende el elemento i-simo en el arreglo. Cabe resaltar que esta
estructura posee una capacidad de almacenamiento de datos fija N.

1 2 3 4 5 6 N
FIGURA 2.1 Arreglo de dimensin N
Adems es de inters conocer la ltima posicin en la que se almacen un elemento
en el arreglo, a la que se har referencia con la letra L. Se observa que L no puede
ser mayor a N.

Si se desea determinar si un elemento dado, w , pertenece o no al arreglo,
simplemente se recorre desde la posicin en que i=1 y se compara con los datos del
arreglo, se detendr la bsqueda en el caso de que encontremos un elemento igual o
si es que llegamos a la posicin L.

Para insertar un dato, primero verificamos si ste ya pertenece mediante el
procedimiento anterior y si es que todava existe espacio en el arreglo para otro
elemento, lo que se comprueba si L es menor a N. Al cumplirse las condiciones
anteriores insertamos el nuevo dato en la posicin L+1 y ste ser el nuevo valor de
L para una posterior operacin.

Los arreglos no son eficientes para realizar otro tipo de operaciones, como por
ejemplo insertar o eliminar un elemento en una posicin menor a L. Luego de
eliminar un elemento en la posicin k-sima (k<L), se debe cambiar a los datos
situados en k+1, k+2, ... L una posicin hacia atrs y ahora L sera igual a L-1.

Para un elemento en la posicin k-sima (k<L), se debe cambiar a los datos situados
en k, k+1, ... L una posicin hacia delante y ahora L sera igual a L+1. Por estas
razones esta estructura de datos no es utilizada en la prctica para implementar
programas de aplicacin.

2.2. Listas Enlazadas en una Direccin

A fin de evitar el costo lineal de la insercin y de la eliminacin, debe
asegurarse de que la estructura de datos no se almacene contiguamente, ya que
de otra forma se debera mover partes enteras de la misma. Las listas
enlazadas pueden ser descritas mediante arreglos o mediante punteros.

2.2.1. Implementacin en base a Punteros

La lista est conformada por un conjunto de celdas, cada una posee dos
componentes, un puntero y el otro es el elemento que se desea almacenar.
El puntero seala a la siguiente celda. Se requiere un apuntador para la
primera celda, al que se lo llamar inicio.

Con la finalidad de facilitar las operaciones con la lista, la ltima celda no
contendr datos, el campo correspondiente al puntero tendr un valor nulo y
el puntero que la seala se lo denominar final. Para insertar un elemento al
principio de la estructura, se crea una nueva celda. El nuevo elemento es
inicio
final
FIGURA 2.2 Lista enlazada con punteros en una direccin
asignado al campo correspondiente. El puntero de la celda ser inicio. Por
lo que se debe actualizar a inicio, lo que se logra haciendo que seale a la
nueva celda. Si en lugar de insertar un elemento en la primera posicin, se
lo debe colocar en otro lugar el procedimiento es diferente.

Supngase que se pretende un insertar ente llamado X, en una celda
apuntada con un puntero p, la que contiene al elemento Y. Esto se describe
en la siguiente figura.


En primer lugar se crea una nueva celda, en la que se sita a Y, y donde se
hallaba esta se pone al nuevo elemento X. Lo que falta es acomodar los
apuntadores de las celdas. El puntero de la celda indicada por p, que ahora
contiene a X, pasar a enlazar a la casilla recin creada, la que a su vez ser
conectada con la casilla que inicialmente estaba enlazada por el puntero de
la celda sealada por p.


En enlace representado por la lnea punteada debe ser eliminado. Si se
desea agregar un elemento X, al final de la lista, se debe tener en cuenta que
la ltima celda no contiene datos, condicin que se debe mantener luego de
la operacin. Se procede creando una nueva celda. En la que est sealada
por final se coloca a X, y su apuntador que actualmente es nulo pasa a
indicar a la casilla recin creada y su puntero ser nulo. Para finalizar es
necesario actualizar a final, lo que consigue cuando seala a la ltima celda.

Para localizar un dato, simplemente se va recorriendo la lista con ayuda de
los punteros. El recorrido se detendr en caso de encontremos un dato igual
al que estamos comparando o cuando lleguemos al final de la estructura.
Otra operacin importante consiste en eliminar un dato con una direccin
dada p, la que se efecta con un simple cambio de punteros.

Y
inicio
final
p
t
FIGURA 2.5 Lista enlazada que contiene al elemento Y en una celda cuyo
campo enlace contiene al puntero t
Y
inicio
final
p
FIGURA 2.3 Lista enlazada que contiene a un elemento Y en la
direccin p
X
inicio
final
p
Y
FIGURA 2.4 Insercin del elemento X en la direccin P

Suponga que se desea eliminar la celda apuntada por p que contiene a Y, y
que el apuntador de dicha celda es t. En el sitio donde se encuentra p se
coloca a t. Finalmente se elimina la celda.


2.2.2. Implementacin en base a Arreglos

Para describir la lista enlazada definiremos dos arreglos de dimensin N,
uno denominado datos, y el otro enlaces. Las celdas que conforman la lista
se representan mediante los arreglos mencionados. Por ejemplo la k-sima
celda consta de datos(k), donde se almacena un elemento, y de enlace(k),
que contiene la posicin del siguiente elemento. El arreglo enlace debe ser
inicializado con 0 en todas sus entradas. Adems se necesita de un nmero,
llamado primero, el que indica la posicin del primer elemento de la lista.
Si primero vale 0, la lista est vaca.
Esta implementacin ofrece una forma fcil de manipular la estructura de
datos. Si se desea conocer si un elemento pertenece o no a la lista,
definimos una variable llamada sgte. A dicha variable se le asigna el valor
de primero, que si fuera igual a cero, la bsqueda se detendra. Si este no
fuera el caso, se verifica si en datos(sgte), se encuentra el elemento de
inters. Si no es el elemento que buscamos se actualiza el valor de sgte, lo
que se logra haciendo sgte=enlace(sgte).

Este proceso se repetir hasta que se encuentre el elemento con el que
comparamos o hasta que enlace(sgte) sea igual a cero. Para insertar un
nuevo elemento X en la lista, se identifica una celda que no haya sido
utilizada. Cuya posicin ser nuevo, y se realizar la asignacin
datos(nuevo)=X.
Si al nuevo elemento se lo inserta al comienzo de la lista el procedimiento es
el siguiente:
Enlace(nuevo)=primero
Primero=nuevo
La insercin se la puede realizar en cualquier lugar de la lista. Por ejemplo
si se efecta la operacin despus de un elemento ubicado en la posicin
previo, los pasos a seguir son :
Nuevo=previo+1
Datos(nuevo)=6
Enlace(nuevo)=enlace(previo)
Y
inicio
final
t
FIGURA 2.6 Eliminacin de la celda que contiene al elemento Y
Enlace(previo)=nuevo


De forma anloga la eliminacin se puede realizar al principio de la lista o
cualquier lugar. Para borrar un elemento al inicio de la lista basta con
realizar la asignacin primero=enlace(primero).

La eliminacin de un elemento ubicado en otro sitio no es tan simple. Si se
desea eliminar un elemento ubicado en la posicin k, se debe modificar el
arreglo enlace en la posicin en la que est contenido k. Para lo cual se
debe recorrer el arreglo hasta encontrar tal posicin. Los pasos a seguir son:

Siguiente= primero
Mientras enlace(siguiente) sea distinto de k hacer:
Siguiente=enlace(siguiente)

Una vez que enlace(siguiente) sea igual a k, solo falta realizar la
modificacin:
Enlace(siguiente)=enlace(k)

2.3. Listas Doblemente Enlazadas

Esta estructura es similar a la anterior, pero con la diferencia de que a cada
celda se le aade un campo adicional. Cada celda estar enlazada con la
siguiente y con la anterior, con el objetivo de facilitar el acceso a los datos.

2.3.1. Implementacin en base a Punteros


A diferencia de las listas enlazadas en una direccin, esta estructura necesita de
un campo adicional en el que se almacena un puntero, que seala la posicin de
la celda anterior. Por lo que cada celda constar de los componentes: dato, un
puntero a la celda de la derecha designado como sgte, y otro para la celda de la
izquierda llamado ant. Adicionalmente se requiere de un puntero que indique la
ubicacin de la primera celda, al que nos referiremos como inicio, y otro que
seale a la ltima que llamaremos final.



inicio
final
FIGURA 2.7 Lista doblemente enlazada
final
inicio
FIGURA 2.8 Eliminacin de la primera celda

La eliminacin de la primera celda se lleva a cabo simplemente haciendo
que inicio seale a la segunda celda y eliminando los punteros representados
por las lneas punteadas en el grfico. Supongamos que se pretende insertar
un elemento X, al comienzo de la estructura, para lo cual creamos una nueva
celda y en el componente dato almacenamos a X.

Debido a que la insercin se realiza al comienzo de la lista el
puntero ant debe poseer un valor nulo y el puntero sgte debe sealar al lugar
al que previamente lo haca inicio.


Las lneas punteadas del diagrama representan a los punteros A y B. Se
tiene la intencin de insertar un elemento X en el sitio sealado por A. El
primer paso es crear una nueva celda, en el campo dato se almacena a X.

El puntero ant de la nueva celda sealar a la celda a la que apunta B, y sgte
a que es apuntada por A. Finalmente A y B sern
dirigidos hacia la nueva celda.



final
inicio
X
FIGURA 2.9 Insercin de un elemento al inicio de la lista doblemente enlazada
final
inicio
A
B
X
FIGURA 2.10 Insercin del elemento X en la direccin
sealada por el puntero A
final
inicio
X
FIGURA 2.11 Aadir un elemento X al final de la lista doblemente
enlazada
Otra operacin importante, consiste en aadir un elemento X al final de la
lista, para lo cual se crea una celda, en el campo dato se almacena a X. El
campo que corresponde al puntero sgte, poseer un valor nulo, y ant
sealar a la celda a la que apunta final. Para concluir final ser modificado,
pasando a indicar la ubicacin de la celda recin creada.

Para finalizar con las operaciones con listas enlazadas nos queda
la eliminacin de un elemento Y, que no se encuentre en la primera celda, ni
en la ltima. En el grfico se observan los punteros relacionados con la
celda que contiene a Y. La eliminacin es sencilla, simplemente A debe
sealar a la celda indicada por B. De manera similar, D debe apuntar a la
celda que indica C.

2.3.2. Implementacin en base a Arreglos.

Para su descripcin se necesitan tres arreglos de dimensin N. El primero,
denominado datos que almacena los elementos que a ser manipulados.
Otro arreglo llamado enlaceizquierdo y por ltimo enlacederecho.

Enlaceizquierdo contendr a las posiciones de los elementos que preceden a
cada elemento. En enlacederecho se guardarn las posiciones de los
elementos que le siguen a cada elemento. Por ejemplo, si se tiene un
elemento Y ubicado e la posicin J, enlacederecho(J) proporciona la
ubicacin del elemento al que Y precede y enlaceizquierdo(J) nos da la
posicin del elemento que precede a Y en la lista.

De forma similar a las listas enlazadas en una direccin, se nece-
sita de un nmero llamado primero, el cual seala la ubicacin del primer
elemento de la lista. Otro nmero llamado ltimo, indica la posicin del
ltimo elemento de la lista.
La forma de manipular esta estructura es parecida a la de la anterior, pero
con una ventaja adicional. Se puede recorrer la lista de hacia delante
utilizando el arreglo enlacederecho, y hacia atrs empleando el arreglo
enlaceizquierdo.

Para eliminar al inicio, se debe modificar a primero, de la siguiente forma:

Datos(primero)=0
Primero=enlacederecho(primero)
final
inicio
Y
A B
C D
FIGURA 2.12 Eliminacin de un elemento Y, sealado por el puntero A
Enlaceizquierdo(primero)=0

Cabe resaltar que el elemento que ocupa la primera posicin no posee
predecesor, por lo que a Enlaceizquierdo(primero) se le ha asignado el 0.
La insercin de un elemento X en la requiere que disponga de un espacio
vaco en el arreglo. Asumimos que se haya en nuevo. El algoritmo para
aadir un elemento en la primera ubicacin es:

Datos(nuevo)=X
Enlacederecho(nuevo)=primero
Enlaceizquierdo(nuevo)=0
Enlaceizquierdo(primero)=nuevo
Primero=nuevo
Como en el caso anterior el primer elemento no posee un predecesor. Si la
insercin se llevara a cabo a continuacin de un elemento cuyo ndice en el
arreglo sea denotado por previo, pero que no sea el ltimo elemento de la
lista. Primeramente se localiza una celda vaca situada en k y luego se
efecta el proceso:
Datos(k)=X
Enlacederecho(k)=enlacederecho(previo)
Enlaceizquierdo(k)=enlaceizquierdo(enlacederecho(previo))
Enlacederecho(previo)=k
Enlaceizquierdo(enlacederecho(previo))=k

Si se desea eliminar un elemento en la posicin k, pero que a su vez no sea
el ltimo ni el primero, se debe realizar lo siguiente:
Dato(k)=0
Enlacederecho(enlaceizquierdo(k))=enlacederecho(k)
Enlaceizquierdo(enlacederecho(k))=enlaceizquierdo(k)
Enlacederecho(k)=0
Enlaceizquierdo(k)=0

La eliminacin de un elemento situado al final de la estructura es como
sigue:
Datos(ltimo)=0
Enlacederecho(enlaceizquierdo(ltimo))=0
ltimo=enlaceizquierdo(ltimo)
Enlaceizquierdo(ltimo)=0

Para concluir con las operaciones que se pueden realizar, falta analizar la
manera de aadir un elemento X al final de la lista. Para esto se necesita de
un espacio disponible en el arreglo, cuya ubicacin la sealaremos con el
ndice nuevo. Una vez que se ha determinado el lugar disponible se debe
llevar a cabo lo siguiente:
Datos(nuevo)=X
Enlacederecho(nuevo)=0
Enlaceizquierdo(nuevo)=ltimo
Enlacederecho(ltimo)=nuevo
ltimo=nuevo


En el algoritmo anterior se observa que ahora ltimo, nos proporciona dnde
est situado el elemento que se acaba de aadir.

2.4. Pila
La pila es una lista con la restriccin de que las inserciones y las
eliminaciones se realizan nicamente por un extremo.

2.4.1. Implementacin en base a Punteros

Para la implementacin se requiere de celdas con dos componentes, uno
destinado a almacenamiento de los datos y otro a un apuntador para indicar
la posicin de la siguiente celda. Adicionalmente se necesita de otro
puntero llamado cima, el que nos proporciona la direccin de ltima celda
en ser colocada en la pila.


Para aadir un elemento X a la pila se debe crear una nueva celda. A X se lo
almacena en el campo correspondiente, y el puntero de la nueva celda debe estar
dirigido a la celda sealada por cima. Para concluir, cima ahora apuntar a la
nueva celda. Este proceso se muestra en el siguiente grfico:

cima
FIGURA 2.13 Pila con su puntero cima
FIGURA 2.14 Insercin de un elemento X en la pila
cima
X
La eliminacin se lleva a cabo por el mismo extremo de la pila. Se toma al
elemento de la celda a la que apunta cima y hacemos que cima seale a la
direccin que indica el puntero de dicha celda. Finalmente eliminamos la
celda.

2.4.2. Implementacin con Arreglos

Para la implementacin necesitamos un arreglo de dimensin N, al que
llamaremos Pila, y un nmero representado por cima, que corresponde
al ndice en el arreglo, del ltimo elemento en ser insertado. Para
insertar un elemento Y en la Pila, primero se debe comprobar si cima no
es igual a N. En caso de ser menor a N se hace lo siguiente:
Cima=cima+1
Pila(cima)=Y

La eliminacin consiste en tomar al ltimo elemento en ser insertado
y decrementar en una unidad a cima. Cuyo procedimiento se
presenta a continuacin:

Y=Pila(cima)
Cima=cima-1
Antes de tomar sacar al ltimo elemento de la estructura se debe verificar si
cima es diferente de cero, pues si ste fuera el caso la pila estara vaca.

2.5. Cola
En esta estructura los elementos son eliminados respetando el orden en el que
fueron insertados, es decir de manera similar a la cola de un banco, en la que
los primeros en llegar son los primeros en ser atendidos.

2.5.1. Implementacin en base a Punteros
La implementacin con punteros es igual a la de las listas enlazadas en una
direccin, pero solo se permiten dos operaciones, eliminar elementos
ubicados al comienzo de la cola y aadir elementos al final de la cola.

2.5.2. Implementacin en base a Arreglos
Representaremos la mediante un arreglo denominado columna,
de tamao N, junto con dos nmeros llamados inicio y final. Inicio es el
ndice del primer elemento en la cola, menos una unidad. Es decir si el
primer elemento est situado en la posicin tres del arreglo, inicio tomar el
valor de dos. Final es el ndice del ltimo elemento en el arreglo.
Reconoceremos que la cola est vaca si inicio es igual a final. Para aadir
un elemento X basta con llevar a cabo lo siguiente:

Final=final+1
Columna(final)=X

Previamente al aadir un elemento a la cola debemos comprobar si final es
menor a N, en caso de que sea igual la cola estar llena


2.6. Montculos-d

Un montculo es una estructura de datos que permite un almacenamiento y
manejo eficiente de una coleccin H de elementos. Para cada elemento i eH
se tiene un nmero real asociado denominado clave(i).

2.6.1. Definiciones y Propiedades.

En un montculo los nodos se almacenan de forma similar a un rbol
enraizado, en el que los arcos representan una relacin de predecesor-
sucesor entre los nodos. Por lo que se define:
Pred(i).- Predecesor del nodo i en el montculo. Cabe resaltar que el nodo
raz no posee predecesor.
Sucesor(i).- Conjunto de nodos sucesores del nodo i

La profundidad de un nodo i es el nmero de arcos que componen la nica
ruta existente entre el nodo y la raz. En un montculo-d un nodo tiene a lo
mucho d sucesores, los cuales estn ordenados de izquierda a derecha.

A los sucesores de un nodo se los llama hermanos. Cuando se aaden
nodos puede que aumente la profundidad de la estructura o si estn al
mismo nivel se aaden de izquierda a derecha. A esta propiedad se le llama
contiguidad.

2.6.2. Almacenamiento en un Montculo.

Esta estructura permite un almacenamiento de datos como si se
tratase de un arreglo. Dado el siguiente montculo se muestra como se
almacena en un arreglo.


A
B
D
5
C
E F G H
FIGURA 2.15 Montculo
Se observa que los nodos son almacenados de izquierda a derecha. Adems se
conoce la posicin de cada nodo, por ejemplo la posicin del nodo C es 3.
Anteriormente, cuando se hablaba de arreglos se haca nfasis en un parmetro
denotado por la letra L, el que en este caso nos indica cuntos nodos estn
almacenados.

2.7. Montculos de Fibonacci

Los montculos de Fibonacci son una nueva estructura de datos que permite
desarrollar las operaciones requeridas de una forma ms eficiente que los
montculos-d . Los investigadores han bautizado a tal estructura con ese
nombre debido a que los tiempos de ejecucin son obtenido en base a las
propiedades de los nmeros de Fibonacci. Los nmeros de Fibonacci son
definidos de manera recursiva como sigue:
3 ), 2 ( ) 1 ( ) (
1 ) 2 (
1 ) 1 (
> + =
=
=
k k F k F k F
F
F


Dichos nmeros satisfacen las siguientes propiedades.


2.7.1. Propiedad 1

a) Para k mayor o igual a 3
2 / ) 1 (
2 ) (

>
k
k F
b) F(k)=1+F(1)+F(2)+F(3)++F(k-2)


2.7.1.1. Prueba:

En primer lugar se demostrar el literal a).
De la definicin recursiva de los nmeros de Fibonacci se tiene que:

) 2 ( ) 1 ( ) ( + = k k F k F

Adems se sabe que,

) 2 ( ) 1 ( > k k F


A B C D E F G H
1 2 3 4 5 6 7 8 9 N
FIGURA 2.16 Representacin en un arreglo del montculo de la
FIGURA 2.15
Por lo que si en la primera ecuacin se reemplaza F(k-1) por F(k-2), la
expresin se transforma en la desigualdad

) 2 ( 2 ) ( > k F k F
Si k es impar, se cumple que

)... 6 ( 2 ) 4 ( 2 ) 2 ( 2 ) (
3 2 1
> > > k F k F k F k F
2 / ) 1 ( 2 / ) 1 (
2 ) 1 ( 2

= >
k k
F

Si k es par lo demostraremos por induccin:
Para k=4
828 . 2 2 3 ) 4 (
2 / ) 1 4 (
= > =

F
Para k=6
656 . 5 2 8 ) 6 (
2 / ) 1 6 (
= > =

F

Supongamos que se cumple para nmeros pares menores a k. Por lo
tanto:

2 / ) 3 ( 2 / ) 2 (
2 2 ) 2 ( ) 1 ( ) (

+ > + =
k k
k k F k F

Esto se cumple debido a que si k es par entonces k-1 es impar, por lo que
el primer trmino del ltimo miembro es menor o igual que F(k-1). El
segundo trmino aparece porque si k es par, k-2 es par y tambin debido a
la hiptesis de induccin.
Ordenando la expresin se obtiene lo siguiente:

= + = + >

) 2 2 ( 2 2 2 ) (
1 2 / 1 2 / ) 1 ( 2 / ) 3 ( 2 / ) 2 ( k k k
k F
2 / ) 1 ( 2 / ) 1 (
2 207 . 1 * 2

>
k k


Se concluye que el la propiedad se cumple para todo nmero entero k,
mayor o igual a 3.

A continuacin se demostrar el literal b).
Definiremos una funcin G de la siguiente manera

3 ), 2 ( ... ) 3 ( ) 2 ( ) 1 ( 1 ) (
1 ) 2 (
1 ) 1 (
' ' ' ' '
'
'
> + + + + + =
=
=
k k G G G G k G
G
G

Por lo que
) 3 ( ... ) 3 ( ) 2 ( ) 1 ( 1 ) 1 (
' ' ' ' '
+ + + + + = k G G G G k G
Restando la ltima expresin de la penltima se tiene que:
) 2 ( ) 1 ( ) (
' ' '
= k G k G k G
Lo que demuestra que G(k)=F(k)


2.7.2. Propiedad 2

Supongamos que una serie nmeros G(.) satisface lo siguiente:
) 2 ( ... ) 3 ( ) 2 ( 1 ) (
1 ) 2 (
1 ) 1 (
+ + + + >
=
=
k G G G k G
G
G


Para todo k mayor o igual a 3. Entonces
) ( ) ( k F k G >

2.7.2.1. Prueba.

Lo demostraremos por induccin:
Para k=3
) 3 ( 2 ) 1 ( 1 ) 3 ( F G G = = + >

Para k=4
) 4 ( 3 ) 2 ( ) 1 ( 1 ) 4 ( F G G G = = + + >
Supondremos que se cumple para valores de k que van desde 1 hasta q-1.
Si k=q se tiene
... ) 2 ( ) 1 ( 1 ) 2 ( ... ) 2 ( ) 1 ( 1 ) ( + + + > + + + + > F F q G G G q G
) ( ) 2 ( q F q F = +
La igualdad ya fue demostrada en el literal b de la propiedad anterior.

2.7.3. Definicin y Almacenamiento en los Montculos de Fibonacci

Un montculo de Fibonacci es un conjunto de rboles arraigados, donde
cada nodo i del rbol representa un elemento i y cada arco (i,j), corresponde
a una relacin de predecesor-sucesor. En tal relacin el nodo j es el
predecesor o padre y el nodo i es el sucesor o hijo. Para representar el
montculo en forma numrica y de forma efectiva es necesario definir la
siguiente estructura:
Pred(j): Predecesor del nodo i. Si el nodo i es una raz entonces Pred(i)=0.
Succ(i): Conjunto de nodos sucesores del nodo i.
Rango(i): Cardinalidad de Succ(i).
Minclave: El nodo con la mnima clave.

Es necesario recordar que un subrbol sostenido en un nodo i de algn rbol
del montculo, contiene al nodo i, a los sucesores de i y as sucesivamente.
A continuacin se describen las dos operaciones bsicas relacionadas con
los montculos


2.7.3.1. Enlazar(i,j).- Se aplica a dos nodos races distintos de
igual rango. Con lo cual se fusiona dos rboles. Los pasos a seguir
son:
Si clave(j) s clave(i) se aade el arco ) , ( j i al montculo, por lo que j
sera el predecesor del nodo i. Si esto no ocurre, es decir si
clave(i)<clave(j) entonces se aade el arco ) , ( j i

2.7.3.2. Cortar(i).- Mediante esta operacin se corta al nodo i de su
predecesor, el que ahora pasa a ser un nodo raz. Por lo tanto el paso a
seguir es simplemente eliminar arco(i,Pred(i)).

Estas operaciones se realizan en un tiempo de ejecucin O(1). La
manipulacin de esta estructura involucra una secuencia de enlaces y cortes.
Existe una relacin entre el nmero de enlaces y el nmero de cortes.
Denotaremos con al nmero inicial de rboles. Cada operacin del enlace
provoca que = -1, y con cada corte se tiene que = +1. El nmero
total en que se decrementar a est limitado por el nmero inicial de
rboles n, y el nmero total de cortes.


2.7.4. Propiedades en los Montculos de Fibonacci


Esta estructura mantiene un conjunto de rboles enraizados que cambian
dinmicamente mientras se realizan las operaciones de enlazar y cortar. Los
montculos de Fibonacci satisfacen ciertas propiedades que son esenciales
para establecer los lmites de los tiempo de ejecucin de los algoritmos.

Es evidente que los nodos en un montculo de Fibonacci deben satisfacer la
propiedad de orden de los montculos. Adems satisfacen las dos siguientes
propiedades:
-Cada nodo que no es raz ha perdido a lo sumo un sucesor despus de
convertirse en un nodo que no es raz
-No se da que dos nodos races tengan el mismo rango.
De estas dos propiedades se tiene el siguiente lema:

2.7.4.1. Lema.- Un nodo cualquiera en el montculo de Fibonacci tiene
un rango, de a lo ms 2*log n +1.

2.7.4.1.1. Prueba:

Sea G(k) el mnimo nmero de nodos contenidos en un subrbol
suspendido en un nodo de rango k. Sea w un nodo en el
montculo de Fibonacci con rango k. Ordenaremos a los nodos
sucesores de w en el mismo orden en el que fueron enlazados a w.
Asumiremos que el rango del i-simo sucesor de w es por lo menos
i-2. Denotaremos por y al i-simo sucesor y consideraremos el
momento cuando y se enlaz a w.

Antes de enlazar a y, w tena i-1 sucesores. Se debe recordar que dos
nodos se pueden enlazar si tienen el mismo rango, por lo que y tendra i-
1 sucesores. Se observa que un nodo puede perder a los sumo un
sucesor al pasar de ser un nodo raz a un nodo no raz en una operacin
de enlace. Debido a esto y tendra por lo menos i-2 sucesores.
Se concluye que el subrbol sostenido en el nodo w contiene por lo
menos :
) 2 ( ... ) 3 ( ) 2 ( 1 + + + + k G G G sucesores
De las propiedades explicadas anteriormente se tiene que,
) 2 ( ... ) 3 ( ) 2 ( 1 ) ( + + + + > k G G G k G
Finalmente se sabe que
2 / ) 1 (
2 ) ( ) (

> > >
k
k F k G n

2.7.4.2. Restauracin de la Propiedad 2 en los Montculos de
Fibonacci

Con la finalidad de restablecer tal propiedad es necesario mantener un
ndice adicional, llamado perd(i), para cada nodo i, que se define a
continuacin:

Perd(i).- Para un nodo que no es raz representa el nmero de sucesores
que ste ha perdido despus de convertirse en un nodo no raz. Por
definicin, para un nodo raz perd(i)=0.

Supongamos que mientras manipulamos un montculo de Fibonacci,
efectuamos la operacin Cortar(i). A este corte lo llamaremos corte
actual y supongamos que j=Pred(i), en esta operacin el nodo j pierde un
sucesor. Si el nodo j no es un nodo raz, incrementamos perd(j) en una
unidad. En caso de que perd(j) se convierta en 2, la invariante dos
requiere que al nodo j lo convirtamos en un nodo raz. En ese caso
efectuamos la operacin corte(j) y al nodo j lo hacemos raz. Definamos
al nodo k, como k=Pred(j). Tal operacin incrementa perd(k) en una
unidad. Si k no es un nodo raz y perd(k)=2, debemos convertirlo en un
nodo raz tambin y as sucesivamente. De esta manera un corte actual
podra conducir a varios cortes debido a un efecto en cascada. Se
continuar con el desarrollo de esos cortes hasta alcanzar un nodo que
hasta ahora no pierda ningn sucesor o es un nodo raz. Nos referiremos
a esos cortes adicionales que son ocasionados por un corte actual como
cortes en cascada y a toda la secuencia de cortes como multicascada.

Es posible encontrar una relacin entre el nmero total de cortes que se
realizan al manipular un montculo con el nmero total de cortes en
cascada. Para determinar tal relacin consideremos a la funcin
potencial:

e
=
Montculo i
i perd ) ( |

Efectuemos la operacin corte(i) y j=Pred(i). Esta operacin asigna cero
a perd(i) e incrementa perd(j) en una unidad, si j es un nodo que no es
raz. Si el corte es un corte actual, perd(i) es igual a cero o a uno antes del
corte, y si es un corte en cascada perd(i) es igual a uno antes del corte.
Por lo tanto un corte actual incrementa perd(i)+ perd(j) y el valor de la
funcin potencial a lo sumo en una unidad y un corte en cascada
decrementa en perd(i)+perd(j) en por lo menos una unidad. Si
empezamos con un valor de la funcin potencial igual a cero, el total
decrementado en la funcin potencial est limitado por el total de
incrementos.


2.7.4.3. Restauracin de la Propiedad 3 en los Montculos de
Fibonacci

Esta propiedad requiere que no se de el caso de que existan dos nodos
races con el mismo rango. Para mantener esta propiedad, se necesita del
siguiente ndice para cada posible rango k, que van desde k=1,....,K = 2log
n +1

Cubo(k).- Si el montculo de Fibonacci contiene nodos que no son races
con rango igual a k, entonces cubo(k)=0, y si algn nodo raz tiene rango
igual a k, entonces cubo(k)=i.
Supongamos que mientras que manipulamos un montculo de
Fibonacci, creamos un nodo raz j con rango igual a k y que el montculo
todava contiene otro nodo raz i con el mismo rango. Entonces es
necesario repetir un procedimiento para restaurar la invariante nmero 3.

En primer lugar efectuamos la operacin Enlazar(i,j), la cual une dos
rboles enraizados en un nuevo rbol de rango k+1. Denotemos con l a la
raz del nuevo rbol, entonces observando en cubo(k+1), verificamos si el
montculo todava contiene un nodo raz de rango k+1. Si no, habremos
terminado. Caso contrario efectuamos otra operacin de enlace para crear
otro rbol enraizado de rango k+2 y verificamos si el montculo todava
contiene un nodo raz de rango k+2. Repetimos este proceso hasta que se
satisfaga la invariante 3. Nos referimos a esta secuencia de pasos para la
adicin de una nueva raz como multienlazado.

2.7.5. Operaciones en los Montculos de Fibonacci

A continuacin se presentan las operaciones que se pueden realizar en un
montculo.

2.7.5.1. Encontrar-min(i,H).-Retorna el nodo con la mnima clave.
2.7.5.2. Insertar(i,H).- Crea un nuevo nodo raz i y lo aade al montculo
H.
Despus de desarrollar esta operacin el montculo podra violar la
invariante 3, en tal caso es necesario desarrollar la operacin multienlazado
para restaurarla.

2.7.5.3. Decrementar clave ( i, valor ,H).- Primero decrementamos la
clave de i, y le asignamos valor. Despus de que hemos decrementado
la clave del nodo i, cada nodo en el subrbol sostenido en el nodo i todava
satisface la propiedad de orden del montculo: el predecesor del nodo i
podra sin embargo violar esta propiedad. Suponga que j=pred(i), si
clave(j) es menor o igual que valor, todo est correcto. Caso contrario
desarrollaremos un corte actual, corte(i), lo que har del nodo i un nodo
raz y se actualizar minclave. Despus de haber efectuado el corte el
montculo podra violar la invariante 2, por lo que llevaramos a cabo la
operacin de multicascada para restaurarla.

Los cortes en cascada generan nuevos rboles enraizados cuyas races las
almacenaremos en una lista, LIST. Luego, uno a la vez, removemos un
nodo raz de LIST y lo aadimos en el conjunto previo de nodos y
desarrollamos la operacin de multienlazado para satisfacer la invariante.

También podría gustarte