Está en la página 1de 92

DISEO Y ANLISIS DE ALGORITMOS

1. CONCEPTOS BASICOS.

Una posible definicin de algoritmo es un conjunto de reglas que permiten obtener un resultado
determinado apartir de ciertas reglas definidas.
Otra definicin sera, algoritmo es una secuencia finita de instrucciones, cada una de las cuales
tiene un significado preciso y puede ejecutarse con una cantidad finita de esfuerzo en un tiempo
finito. Ha de tener las siguientes caractersticas: Legible, correcto, modular, eficiente,
estructurado, no ambiguo y a ser posible se a de desarrollar en el menor tiempo posible.
!aractersticas de un algoritmo de computador:
Ser algoritmo: "iene que consistir en una secuencia de instrucciones claras y
finitas.
Ser correcto: #l algoritmo a de resol$er el problema planteado en todas sus
facetas.
Ser legile.
Ser e!icie"te: #s relati$a porque depende de la maquinas en la que lo
ejecutemos. #%isten ejemplos de algoritmos eficientes que ocupan demasiado
espacio para ser aplicados sin almacenamiento secundario lento, lo cual puede
anular la eficiencia.
Un algoritmo eficiente pero complicado puede ser inapropiado porque
posteriormente puede tener que darle mantenimiento otra persona distinta del
escritor.

#. DISEO DE ALGORITMOS.

&ases de dise'o de algoritmos.
1. Di$e%o: se dan las especificaciones en lenguaje natural y se crea un primer modelo
matem(tico apropiado. La solucin en esta etapa es un algoritmo e%presado de manera muy
informal.
#. Im&leme"taci'": #l programador con$ierte el algoritmo en cdigo, siguiendo alguna de
estas ) metodologas.
A. TOP(DO)N se alcanza el programa sustituyendo las palabras del palabras
del pseudocdigo por secuencias de proposiciones cada $ez mas detalladas, en
un llamado refinamiento progresi$o.
B. BOTTON(*P parte de las erramientas mas primiti$as asta que se llega al
programa.


C. TAD+S modularizacin dependiendo de los recursos."enemos unas
estructuras abstractas implementadas, y una serie de conocimientos asociados a
esos recursos.

,. Pr-ea$: #s un material que se pasa al programa para detectar posibles errores.#sto no quiere
decir que el dise'o no tenga errores, puede tenerlos para otros datos.

,. COMPLE.IDAD DE ALGORITMOS.

La eficiencia de un determinado algoritmo depende de la maquina, y de otros factores e%ternos
al propio dise'o. *ara comparar dos algoritmos sin tener en cuenta estos factores e%ternos se usa
la complejidad. #sta es una media informati$a del tiempo de ejecucin de un algoritmo, y
depende de $arios factores:
/ Los datos de entrada del programa. +entro de ellos, lo m(s importante es la
cantidad, su disposicin, etc.
/ La calidad del cdigo generado por el compilador utilizado para crear el
programa.
/ La naturaleza y rapidez de las instrucciones empleados por la m(quina y la
propia m(quina.
/ La propia complejidad del algoritmo base del programa.
#l eco de que el tiempo de ejecucin dependa de la entrada, indica que el tiempo de ejecucin
del programa debe definirse como una funcin de la entrada. #n general la longitud de la
entrada es una medida apropiada de tama'o, y se supondr( que tal es la medida utilizada a
menos que se especifique lo contrario.
,e acostumbra, pues, a denominar T0"1 al tiempo de ejecucin de un algoritmo en funcin de "
datos de entrada.*or ejemplo algunos programas pueden tener un tiempo de ejecucin.
"-n./!n
0
, donde ! es una constante que engloba las caractersticas de la m(quina y otros
factores.
Las unidades de "-n. se dejan sin especificar, pero se puede considerar a "-n. como el numero
de instrucciones ejecutadas en un computador idealizado, y es lo que entendemos por
complejidad.
*ara mucos programas, el tiempo de ejecucin es en realidad una funcin de la entrada
especifica, y no slo del tama'o de ella.#n cualquier caso se define "-n. como el tiempo de
ejecucin del peor caso, es decir, el m(%imo $alor del tiempo de ejecucin para las entradas de
tama'o n.
/ Un algoritmo es de orden polinomial si "-n. crece mas despacio, a medida que
aumenta n, que un polinomio de grado n. ,e pueden ejecutar en un computador.
/ #n el caso contrario se llama e%ponencial, y estos no son ejecutables en un
computador.


,.1 Notaci'" O gra"2e.
*ara acer referencia a la $elocidad de crecimiento de los $alores de una funcin se usara la
notacin conocida como 1O grande1.+ecimos que un algoritmo tiene un orden O-n. si e%isten y
un n
2
y un c, siendo c32, tal que para todo n3/n
2
, "-n.4/c5 f-n..
! estara determinado por: 6!alidad del cdigo obtenido por el compilador.7
6!aractersticas de la propia m(quina.

#jemplo:
"-n. / -n89.
0
n
0
80n89 4/ c6n
0
n 3/ n
2
n
2
/ 9
Orden n
0
es O-n
0
.
,.# Pro&ie2a2e$ 2e la "otaci'" O gra"2e.
,i multiplicamos el orden de una funcin por una constante, el orden del algoritmo sigue siendo
el mismo.
O-c6f-n.. / O-f-n..
La suma del orden de dos funciones es igual al orden de la mayor.
O-f-n.8g-n.. / O-m(%-f-n.:g-n...
,i multiplicamos el orden de dos funciones el resultado esta multiplicacin de los ordenes.
,.3 Or2e" 2e crecimie"to 2e !-"cio"e$ co"oci2a$.
O-9. 4 O-log-n.. 4 O-n. 4 O-log-n.n. 4 O-n;<. 4 O-<;n.
,.5 Regla$ 2e calc-lo 2e com&le6i2a2 2e T0"1.
#l tiempo de ejecucin de cada sentencia simple, por lo com=n puede tomarse como O-9..
#l tiempo de ejecucin de una secuencia de proposiciones se determina por la regla de la suma.
#s el m(%imo tiempo de ejecucin de una proposicin de la sentencia.
*ara las sentencias de bifurcacin ->&,!?,#. el orden resultante ser( el de la bifurcacin con
mayor orden.
*ara los bucles es el orden del cuerpo del bucle sumado tantas $eces como se ejecute el bucle.
#l orden de una llamada a un subprograma no recursi$o es el orden del subprograma.
>>. Ti&o$ 2e 2ato$ 7 TAD+S.
1. ABSTRACCION.
*ara realizar un programa complicado, debemos di$idirlo en partes que resuel$an subproblemas
del problema original.#n este caso el objeti$o debe ser la descomposicin del programa en
mdulos que sean ellos mismos programas de tama'o peque'o y que interactuen unos con otros
de forma sencilla y bien definida.
#n programacin estructurada se recomienda usar la abstraccin como forma de descomponer
un problema.?l lle$arla a cabo se ignoran ciertos detalles de manera que el problema original se
$ea en forma mas simple al atender solo a que operaciones ay que realizar, pero no a como ay
que realizarlas.
#l m@todo de descomposicin en base a abstracciones se continua aplicando asta llegar a
operaciones lo bastante sencillas como para ser programadas de forma directa.
#. TAD.
La denominacin "?+ engloba dos clases de abstracciones:
?bstracciones de datos.
?bstracciones funcionales.
Las primeras aparecen al abstraer el significado de los diferentes tipos de datos significati$os
que inter$ienen en el problema.*ermiten definir nue$os tipos de datos especificando sus
posibles $alores y las operaciones que los manipulan.
Las segundas surgen al plantearse de una manera abstracta las operaciones significati$as del
problema.,on una erramienta muy poderosa que permite dotar a una aplicacin de operaciones
que no est(n definidas directamente en el lenguaje en el que estamos trabajando.
#n resumen, un "?+ es un conjunto de $alores y unas operaciones definidas sobre esos
$alores.!ada $ez que deseemos emplear el "?+ solo lo podemos acer con las operaciones
definidas, incluso no sabiendo como est(n implementadas.
#.1 Caracter8$tica$ 2e lo$ TAD.
9 !ada modulo es una abstraccin del problema, no conocemos el detalle.
9 ,e puede realizar una especificacin bre$e y precisa del "?+.
9 !on esta especificacin se puede usar correctamente el "?+.
9 ,i realizamos, no se $a a alterar considerablemente la especificacin.
9 !ada modulo "?+ $a a poder ser compilado por separado.
9 Las comunicaciones entre los mdulos $an a ser pocas y claras.
9 !ada modulo debe tener un tama'o razonable.

,. ESPECI:ICACION E IMPLEMENTACION.
#squema del dise'o de un "?+:


"?+
USUARIO A DISEAdoR
8666666666666666666666666666668
A A
A A
#specificacin >mplementacin
A A
866666666666666668 8666666666666666668
A A A A
,int(ctica ,em(ntica Bepresentacin ?lgoritmos


,.1 E$&eci!icaci'".
9 ,int(ctica: ,e definen los smbolos de los operadores, nombre de los procedimientos y
funciones, tipos y numero de los operandos utilizados, y el tipo y numero de las salidas de estas
operaciones.
9 ,em(nticas: *ara cada una de la posibles entradas a nuestras operaciones diremos la salida o
salida de errores.
,.# Im&leme"taci'".
Los algoritmos unido a la representacin da como resultado una posible implementacin del
"?+.
1; E$&eci!icacio"e$ e" le"g-a6e "at-ral.
,e describen en lenguaje natural el nombre de la operaciones que $amos a usar, as como las
e%cepciones que tienen esas operaciones.?l especificar la abstraccin solo se deben describir
aquellos aspectos que sean rele$antes para la solucin del problema.
#s esencial utilizar un lenguaje que sea preciso y de f(cil comprensin, de forma que no quepan
ambigCedades entorno al comportamiento deseado.La especificacin se puede realizar mediante
un esquema similar a lo que ser( la cabecera del programa al codificarlo.+ico esquema deber(
contener la forma de la llamada, con el nombre de la funcin, sus argumentos y resultados, as
como una informacin de si modifica alguno de esos argumentos o bien accede a $ariables
globales.
,e debe incluir una descripcin general de lo que ace la funcin, pero sin entrar en el detalle de
como lo ace.
O*#B?!>OD nombre -argumentos. +#EU#LE# -resultado.
B#FU>,>"O,:
GO+>&>!?:
#&#!"O,:

#< E$&eci!icacio"e$ o&eracio"ale$.
+escribe el "?+ mediante un lenguaje de alto ni$el, sin tener en cuenta la eficiencia.
,< E$&eci!icacio"e$ !-"cio"ale$.
,e describe o implementa una funcin matem(tica que define una relacin entre la entrada y la
salida.
3< E$&eci!icacio"e$ l'gica$.
,e realizan mediante asertos de entrada y salida o in$ariantes. #stos $an a describir las
condiciones iniciales y finales de ejecucin de nuestro "?+.
5< E$&eci!icacio"e$ Algeraica$.
+escriben al "?+ como un algebra, y para implementarlo $amos a tener que desarrollar los
a%iomas que definen este algebra.!on estos a%iomas $a a ser posible un desarrollo matem(tico
de las e%cepciones.Eamos a tener dos partes: sint(ctica -o definicin de los operadores. y
sem(ntica -a%iomas..


#l conjunto de operaciones definidas sobre el tipo abstracto de datos debe ser cerrado, es decir,
solo se debe acceder a los $alores de los datos empleando las operaciones abstractas definidas
sobre ellos.La abstraccin de datos es como una caja que encierra los datos y solo permiten
acceder a ellos de manera controlada.
La abstraccin de datos debe realizar una importante labor de ocultamiento, aciendo que desde
el e%terior solo sea $isible el efecto global de las operaciones, pero no el detalle de como se
realizan ni como se representan internamente los $alores de los datos.
,., Pro&ie2a2e$ 2e lo$ TAD.
9 >nstanciabilidad: Eamos a poder declarar $ariables del tipo "?+, y estas $an a tener las
mismas propiedades y caractersticas que el "?+.
9 *ri$acidad: Do $amos a conocer detalladamente las operaciones ni la estructura que utiliza
ese "?+.
9 !omponibilidad jer(rquica: Un "?+ puede estar formado por otros "?+ mas b(sicos.
9 #nriquecimiento: *odemos a'adir operaciones al "?+.
E6em&lo 1

#specificaciones algebraicas sem(nticas de un "?+ pila con los siguientes operaciones:
6 !rea*ila -. 6663 *ila
6 >ntroducir -*ila,#lem. 6663 *ila
6 +ecapitar -*ila. 6663 *ila
6 !ima -*ila. 6663 #lem
6 Eacia -*ila. 6663 HOOL#?D
*ara toda * de tipo *ila y # de tipo #lemento tenemos:
9 Eacia -!rea*ila-*.. 6663 "BU#
9 Eacia ->ntroducir-*,#.. 6663 &?L,#
9 +ecapitar -!rear*ila-*.. 6663 #BBOB
9 +ecapitar ->ntroducir-*,#.. 6663*
9 !ima -!rea*ila-*.. 6663 #BBOB
9 !ima ->ntroducir-#.. 6663#

E6em&lo #

#ditor de ficeros secuenciales con cinco operaciones: !rear un nue$o ficero, insertar,
reemplazar, eliminar, a$anzar y retroceder, actuando siempre sobre el registro actual.
*ara las especificaciones en lenguaje natural ay que describir el nombre de las operaciones que
$amos a realizar, junto con las e%cepciones de dicas operaciones.

Operaciones:

9 :ic=ero>N-e?o 0:ic=ero1: !rea un ficero nue$o sin introducir ning=n registro en el
-n=mero de registros es 2..
9 I"$ertar 0:ic=ero@Regi$tro1: >nserta un registro despu@s del registro actual y el nue$o pasa a
ser el actual.
9 Reem&laAar 0:ic=ero@Regi$tro1: !ambia el registro actual por el nue$o.
9 Elimi"ar 0:ic=ero1: Horra el registro actual y una $ez eliminado el actual pasa a ser el
siguiente.
9 A?a"Aar 0:ic=ero1: #l registro siguiente pasa a ser el actual.
9 Retroce2er 0:ic=ero1: #l registro anterior pasa a ser el actual.




#%cepciones:
CONDICION ACCION
6 >nsertar &icero $acio >nserta en la primera posicin
6 Beemplazar &icero $acio Dada
6 #liminar &icero $acio Dada
?ctual es el =ltimo Horra y actual ser( el anterior
6 ?$anzar &icero $acio Dada
?ctual es el =ltimo Dada
6 Betroceder &icero $acio Dada
?ctual es el primero Do ay registro actual
La descripcin del "?+ mediante un lenguaje de alto ni$el no tiene porque tener en cuenta la
eficiencia.

+efinicin de tipos:
&icero/?BB?I J9..nK O& >D"#L#BM
Longitud:>D"#L#BM
BegN?ctual:>D"#L#BM
>mplementacin de las operaciones:

&iceroNDue$o -&icero.M
H#L>D
Longitud:/2M
BegN?ctual:/2M
#D+M

>nsertar -&icero,BegDue$o.M
H#L>D
for j:/Longitud doOD"O Beg?ctual do
&icero Jj89K:/&iceroJjKM
&iceroJBeg?ctual89K:/BegDue$oM
Longitud:/Longitud89M
Beg?ctual:/Beg?ctual89
#D+M

Betroceder -&icero.M
H#L>D
>& Beg?ctual432 "H#D Beg?ctual:/Beg?ctual69
#D+M

#liminar -&icero.M
H#L>D
>& Beg?ctual432
"H#D for j:/?ctual "O Longitud69 do
&iceroJjK:/&iceroJj89KM
>& Beg?ctual3Longitud "H#D Beg?ctual:/Beg?ctual69
#D+M
?$anzar -&icero.M
H#L>D
>& Beg?ctual43Longitud
"H#D Beg?ctual:/Beg?ctual89
#D+M

Beemplazar -&icero,BegDue$o.M
H#L>D
>& Beg?ctual432
"H#D &iceroJBeg?ctualK:/BegDue$o
#D+M

#specificaciones algebraicas sint(cticas:
&iceroNDue$o -. 6663 &icero
>nsertar -&icero. 6663 &icero
Beemplazar -&icero,Begistro. 6663 &icero
#liminar -&icero. 6663 &icero
?$anzar -&icero. 6663 &icero
Betroceder -ficero. 6663 &icero

#specificaciones algebraicas sem(nticas:
Eamos a definir la operacin G-%,y. que une las dos partes, % e y y deja el ficero como estaba:
9 G n
866666666666666666666666666668
866666666666666666666666666668
9 G G89 n
8666666666668 866666666666666668
8666666666668 866666666666666668
P I

6 &iceroNDue$o-. / G-&iceroNDue$o,&iceroNDue$o.
6 >nsertar-r,G-%,y.. / G->nsertar-r,%.,y.
,e inserta en la parte P porque es la que contendra el registro actual.
6 Beemplazar-s,G->nsertar-r,%.,y.. / G->nsertar-s,%.,y.
6 Beemplazar-r,G-&iceroNDue$o,y.. / G-&iceroNDue$o,y.
"ener la parte P sin elemento es como tener el ficero $acio, porque el registro actual est( en la
parte P.
6 #liminar-G->nsertar-r,%.,y.. / G-%,y.
,i insertas y eliminas no aces nada.
6 #liminar-G-&iceroNDue$o,y.. / G-&iceroNDue$o,y.
6 ?$anzar-G,-%,>nsertar-r,y... / G->nsertar-r,%.,y.
6 ?$anzar-G,-%,&iceroNDue$o.. / G-%,&iceroNDue$o.
6 Betroceder-G->nsertar-r,%.,y.. / G-%,>nsertar-r,y..
6 Betroceder-G-&iceroNDue$o,y.. / G-&iceroNDue$o,y.
>>>. Rec-r$i?i2a2. +efinicin y conceptos b(sicos.
1. DE:INICION.

Hablamos de recursi$idad, tanto en el (mbito inform(tico como en el (mbito matem(tico,
cuando definimos algo -un tipo de objetos, una propiedad o una operacin. en funcin de si
mismo.La recursi$idad en programacin es una erramienta sencilla, muy =til y potente.
#jemplo:
5 La potenciacin con e%ponentes enteros se puede definir:
a / 9
a
n
/ a:a
-n69.
si n3
5 #l factorial de un entero positi$o suele definirse:
Q / 9
nQ / n:-n69.Q si n3
#n programacin la recursi$idad supone la posibilidad de permitir a un subprograma llamadas a
si mismo, aunque tambi@n supone la posibilidad de definir estructuras de datos recursi$as.

#. TIPOS.

*odemos distinguir dos tipos de recursi$idad:
5 Directa: !uando un subprograma se llama a si mismo una o mas $eces
directamente.
5 I"2irecta: !uando se definen una serie de subprogramas us(ndose unos a
otros.La recursi$idad indirecta se consigue en *ascal, a pesar de la condicin
general de que todo subprograma a de definirse antes de ser usado, con una
predeclaracin de uno de los subprogramas -la cabecera completa. seguida de la
directi$a &OBO?B+. ?l declarar despu@s ese subprograma solo es necesario
escribir el nombre, no los par(metros.
#l lenguaje *?,!?L permite el uso de la recursi$idad.#n cambio,ay una serie de lenguajes
que no la permiten, como el &OB"B?D, Hasic, etc, y otros que la consideran una estructura de
control principal, como el L>,* y todos los lenguajes funcionales.

,. CARACTERISTICAS.

Un algoritmo recursi$o consta de una parte recursi$a, otra iterati$a o no recursi$a y una
condicin de terminacin.La parte recursi$a y la condicin de terminacin siempre e%isten.#n
cambio la parte no recursi$a puede coincidir con la condicin de terminacin.
?lgo muy importante a tener en cuenta cuando usemos la recursi$idad es que es necesario
asegurarnos de que llega un momento en que no acemos m(s llamadas recursi$as.,i no se
cumple esta condicin el programa no parar( nunca.
*ara asegurarnos de su terminacin podemos tener, por ejemplo, un par(metro o una funcin de
los par(metros que disminuya en cada llamada y, adem(s, la llamada recursi$a debe estar
condicionada para que no se ejecute siempre -con una instruccin >&, OH>L#, !?,#, etc..?
esta pregunta es a lo que llamamos condicin de terminacin.

&UD!">OD &act -n:>D"#L#B.:>D"#L#BM
H#L>D
if n4/9
"H#D &act:/9
#L,# &act:/n:&act-n69.
#D+M

*ara saber si un programa recursi$o funciona bien, debemos comprobar lo siguiente:
5 Fue e%iste al menos una condicin de terminacin para la cual la e$aluacin
es no recursi$a, y que funciona correctamente en el caso o casos no recursi$os,
si los ay.
5 !ada llamada se realiza con un dato mas peque'o, en el sentido de conseguir
que se acabe cumpliendo la condicin de terminacin.
5 ,uponiendo que las llamadas recursi$as funcionan bien, que el subprograma
completo funciona bien.

3. BENTA.AS E INCONBENIENTES.

La principal $entaja es la simplicidad de comprensin y su gran potencia, fa$oreciendo la
resolucin de problemas de manera natural, sencilla y eleganteM y facilidad para comprobar y
con$encerse de que la solucin del problema es correcta.
#l principal incon$eniente es la ineficiencia tanto en tiempo como en memoria, dado que para
permitir su uso es necesario transformar el programa recursi$o en otro iterati$o, que utiliza
bucles y pilas para almacenar las $ariables.

5. *SO DE LA REC*RSIBIDAD.

5 #n estructuras de datos definidas recursi$amente.
5 !uando no aya una solucin iterati$a clara y simple.
5 !uando el algoritmo sea claramente recursi$o.

E.EMPLO 1

*ermutaciones, $ariaciones sin repeticin, se dan todos los n=meros y todos ellos repetidos.#l
siguiente es el algoritmo iterati$o para cuatro numeros:

a:?BB?IJ9..RK O& 9..RM
&OB aJ9K:/9 "O R +O
&OB aJ0K:/9 "O R +O
&OB aJ)K:/9 "O R +O
&OB aJRK:/9 "O R +O
>& -aJ9K43aJ0K. ?D+ -aJ0K43aJRK. ?D+ -aJ9K43aJ)K.
?D+ -aJ9K43aJRK. ?D+ -aJ0K43aJ)K.
?D+ -aJ0K43aJ)K. ?D+ -aJ)K43aJRK.
"H#D escribir numero

#l orden de este algoritmo es R
R
, luego si lo tu$i@semos que implementar para n elementos el
orden seria n
n
.Hay que realizar una reduccin de bucles &OB anidados.

&OB aJ9K:/9 "O R +O
&OB aJ0K:/9 "O R +O
>& aJ9K43aJ0K
"H#D &OB aJ)K:/9 "O R +O
>& -aJ9K43aJ)K. ?D+ -aJ0K43aJ)K.
"H#D &OB aJRK:/9 "O R +O
>& -aJ9K43aJRK. ?D+ -aJ0K43aJRK.
?D+ -aJ)K43aJRK. "H#D $alida

,i lo queremos para n numeros necesitamos n &OB, por tanto cada n=mero necesitar( una
implementacin diferente, cada una con un n=mero diferente de &OB.La mejor solucin es un
algoritmo recursi$o:
5 Leneramos el primer n=mero y permutamos -n69..
5 Leneramos el segundo n=mero y permutamos -n60. si es $(lida.
5 Leneramos el tercer n=mero y permutamos -n6). si es $(lida.

*BO!#+UB# *ermutar -n,"am:>D"#L#B.M
H#L>D
if n4/"am
"H#D &OB aJnK:/9 "O "am +O
>& Ealida-n.
"H#D *ermutar-n89,"am.
#L,# escribir
endM


&UD!">OD Ealida -n:>D"#L#B.:>D"#L#BM
E?B i:>D"#L#BM
H#L>D
Ealida:/"BU#M
&OB i:/9 "O n69 +O
>& aJiK/aJnK "H#D Ealida:/&?L,#
#D+M

C. LAS TORRES DE DANOI

"enemos tres torres y " discos en la primera de ellas, que $amos a llamar origen, y los tenemos
que lle$ar a la torre destino teniendo en cuenta que:
9 ,olo podemos mo$er un disco a la $ez.
9 Do podemos poner un disco encima de otro menor.
*ara mo$er el primer disco a destino ay que mo$er los "(1 primeros de origen a trabajo, y
mo$emos el que nos queda a destino.


A A A
A A A
A 86868 A
A 866686668 A
866666686666668 8666668666668 A
6666666666666666666 66666666666666666666 66666666666666666
OB>L#D "B?H?SO +#,">DO

+e la situacin anterior se pasa a la siguiente:


A A A
A A A
A 86868 A
A 866686668 A
A 8666668666668 866666686666668
6666666666666666666 66666666666666666666 66666666666666666
OB>L#D "B?H?SO +#,">DO

I aora tenemos el mismo problema solo que ay que mo$er n69 discos usando origen como
au%iliar.
*BO!#+UB# Hanoi -n,Origen,"rabajo,+estino:>D"#L#B.M
H#L>D
if n/9
"H#D Go$er -Origen,+estino.
#L,# H#L>D
Hanoi-n69,Origen,+estino,"rabajo.M
Go$er-Origen,+estino.M
Hanoi-n69,"rabajo,Origen,+estino.
end
endM

Seg-imie"to &ara "E,
: *rimera llamada n/) , o/9 , t/0 , d/), llama H-0,9,),0.
: ,egunda llamada n/0 , o/9 , t/) , d/0, llama H-9,9,0,).
: "ercera llamada n/9 , o/9 , t/0 , d/),
Gue$e disco de origen a destino G-9,).
:: Euel$e a n/0 -segunda llamada.
Gue$e disco G-9,0.
Hace otra llamada H-9,),9,0. y como n/9, Gue$e disco G-),0.
:: Euel$e a D/) -primera llamada.
Gue$e disco G-9,).
Hace otra llamada H-0,0,9,). o/0 , t/9 , d/)
::: Llama H-9,0,),9. o/0 , t/) , d/9 y como n/9 , G-0,9.
::: Euel$e y ejecuta G-0,).
::: Ultima llamada H-9,9,0,). y como n/9 ejecuta G-9,).

F. :*NCION DE :IBONACCDI
8
A 9 si n/9 o n/2
&ibo-n./ A
A &ibo-n69. 8 &ibo-n60. para el resto
8

&UD!">OD &ibo-n:>D"#L#B.:>D"#L#BM
H#L>D
if n4/9
"H#D &ibo:/9
#L,# &ibo:/&ibo-n69.8&ibo-n60.
#D+M
,i acemos su seguimiento para n/T $emos que esta implementacin resulta muy ineficiente al
realizar dos llamadas.


&-T.
86666666666666666666666666666666666668
&-). &-R.
86666666666666668 866666666666666666668
&-0. &-9./9 &-0. &-).
8666666666668 86666666666668 8666666666668
&-2./9 &-9./9 &-2./9 &-9./9 &-0. &-9./9
8666666666668
&-2./9 &-9./9


,i $amos guardando el $alor de &-n60. y pas(ndolo por $ariable se e$ita este r(pido
crecimiento.

&UD!">OD &ibo -n:>D"#L#BME?B fnN0:>D"#L#B.:>D"#L#BM
E?B fnN9:>D"#L#BM
H#L>D
>& n4/9
"H#D H#L>D
&ibo:/9M
fnN0:/9M
#D+
#L,# H#L>D
fnN9:/&ibo-n69,fnN0.M
&ibo:/fnN98fnN0M
fnN0:/fnN9M
#D+
#D+M

Eamos a $er aora un seguimiento de esta nue$a implementacin para n/T.
n/T &ibo-T,$ariable.
fnN9:/ &ibo-R,.... / 5
&ibo:/ 5G, E H
fnN0:/ 5
n/R fnN9:/ &ibo-),.... / ,
&ibo:/ ,G# E 5
fnN0:/ ,
n/) fnN9:/ &ibo-0,... / #
&ibo:/ #G1 E ,
fnN0:/ #
n/0 fnN9:/ &ibo-9,... / 1
&ibo:/ 1G1 E #
fnN0:/ 1
n/9 fnN9:/ &ibo-9. / 9
&ibo:/ 9
jnN0:/ 9

H. :*NCION DE ACIERMANN

8
A D89 si G/2
A
?-G,D./ A ?-G69,9. si D/2
A
A ?-G69,?-G,D69.. para el resto
8

Una posible implementacin es la siguiente:

&UD!">OD ?c< -m,n:>D"#L#B.:>D"#L#BM
H#L>D
>& m/2
"H#D ?c<:/n89
#L,# >& n/2
"H#D ?c<:/?c<-m69,9.
#L,# ?c<:/?c<-m69,?c<-m,n69..
#D+M >E. Tala$.

,i realizamos un seguimiento para ?-9,R. podemos obser$ar que la complejidad crece
e%ponencialmente seg=n crecen los par(metros.

?-9,R. m/9 n/R 66663 ? / ?-2 , ?-9,).. / U
?-9,). m/9 n/) 66663 ? / ?-2 , ?-9,0.. / ?-2,R. / T
?-9,0. m/9 n/0 66663 ? / ?-2 , ?-9,9.. / ?-2,). / R
?-9,9. m/9 n/9 66663 ? / ?-2 , ?-9,2.. / ?-2,0. / )
?-9,2. m/9 n/2 66663 ? / ?-2,9. / 0
?-2,9. / 0

1.# BJ$K-e2a $ec-e"cial co" ce"ti"ela.
,implifica el algoritmo anterior para realizar solo una comparacin.,e usa una tabla de D89
elementos para trabajar con una de D y se guarda el elemento que se quiere buscar en la =ltima
posicin de la tabla.
UD">L "ablaJiK.!la$e/!la$e
?s nos podemos aorrar la segunda comparacin, ya que nunca se superar(n los lmites de la
tabla.
*ara mejorar aun m(s el procedimiento anterior $amos a de$ol$er el indice de la posicin en la
que se encuentra el elemento buscado en lugar del contenido para poder luego cambiarlo o
borrarlo.
*BO!#+UB# Huscar -"abla:"tablaME?B *osicion:>D"#L#BME?B #ncontrado:HOOL#?DM
!la$e:"cla$e.M
E?B i:>D"#L#BM
H#L>D
i:/2M
B#*#?"
i:/i89M
UD">L "ablaJiK.!la$e/!la$eM
>& i/n89
"H#D #ncontrado:/&?L,#
#L,# H#L>D
*osicion:/iM
#ncontrado:/"BU#
#D+
#D+M

1., BJ$K-e2a 2icot'mica.
#l eco de que la tabla est@ ordenada facilita principalmente la operacin de b=squeda de una
cla$e en la misma.#sta mayor eficiencia, se debe a la posibilidad de realizar una b=squeda
dicotmica dentro de la tabla, en lugar de tener que e%aminar todos los elementos de la misma,
asta encontrar el $alor buscado o se agote la tabla.
,in embargo, las operaciones de insercin y borrado se complican m(s, ya que deben colocar
cada elemento en la posicin que le corresponda seg=n el orden que se aya establecido.#n la
tabla desordenada es posible insertar y borrar de cualquier lugar sin restaurar ning=n orden.
#s com=n realizar las inserciones de forma desordenada y luego ordenar el $ector mediante
alg=n m@todo de ordenacin para posteriormente realizar las operaciones que precisen una
b=squeda.

*BO!#+UB# Hinaria -"abla:"tablaME?B *osicion:>D"#L#BM!la$e:"cla$eM
inferior,superior:>D"#L#B.M
E?B !entro:>D"#L#BM
H#L>D
B#*#?"
!entro:/->nferior8,uperior. +>E 0
>& "ablaJ!entroK.!la$e3!la$e
"H#D ,uperior:/!entro69
#L,# >nferior:/!entro89
UD">L -"ablaJ!entroK.!la$e/!la$e. OB ->nferior3,uperior.M
>& "ablaJ!entroK.!la$e/!la$e
"H#D *osicion:/2
#L,# *osicion:/!entro
#D+M
1.3 BJ$K-e2a 2icot'mica rec-r$i?a.
&UD!">OD Hinaria -"abla:"tablaM!la$e:"cla$eM>nf,,up:>D"#L#B.:>D"#L#BM
&UD!">OD HNHinaria -!la$e:"cla$eM>nf,,up:>D"#L#B.:>D"#L#BM
E?B !entro:>D"#L#BM
H#L>D
>& >nf3,up
"H#D HNHinaria:/2 -: >ndica que no e%isten elementos :.
#L,# H#L>D
!entro:/->nf8,up. +>E 0M
>& "ablaJ!entroK.!la$e/!la$e
"H#D HNHinaria:/!entro
#L,# >& "ablaJ!entroK.!la$e3!la$e
"H#D HNHinaria-!la$e,>nf,!entro69.
#L,# HNHinaria-!la$e,!entro89,,up.
#D+
#D+M
H#L>D -: Hinaria :.
binaria:/bNbinaria-cla$e,inf,sup.
#D+M

#. TRANS:ORMACION DE CLABES 0DASD1

*ara buscar un elemento en la tabla se puede acer de $arias formas: secuencial, dicotmica, si
tiene una cla$e num@rica podramos acer coincidir la cla$e con el ndice y la otra forma es
utilizar H?,H.
#n la estructura de tablas es interesante el poder determinar de forma un$oca la posicin de un
elemento dentro de la tabla en funcin de su cla$e.#n esta realizacin se utilizar( una funcin de
transformacin, que asigne a la cla$e correspondiente a un elemento una posicin determinada
dentro del $ector.
? partir de aora $amos a tener un conjunto de elementos del mismo tipo ordenados por un
campo cla$e.La transformacin de cla$es $a a tratar de conseguir la posicin del elemento en
una tabla a partir de su cla$e.
Eamos a definir una funcin H aplicacin del conjunto de cla$es sobre el conjunto de
direcciones de la tabla.+ada una cla$e !
9
, al aplicarla la funcin H nos $a a dar una direccin de
tabla, aunque, realmente lo que $a a generar es un ndice.? esta funcin se la conoce con el
nombre de transformacin de cla$es.

#.1 MANE.O DE COLISIONES

!uando se utiliza el m@todo H?,H, el problema principal es la eleccin de la funcin de
transformacin.+ado que el n=mero de cla$es posibles puede ser mayor que el n=mero de
ndices del $ector que $a a contener la tabla, abr( $arias cla$es que se reflejen en un mismo
ndice del $ector.!uando surge este problema, se dice que ay coli$io"e$.
,i tenemos dos cla$es !
9
y !
0
distintas, y ambas pertenecientes al conjunto de cla$es !, si
aplicamos H-!
9
. y nos da la direccin que H-!
0
. entonces decimos que !
9
y !
0
son sinnimos.
!uando se produce una colisin ay que tratar de una manera especial alg=n elemento, ay que
recurrir a las funciones de manejo de colisiones.#stas dependen del tipo de almacenamiento y
e%isten dos:?lmacenamiento e%terno e interno.

Almace"amie"to eLter"o

Usamos espacios fuera de las de la tabla para colocar las colisiones.+entro del almacenamiento
e%terno ay $arios tipos:#ncadenamiento directo y zona de o$erfloV.

E"ca2e"amie"to 2irecto.

#sta realizacin considera la tabla como un $ector en el que cada posicin contiene un elemento
y un campo adicional con el comienzo de la lista de elementos con los que e%iste colisin.#s
decir, las posibles colisiones se resuel$en construyendo una lista de elementos cuya imagen
as coincida.
?l aplicar la funcin de transformacin, si la posicin no est( ocupada, se incluye el elemento
en la posicin calculada.#n otro caso se incluye el elemento en la lista de elementos que entran
en colisin con el que ocupa la posicin calculada en la tabla.
86666666666668 8666668 8666668
A !T A 686663A !W A A !90 A
8666666666866A 866666A 866666A
A !92 A A A 66686663A 6686663 NIL
8666666666866A 8666668 8666668
A A A
8666666666866A 8666668
A !TR A 686663A !0 A
8666666666866A 866666A
A A A A 66686663 NIL
86666666666668 8666668
9 Eentajas: eficientes y r(pidos.
9 >ncon$enientes: *ara cada elemento de la lista se debe reserE?B un espacio
para punteros lo que significa un desapro$ecamiento de memoria en el
1manejo de lista1.

Mo"a 2e O?er!loN.

,e reser$a espacio en cierta zona de e%terna a la propia tabla, de apro%imadamente el 92X de su
tama'o, para introducir las colisiones.!ada sinnimo se almacena en la primera celda
disponible de la zona de o$erfloV.
OE#B&LOO
9 866666666666668 D89 8666666666666668
A A A !0 A
86666666666666A 866666666666666A
A !9T A A !T A
86666666666666A 866666666666666A
A !9 A A !W A
86666666666666A 866666666666666A
A A A !Y A
86666666666666A 866666666666666A
A !Z A A A
86666666666666A G 8666666666666668
A A
86666666666666A
A A !9 sinnimo de !0 y !T
866666666666668 !Z sinnimo de !W y !Y
...
D 866666666666668 ,ecuencia de entrada:
A A !96!06!9T6!Z6!T6!W6!Y
866666666666668
9 >ncon$eniente: +esapro$ecamiento de memoria -poco..#s poco eficiente
cuando se an producido colisiones, ya que la b=squeda en la zona de o$erfloV
es secuencial.
9 Eentajas: Ocupa menos memoria que el anterior.#l algoritmo de b=squeda y
de insercin es mas sencillo.

Almace"amie"to i"ter"o

!uando el espacio usado para almacenar las colisiones esta dentro de los lmites de la
tabla.+entro del almacenamiento interno est(n:#ncadenamiento directo y encadenamiento
$aco.

E"ca2e"amie"to 2irecto.

,e usa dentro de la tabla un campo de tipo puntero para que apunte al siguiente colisionado, que
estar( dentro de la tabla.#n ese campo se guarda la direccin del siguiente colisionado.
#n el encadenamiento directo con zona de o$erfloV podemos sobredimensionar la tabla para
almacenar las colisiones, en esta zona las casillas estar(n encadenadas con una $ariable que
apunte al primer espacio libre de la zona de o$erfloV.!onsiste en enlazar todos los elementos
cuyas cla$es generan igual indice primario por medio de enlaces dentro de la tabla a las nue$as
posiciones ocupadas por estos elementos.
9 >ncon$enientes: #spacio reser$ado en cada elemento para el enlace.
9 Eentajas: G(s r(pido que el e%terno con zona de o$erfloV ya que e$ita la
b=squeda secuencial.
9 Ocupacin de memoria: +epende del m@todo usado.#l primer caso ocupa
menos memoria, y el segundo es m(s r(pido.

86666666666668 866666666666668
9 A !9 A 68668 A !9 A ) A
8666666666866A A 866666666666668
0 A !0 A 6866868 866666666666668
8666666666866A A A A !0 A U A
) A !W A A468 A 866666666666668
8666666666866A A
R A !) A A A
8666666666866A A
T A A A A
8666666666866A A
U A !T A A46668
86666666666668
8666666666666668
A !9 AT222A
866666666686666A
A A A
866666666686666A
A !92 AT220A
866666666686666A
A !W A A
866666666686666A
......
866666666686666A [OD? +#
T222 A !) AT229A OE#B&LOO
866666666686666A
T229 A !T A 2 A
866666666686666A
T220 A !Z A 2 A
866666666686666A
A A A
8666666666666668

>nsertando un cero en el campo correspondiente a las colisiones en este =ltimo ejemplo,
queremos indicar que ya no ay m(s colisiones a partir de @l.#n este son sinnimos !9,!0 y !)
por una parte, y por otra !Z y !92.



E"ca2e"amie"to Bac8o.

?l utilizar este m@todo, cuando se produce una colisin, se realiza una busqueda en el resto de
la tabla, asta que se encuentre la cla$e o bien asta que se encuentre una posicin no ocupada.
,i deseamos realizar una insercin,cuando encontremos la cla$e, detectamos que ya e%ista el
elemento, y al encontrar un lugar $aco, detectamos la posicin en la que lo podemos insertar.
,i la operacin a realizar es de b=squeda, el eco de encontrar la cla$e determina que el
elemento est( en la tabla.*or el contrario, encontrar un lugar $aco significa que el elemento no
est( en la tabla.
#$identemente, en los dos tipos de operaciones es posible recorrerse toda la tabla sin aber
encontrado ning=n espacio $aco ni aber encontrado la cla$e correspondiente al elemento.*or
tanto, otra terminacin de la operacin se producir( tambi@n cuando se aya e%aminado la tabla
en su totalidad, sin que se ayan cumplido las condiciones anteriores.
La forma m(s usual de realizar la b=squeda, es tratar las posiciones de la tabla de forma
secuencial.#sto es, despu@s de e%aminar una posicin se e%amina la siguiente, considerando la
primera posicin como siguiente a la =ltimo, y as sucesi$amente.
9 Eentajas: #limina enlaces.*oca ocupacin de memoria.
9 >ncon$enientes: ,i queremos buscar !
0
en el ejemplo, encontrara !
9
con
colisin y entonces secuencialmente en el resto de la tabla.#n cuanto ay una
colisin la b=squeda e insercin es secuencial y, por tanto, m(s lento.

866666666666668
A A
86666666666666A
A !9 A
86666666666666A ,eran sinnimos los tres, e
A !0 A insertados en el orden siguiente
86666666666666A !96!06!)
A !) A
86666666666666A
A A
86666666666666A
A A
866666666666668

>nspeccin en la zona de o$erfloV

#%isten dos m@todos principales de inspeccin dentro de una tabla H?,H: La inspeccin lineal
y la cuadr(tica.
I"$&ecci'" li"eal: la generacin de ndice se ace de la siguiente forma:
9 ,e aplica la funcin H?,H a la cla$e que llega y se obtiene as la primera
direccin.
H-!
9
./H
2
9 ,i se produce una colisin se utiliza la siguiente formula para obtener la
siguiente direccin a inspeccionar:
Hj/-H
2
8i.GO+ D
donde i es el n=mero de colisiones que lle$amos asta el momento, y D es el
n=mero primo m(s cercano al tama'o de la tabla por defecto.
9 #l algoritmo $a a parar cuando:
"-i./$aco, la direccin de la tabla est@ $aca.
"-i./cla$e, la cla$e ya est( almacenada.
i/H
2
da toda la $uelta a la tabla luego la tabla esta llena.
#ste m@todo tiene la des$entaja de que los elementos tienen a agruparse alrededor de las cla$es
primarias -!la$es que an sido insertadas sin colisionar..>dealmente, desde luego, debera
escogerse una funcin que, a su $ez, distribuyera uniformemente las cla$es en los sitios
restantes.#n la practica, sin embargo, este tiende a ser demasiado costoso, y son preferibles
m@todos que sean sencillo de c(lculo y superiores a la funcin lineal.

I"$&ecci'" c-a2rOtica: la generacin de ndice se ace de la siguiente forma:
9 ,e aplica la funcin H?,H a la cla$e que llega y se obtiene as la primera
direccin.
H-!
9
./H
2
9 ,i se produce una colisin se utiliza la siguiente formula para obtener la
siguiente direccin a inspeccionar:
Hj/-H
2
8i
0
.GO+ D
donde D ser( un n=mero primo e i tomar( los $alores 9, R, Y, ..., 9U, ...
9 #ste m@todo no inspecciona toda la tabla, por lo tanto, puede a$isar de que la
tabla llena sin que lo est@.,i D es primo al menos mira la mitad de las
posiciones de la tabla.
9 !omo no podemos asegurar que i/H
2
en alg=n momento, se tiene que parar
de otras forma, por ejemplo cuando i/n\0 ya que no $a a mirar todas las
posiciones, $a a mirar la mitad.
?unque pr(cticamente no necesita c(lculo adicional, e$ita bien el agrupamiento primario.Una
ligera des$entaja es que el m@todo no inspecciona todos los lugares de la tabla, es decir, puede
no encontrarse donde insertar un nue$o elemento, a pesar de aber lugares $acos.,i D es un
n=mero primo, la inspeccin cuadr(tica recorre, de todas formas, al menos la mitad de la tabla.
#n la pr(ctica, la des$entaja de este m@todo no tiene importancia, ya que es muy raro que se
presenten D\0 colisiones consecuti$as, y slo sucede cuando la tabla est( casi llena.
#.# :*NCION DE TRANS:ORMACION

Elecci'" 2e la !-"ci'" 2e tra"$!ormaci'".
#s muy deseable que una buena funcin de transformacin distribuya las cla$es en el campo de
los $alores indice de forma tan uniforme como sea posible.?parte de esto, la funcin puede
distribuir las cla$es de cualquier manera y, de eco, es mejor si se comporta de forma
completamente aleatoria ya que se produce un n=mero mnimo de colisiones y, por tanto,
mnimo tiempo de tratamiento de la cla$e en caso de colisin.
"iene que ser r(pida y f(cil de calcular, es decir, debe estar formada por unas pocas operaciones
aritm@ticas simples.#sta funcin debe eliminar la informacin no distinti$a de la cla$e.
,obredimensionar la tabla un 92X no afecta a la eleccin de la funcin de transformacin, pero
lo acemos siempre.


:-"cio"e$ 2e Tra"$!ormaci'".
H(sicamente todos los m@todos siguen dos pasos:
9 ,i la cla$e no es num@rica pasarla a num@rica.
9 ?justar la cla$e al espacio de direcciones de la tabla.

MPto2o 2el ce"tro 2e lo$ c-a2ra2o$.
,e multiplica la cla$e por si misma y se toman los dgitos centrales del cuadrado, ajust(ndolos
al rango.

#jemplo
9W09RZ
0
/ 0RU )RY) )Y2R
6666
8666666666666663 )RY) : 2.W para el ajuste
en una tabla de W222 posiciones.

ELtracci'" 2e it$.
#sta funcin consiste en considerar la representacin binaria de la cla$e y el calculo de la
posicin de la cla$e en funcin de aquellos bits que tengan menor probabilidad de coincidir, con
lo que se minimizaran las colisiones.
#sta funcin es principalmente =til cuando el tama'o de la tabla es potencia de 0.,i tenemos una
tabla con rango 9..0
n
deberamos tomar los n bits con menor probabilidad de colisin.



MPto2o 2e la 2i?i$i'".
#s el m(s empleado.!onsiste en di$idir la cla$e por un n=mero no primo ligeramente inferior al
tama'o de la tabla.#ste m@todo produce para cla$es consecuti$as direcciones consecuti$as.La
des$entaja es que los dgitos finales influyen mas que los dem(s en la transformacin.
La eleccin del n=mero por el que se di$ide es importante.#n general pueden darse razones para
elegir un n=mero primo.
#jemplo
9W09RZ en tabla de W222 posiciones.
9W09RZ GO+ UYYW / R002
Do ay que ajustar porque siempre $a a estar en el rango de posiciones de la tabla.

MPto2o 2el 2e$&laAamie"to.
Los dgitos e%teriores de la cla$e se desplazan acia dentro y se suman.

#jemplo
TR 0R00 0R9 en una tabla de W222 posiciones.
TR 0R00 0R9
0R00
0R9
8 TR
6666
0W9W : 2.W para el ajuste

MPto2o 2e $-&er&o$ici'"
#n este m@todo la cla$e se di$ide en $arias partes, todas ellas de la misma longitud e%cepto
quiz(s la =ltima.#stas partes se combinan para calcular la direccin correspondiente a la cla$e.
Hay dos formas de conseguir la funcin mediante este m@todo:
9 S-&er&o$ici'" &or 2e$&laAamie"to en la que todas las partes en las que se
a partido la cla$e se desplazan acia el bit menos significati$o y se suman
entre si.
9 S-&er&o$ici'" &or &lega2o, y desplaza las partes que ocupan posicin
impar igual que en la forma anterior y las que ocupan posicin par las desplaza
despu@s de aberlas in$ertido.*osteriormente realiza la suma de las diferentes
partes para calcular el $alor de la funcin.

#jemplo
)RT9RW2YZ922
5 *or desplazamiento )RT89RW82YZ8922 / UY2
5 *or plegado )RT8WR982YZ8229 / 99ZT

#., :ACTOR DE CARGA



#ste dato nos $a a dar una idea del porcentaje de tabla que estamos ocupando y, por tanto, del
desperdicio de memoria.

9 ,i tiende a 2, el desperdicio es grande porque ay mucos uecos.
9 ,i tiende a 9, ay apro$ecamiento de la memoria, pocos uecos.

#.3 DASD PER:ECTO Y MINIMO

Da$= &er!ecto.
,eria un m@todo Has que no produzca ninguna colisin -ipot@tico porque aunque est@n muy
bien dise'ado se $an a producir.."odos los m@todos Has que se dise'en tienen que apro%imar a
este Has perfecto.
Da$= m8"imo.
,era un m@todo Has ipot@tico que no producira ning=n desperdicio de memoria."ambi@n
todos los dise'ados se tienen que acercar al Has mnimo en el sentido de que produzcan una
ocupacin de memoria lo mas peque'a posible.
Da$= &er!ecto 7 m8"imo.
!onjuntando estos 0 conceptos anteriores sera un m@todo que, por una parte, no produzca
colisiones -perfecto. y tenga un tiempo de acceso mnimoM y por otro, mnimo
despro$ecamiento -mnimo..
!uando nos acercamos al Has perfecto nos alejamos del mnimo y $ice$ersa.,i la tabla est(
poco ocupada, menor es el riesgo de colisin y si esta mas ocupada ay m(s riesgo.
Dormalmente se obtiene un buen rendimiento cuando sobredimensionamos la tabla entorno a un
92X, es decir, con un factor de carga 2]Y.Un m@todo para calcular el factor de carga es el
siguiente:




siendo # el n=mero medio de accesos que ay que realizar a la tabla para obtener o grabar un
elemento.
+ando algunos $alores a esta funcin tenemos:

alfa 2.9 A 2.0T A 2.T A 2.WT A 2.Y A 2.YT A 2.YY A
666666666666866666686666668666666866666686666668666666A
# 9.2T A 9.9T A 9.)Y A 9.ZT A 0.TU A ).9T A R.UU A

#sta formula es =nicamente $alida para aquellos m@todos H?,H que distribuyan las cla$es
uniformemente.*ara el m@todo de inspeccin lineal se usar( la siguiente:

I tendramos los siguientes $alores:

alfa 2.9 A 2.0T A 2.T A 2.WT A 2.Y A 2.YT A
66666666666686666668666666866666686666668666666A
# 9.2U A 9.9W A 9.T2 A 0.T2 A T.T2 A 92.T A


,e puede llegar a acercarse a un Has perfecto complicando la funcin de transformacin, pero
esta complicacin puede llegar a ser tal que no compense porque redunda en un mayor tiempo
de acceso.
#n concreto e%iste un m@todo, m@todo de !icelli, que es una solucin para obtener una funcin
Has perfecta y mnima.*ero tiene una importantes restriccin:Las cla$es con las que $a a
trabajar la funcin tiene que ser est(tico y conocido -el n=mero de cla$es no puede aumentar ni
disminuir..
E. Li$ta$.

1. CONCEPTO.

Una lista es una estructura de datos omog@nea y din(mica, que $a a estar formada por una
secuencia de elementos, donde cada uno de ellos $a seguido de otro o de ninguno.
9 Homog@nea: "odos los elementos que la forman tienen el mismo tipo base.
9 +in(mica: *uede crecer o decrecer en tiempo de ejecucin seg=n nuestras
necesidades.
dos listas pueden ser diferentes si:
9 Do tienen el mismo n=mero de elementos:
L9: gato, perro.
L0: gato, canario, cerdo.
9 !uando, aun teniendo el mismo n=mero de elementos, estos son distintos:
L9: gato, perro.
L0: gato, cerdo.
9 !uando, aun teniendo el mismo n=mero de elementos y siendo estos los
mismos, no est(n dispuestos en el mismo orden.
L9: gato, perro.
L0: perro, gato.

#. CRITERIOS DE CLASI:ICACION.

Hay $arios criterios para clasificar las listas: seg=n su modo de acceso o seg=n su informacin
de acceso.
#.1 Mo2o DE ACCESO.
?tendiendo a este, se di$iden en densas y enlazadas.#l modo de acceso es independiente de la
implementacin realizada.
Li$ta$ 2e"$a$
,e caracterizan porque los elementos siguen una secuencia fsica.,abemos cuales es el siguiente
elemento porque para acceder a @l emos tenido que pasar por todos los anteriores.
La localizacin de un elemento cualquiera ser(:
9 #l primero si es el primer elemento de la lista.
9 D6esimo si para llegar a el emos pasado por D69 elementos.
,iguen una estructura fsica secuencial luego se pueden implementar utilizando ficeros,
?BB?Is y punteros.
Li$ta$ e"laAa2a$
,on aquellas en las que cada elemento que los compone contiene la informacin necesaria para
acceder al elemento siguiente.La localizacin de un elemento cualquiera ser(:
9 Un elemento de la lista tendr( la direccin ^ si ^ es el primero y ^ es
conocido -direccin de inicio..
9 #star( en la dir S si S est( contenida en el elemento anterior.
,e pueden implementar con punteros enlazados y con ?BB?Is.
#.# IN:ORMACION DE ACCESO.
Li$ta$ or2i"ale$
Los elementos se $an colocando en la lista a medida que llegan y se identifican por el orden de
llegada.#l acceso a un elemento es por su orden o posicin relati$a dentro de la lista.
Li$ta$ cali!ica2a$
Los elementos se clasifican por una cla$e y pueden estar ordenados o no estarlo. ? un elemento
se accede por la informacin contenida en un campo cla$e.
Di!ere"cia$: #n la primera clase importa en orden de llegada, mientras que en la segunda
depende de la cla$e.

,. PILAS.

Una pila es una lista ordinal en la que el modo de acceso a sus elementos es del tipo L>&O.Los
a'adidos y e%tracciones de elementos de una estructura se realizan solo por un e%tremo, luego el
=nico elemento accesible de la pila es el que se encuentre en la cima.#sto e%igir( que la
manipulacin sobre un elemento, necesite que el mismo ocupe la posicin de cima.
,obre una estructura de tipo pila, surgen de forma natural las operaciones que permiten a'adir
elementos y quitar elementos.

,.1 E$&eci!icacio"e$ 2el TAD &ila

Operaciones: !rear, >ntroducir un elemento, #%traer o sacar -!ima y Horrardo., Eaca.Eamos a
definir estas operaciones con el siguiente formato:
Dombre, par(metros de entrada, salida, efecto y e%cepciones.


9 Crear: *ila, *ila, !rea una pila, Dinguna.
9 I"tro2-cir: *ila y elemento, *ila, >ncrementar en un elemento la pila, Llena
si est( limitada -?BB?I. y ninguna si no ay lmites.
9 Cima: *ila, #l primer elemento, Dinguno, *ila $aca.
9 Borra2o: *ila, *ila, +ecrementa en uno el n=mero de elementos de la pila,
*ila $aca.
9 ELtraer: *ila, #lemento y pila, +ecrementa en uno el n=mero de elementos
de pila, *ila $aca.
9 Bac8a: *ila, "BU# o &?L,#, Dinguno, Dinguno.
#n el caso de implementacin con ?BB?Is se necesitar(:
9 Lle"a: *ila, HOOL#?D, Dinguno, Dinguno.
#n esta definicin tenemos dos constructores de la estructura, que son las operaciones Crear y
I"tro2-cir.!on ellas conseguimos una pila que no tenga ning=n elemento y con inserciones
sucesi$as, podemos conseguir cualquier pila.
#l resto de las operaciones nos permitir(n e%traer elementos de la pila, consultar el elemento de
cima y decidir si la pila tiene, o no, elementos.

,.# Im&leme"taci'" -tiliAa"2o tala$

#sta realizacin consiste en ir guardando consecuti$amente los elementos de la pila en un $ector
de tama'o fijo.Un ndice marcar( la posicin del =ltimo elemento que se a a'adido a la
pila.*or tanto, las inserciones en la estructura se realizar(n en la posicin inmediatamente
siguiente a la posicin marcada como cima, pasando a ser esta nue$a posicin ocupada la nue$a
cima de la pila.
#l eco de utilizar un $ector para almacenar los elementos, puede conducir a la situacin en
que la pila est@ llena, es decir, que no quepa ning=n elemento m(s.#sto se producir( cuando el
ndice que se'ala la cima de la pila sea igual al tama'o del $ector.

"I*#
"pila/B#!OB+
#lemento:?BB?I J9..nK O& #lemM -: Lista de elementos :.
*untero:>D"#L#BM -: ?punta a la cima de la pila :.
#D+M

*BO!#+UB# !rear -E?B *ila:"pila.M
H#L>D
*ila.*untero:/2M -: *ila $aca :.
#D+M


*BO!#+UB# >ntroducir -E?B *ila:"pilaM#l:#le.M
H#L>D
>& Llena -*ila.
"H#D 1 *>L? LL#D? 1
#L,# H#L>D
*ila.*untero:/*ila.*untero89M
*ila.#lementoJ*ila.*unteroK:/#l
#D+
#D+M

&UD!">OD !ima-*ila:"pila.:#leM
H#L>D
>& Eacia -pila.
"H#D 1 #BBOB 1
#L,# !ima:/*ila.#lementoJ*ila.*unteroK
#D+M

*BO!#+UB# Horrar -E?B *ila:"pila.M
H#L>D
>& Eacia -*ila.
"H#D 1 #BBOB 1
#L,# *ila.*untero:/*ila.*untero69
#D+M

&UD!">OD Eacia -*ila:"pila.:HOOL#?DM
H#L>D
Eacia:/*ila.*untero/2M
#D+M

*BO!#+UB# #%traer -E?B *ila:"pila,E?B #le:"ele.M
H#L>D
>& Eacia-*ila.
"H#D 1 #BBOB 1
#L,# H#L>D
#le:/*ila.#lementoJ*ila.*unteroKM
*ila.*untero:/*ila.*untero69
#D+
#D+M

&UD!">OD Llena -*ila:"pila.:HOOL#?DM
H#L>D
Llena:/*ila.*untero/n -: #l ?BB?I se a declarado de 9 a n :.
#D+M
,., Im&leme"taci'" co" &-"tero$

#n esta realizacin se construir( la pila como una lista encadenada mediante puenteros.*or ello
cada elemento de la pila tendr(, ademas del campo de informacin correspondiente, un campo
de enlace con el siguiente elemento de la lista.
"I*#
"pila/;#lementoM
#lemento/B#!OB+
+ato:"infoM
,ig:"pilaM
#D+M

*BO!#+UB# !rear -E?B *ila:"pila.M
H#L>D
*ila:/D>LM
#D+M

*BO!#+UB# >ntroducir -E?B *ila:"pila,#lem:"info.M
E?B ?u%:"pilaM
H#L>D
D#O-?u%.M
?u%;.+ato:/#lemM
?u%;.,ig:/*ilaM
*ila:/?u%
#D+M
8666668 8666668
*ila 666666666666663A A A A
A 866666A 866666A
A 8663A 6686663A 6686663 D>L
A A 8666668 8666668
Due$o A A
enlace A A
A 8666668 A
A A A A
A 866666A A
8666663A 66868
8666668

&UD!">OD !ima -*ila:"pila.:"infoM
H#L>D
>& Eacia-*ila.
"H#D 1 #BBOB 1
#L,# !ima:/*ila;.+ato
#D+M

*BO!#+UB# Horrar -E?B *ila:"pila.M
E?B ?u%:"pilaM
H#L>D
>& DO" Eacia-*ila.
"H#D H#L>D
?u%:/*ilaM
*ila:/*ila;.,igM
+>,*O,#-?u%.
#D+
#D+M
&UD!">OD Eacia -*ila:"pila.:HOOL#?DM
H#L>D
Eacia:/*ila/D>L
#D+M

*BO!#+UB# ,acar -E?B *ila:"pila,E?B #le:"info.M
E?B ?u%:"pilaM
H#L>D
>& DO" Eacia-*ila.
"H#D H#L>D
#le:/*ila;.+atoM
?u%:/*ilaM
*ila:/*ila;.,igM
+>,*O,# -?u%.
#D+
#D+M

3. COLAS.

3.1 E$&eci!icacio"e$ 2el TAD cola

*odemos definir la estructura cola, como una secuencia de elementos, en la que la adicin de
nue$os elementos a la estructura se realiza por un e%tremo, que llemeremos !i"al, y las
e%tracciones de elementos se realiza por el otro, que llamaremos &ri"ci&io.
La misma definicin de la estructura de cola, implica que el primer elemento que se inserte en la
estructura, ser( el primero que pueda e%traerse de la misma -&>&O..?si pues, la manipulacin de
un elemento de la cola, e%ige que dico elemento ocupe la posicin de principio.
Eamos a $er esta estructura implementada con ?BB?I, y con listas enlazadas, definiendo las
operaciones con el siguiente formato:
Dombre, par(metros de entrada, salida, efecto y e%cepciones.
9 Crear: !ola, !ola, !rea una cola, Dinguna.
9 I"tro2-cir: !ola y elemento, !ola, ?'ade un elemento a la !ola, Llena si
est( limitada -?BB?I. y ninguna si no ay lmites.
9 Primero: !ola, #lemento, Dinguno, !ola $aca.
9 Borra2o: !ola, !ola, Fuita elemento de de la cola, !ola $aca.

9 Sacar: !ola, #lemento y cola, +ecrementa en uno el n=mero de elementos
de !ola, !ola $aca.
9 Bac8a: !ola, HOOL#?D, Dinguno, Dinguno.
#n el caso de implementacin con ?BB?Is se necesitar(:
9 Lle"a: !ola, HOOL#?D, Dinguno, Dinguno.
3.# Im&leme"taci'" -tiliAa"2o tala$

#sta realizacin consiste en representar la cola como una estructura de tipo registro con cuatro
campos.Un campo &ri"ci&io, con el ndice del primer elemento de la colaM un campo !i"al, con
el indice del =ltimo elemento de la colaM un campo "-mero 2e eleme"to$, con la cantidad de
elementos introducidosM y un campo eleme"to$, que es una tabla con los elementos que est(n en
la cola.

9 * & n
866666666666666666666666666666666666668
86666663A A 9 A 0 A ) A R A T A 86668
A 866666666666666666666666666666666666668 A
A A
866666666666666666666666666666666666666666666666668

#n este ejemplo, el primer elemento que puede salir de la cola es el apuntado por &ri"ci&io, es
decir, el 9.?l insertar cualquier elemento, se colocara detr(s del apuntado por !i"al.
,i almacenamos la cola en un $ector circular se e$ita que, cuando el indice !i"al llege al final de
la tabla, sea imposible la insercin aunque queden libres las primeras posiciones de la tabla.

"I*#
"cola/B#!OB+
#le:?BB?I J9..nK O& "infoM
*rinc,&inal,Dum#lem:>D"#L#B
#D+M

&UD!">OD ,iguiente -*os:>D"#L#B.:>D"#L#BM
H#L>D
,iguiente:/-*os GO+ "amanio.89
#D+M

&UD!">OD Eacia -!ola:"cola.:HOOL#?DM
H#L>D
Eacia:/!ola.Dum#le/2M
#D+M

&UD!">OD Llena -!ola:"cola.:HOOL#?DM
H#L>D
Llena:/!ola.Dum#le/nM
#D+M

*rimero desplaza y luego introduce, por ello coloca en puntero & al final de la tabla y el puntero
* al principio al crear, y n=mero de elementos a cero.

*BO!#+UB# !rear -E?B !ola:"cola.M
H#L>D
O>"H !ola do
H#L>D
&inal:/nM
*rincipio:/9M
Dum#le:/2
#D+
#D+M

*BO!#+UB# >ntroducir -E?B !ola:"cola,#le9:"info.M
H#L>D
>& DO" Llena-!ola.
"H#D O>"H !ola do
H#L>D
&inal:/,iguiente-&inal.M
#leJ&inalK:/#le9M
Dum#le:/Dum#le89
#D+
#D+M

*BO!#+UB# ,acar -E?B !ola:"colaME?B #lem9:"info.M
H#L>D
>& DO" Eacia-!ola.
"H#D O>"H !ola do
H#L>D
#le9:/#leJ*rincipioKM
*rinc:/,iguienteJ*rincipioKM
Dum#le:/Dum#le69
#D+
#D+M
,i no usamos la $ariable Dum#le:
Eacia:/,iguienteJ&inalK/*rincipioM
Llena:/,iguienteJ,iguienteJ&inalKK/*rincipioM
3., Im&leme"taci'" 2e cola$ co" &-"tero$
Hay $arias formas de implementar una cola con punteros:
9 Utilizando dos punteros, uno principio y otro final.
9 Utilizando un solo puntero que apunte a la lista.
+e cualquier forma siempre se inserta al final de la cola y se saca del principio.
*rimero &inal
A A
A 8666668 8666668 8666668 A 8666668
86663A A A A A A 863A A
866666A 866666A 866666A 866666A
A 66866663A 66866663A 66866663A 6686663 D>L 8666668 8666668 8666668 8666668

*$a"2o 2o$ &-"tero$
"I*# *untero/;#lementoM
#lemento/B#!OB+
+ato:"infoM
,ig:*untero
#D+M
"cola/B#!OB+
*rinc,&in:*untero
#D+M

*BO!#+UB# !rear -E?B !ola:"cola.M -: *ondremos ambos punteros a D>L :.
H#L>D
!ola;.*rinc:/D>LM
!ola;.&in:/D>L
#D+M

*BO!#+UB# >ntroducir -E?B !ola:"colaM#le:"info.M
E?B ?u%:*unteroM
H#L>D
D#O-?u%.M
?u%;.+ato:/#leM
?u%;.,ig:/D>LM
>& Eacia-!ola.
"H#D !ola;.*rinc:/?u%
#L,# !ola.&in;.,ig:/?u%M
!ola;.&in:/?u%
#D+M

*BO!#+UB# ,acar -E?B !ola:"cola, E?B #le:"info.M
E?B ?u%:*unteroM
H#L>D
>& DO" Eacia-!ola.
"H#D O>"H !ola do
H#L>D
#le:/*rinc;.+atoM
?u%:/*rincM
*rinc:/?u%;.,igM
>& *rinc/D>L "H#D &in:/D>LM
+>,*O,# -?u%.
#D+
#D+M
G(s de un elemento ,olo un elemento
666666666666666666 6666666666666666
9 #le:/!ola.*rinc;.+ato 5 #le:/!ola.*rinc;.+ato
9 ?u%:/!ola.*rinc 5 ?u%:/!ola.*rinc
9 !ola.*rinc:/?u%;.,ig 5 !ola.*rinc:/?u%;.,ig
9 +>,*O,#-?u%. 5 !ola.&in:/D>L
+>,*O,#-?u%.

&UD!">OD Eacia -!ola:"cola.:HOOL#?DM
H#L>D
Eacia:/!ola.*rinc/D>L
#D+M

*$a"2o -" $olo &-"tero

"I*# "cola/;#lementoM
#lemento/B#!OB+
>nfo:"infoM
,ig:"cola
#D+M

*BO!#+UB# >ntroducir -E?B !ola:"cola, #le:"info.M
E?B ?u%,Due$o:"colaM
H#L>D
?u%:/!olaM
D#O-Due$o.M
Due$o;.>nfo:/#leM
Due$o;.,ig:/D>LM
>& Eacia-!ola.
"H#D !ola:/Due$o
#L,# H#L>D
>D"#L#B ?u%;.,ig43D>L do
?u%:/?u%;.,igM
?u%;.,ig:/Due$o
#D+
#D+M
!ola $aca !ola con $arios elementos
666666666666 666666666666666666666666666
5 D#O-Due$o. 5 >D"#L#B ?u%;.,ig43D>L do
?u%:/?u%;.,ig
5 Due$o;.>nfo:/#le 5 D#O-Due$o.
5 Due$o;.,ig:/D>L 5 Due$o;.>nfo:/#le
5 !ola:/Due$o 5 Due$o;.,ig:/D>L
5 ?u%;.,ig:/?u%
*BO!#+UB# ,acar -E?B !ola:"colaM E?B #le:"info.M
E?B ?u%:"colaM
H#L>D
>& DO" Eacia-!ola.
"H#D H#L>D
?u%:/!olaM
#le:/!ola;.>nfoM
!ola:/!ola;.,igM
+>,*O,#-?u%.
#D+
#D+M

3.3 Im&leme"tacio" me2ia"te li$ta circ-lar

Otra realizacin es considerar la lista de almacenamiento de la cola como una lista circular, es
decir, una lista en la que la =ltima componente de la misma tiene como siguiente la primera.
*ara utilizar una lista de este tipo, tendremos que guardar la posicin de comienzo de la
misma.*or esta razn, si realizamos una cola seg=n esta idea, podemos considerarla como un
puntero a la lista de almacenamiento.+ico puntero tendr( siempre la direccin del =ltimo
elemento insertado, ya que las inserciones se reallizar(n siempre detr(s del =ltimo elemento de
la cola.I el siguiente a este =ltimo elemento, ser( siempre el primero.

868
!ola A68666666668
868 A
A
A
8666668 8666668 A 8666668
A e) A A e0 A 8663A e9 A
866666A 866666A 866666A
86666663A 66866663A 66866663A 6686668 A 8666668 8666668 8666668 A
A A
8666666666666666666666666666666666666666668

#n este caso el primer elemento de la cola es el e), obser$ese que en esta realizacin ocupa la
componente siguiente a la apuntada por Cola. *recisamente la componente apuntada por Cola
es la correspondiente a e9, que es el =ltimo elemento de la cola.
5.LISTA CALI:ICADA NO ORDENADA

La insercin en una lista calificada no ordenada se puede realizar antes o despu@s.,i insertamos
despu@s reconocemos la lista preguntando por la cla$e. ,i insertamos antes ay que utilizar dos
punteros porque si preguntamos por la cla$e perdemos el puntero que apunta a esa cla$e.
5.1 Borra2o

*ara borrar ay que recorrer la lista con dos punteros porque sino, al encontrar al elemento a
borrar, perdemos la informacin del anterior, que es el que ay que redirigir.
?nterior ?ctual
A A
A A
A 8666668 A 8666668 8666668 8666668
86666663A A 8663A A A A A A
866666A 866666A 866666A 866666A
Lista 66663A 66866663A 66866663A 66866663A 6686663 D>L 8666668 8666668 8666668 8666668
A A
8666666666666666666666668
Bedireccin

5.# I"$erta 2e$&-P$

,i no se encuentra la cla$e el el procedimiento de b=squeda no insertamos el nue$o elemento.

*BO!#+UB# >nsertaN+espues -E?B Lista:"listaM!la$eHus,!la$e#le:"cla$eM
>nfo#le:"info.M
E?B ?u%,Due$o:"punteroM
#ncontrado:HOOL#?DM
H#L>D
#ncon:/&?L,#M
?u%:/ListaM
>D"#L#B -?u%43D>L. and -DO" #ncontrado. do
>& ?u%;.!la$e/!la$eHus
"H#D #ncontrado:/"BU#
#L,# ?u%:/?u%;.,igM
>& #ncontrado
"H#D H#L>D
D#O -nue$o.M
Due$o;.!la$e:/!la$e#leM
Due$o;.>nfo:/>nfo#leM
Due$o;.,ig:/?u%;.,igM
?u%;.,ig:/Due$o
#D+
#D+M
5., I"$erta a"te$

*BO!#+UB# >nsertaN?ntes -E?B Lista:"listaM!la$eHus,!la$e#le:"cla$eM
>nfo#le:"info.M
E?B
?nterior,?ctual,Due$o:"listaM
#ncontrado:HOOL#?DM
H#L>D
#ncontrado:/&?L,#M
?nterior:/ListaM
?ctual:/ListaM
>D"#L#B ?ctual43D>L and DO" #ncontrado do
H#L>D
>& ?ctual;.!la$e/!la$eHus
"H#D #ncontrado:/"BU#
#L,# H#L>D
?nterior:/?ctualM
?ctual:/?ctual;.,ig
#D+
#D+M
>& #ncontrado
"H#D H#L>D
D#O-Due$o.M
Due$o;.>nfo:/>nfo#leM
Due$o;.!la$e:/!la$e#leM
>& Lista/?ctual
"H#D H#L>D
Due$o;.,ig:/ListaM
Lista:/Due$o
#D+
#L,# H#L>D
Due$o;.,ig:/?ctualM
?nterior;.,ig:/Due$oM
#D+
#D+
#D+M
Las instrucciones N-e?oQ.SigRELi$taS y N-e?oQ.SigREAct-alS se pueden poner fuera de la
sentencia >&6#L,# porque en el caso de insertar al principio se $a a dar que Act-al / Sig-ie"te
/ Li$ta.

5.3 Recorri2o$ co" -" $olo &-"tero

,iempre pueden usar mas punteros para acer D#O o +>,*O,#, pero solo uno para recorrer la
lista. La =nica forma de acerlo es recursi$amente, y recorrer la lista con el propio puntero que
la a creado, con el puntero interno.
*BO!#+UB# Huscar -Lista:"listaM!la$eHus:"cla$eME?B >nfo:"info.M
H#L>D
>& Lista43D>L -: *arar si llega a D>L :.
"H#D >& Lista;.!la$e3/!la$eHus -: *or si se a pasado a un elemento de mayor cla$e :.
"H#D >& Lista;.!la$e/!la$eHus
"H#D >nfo:/Lista;.>nfo
#L,# Husca -Lista;.,ig,!la$eHus,>nfo.
#D+M
Eamos a terminar cuando lleguemos a D>L ya que insertamos al final.#ncontramos el ueco si
la cla$e del siguiente elemento es mayor que la cla$e que tenemos que insertar.

*BO!#+UB# >nsertar -E?B Lista:"listaM!la$e#le:"cla$eM>nfo#le:"info.M
E?B
#ncontrado:HOOL#?DM
Due$o:"listaM
H#L>D
#ncontrado:/&?L,#M
>& Lista/D>L
"H#D #ncontrado:/"BU#
#L,# >& Lista;.!la$e3!la$e#le
"H#D #ncontrado:/"BU#
#L,# >& Lista;.!la$e/!la$e#le
"H#D -: Ia est( insertado :.
#L,# >nsertar -Lista;.sig,!la$e#le,>nfo#le.M
>& #ncontrado
"H#D H#L>D
D#O-Due$o.M
Due$o;.!la$e:/!la$e#leM
Due$o;.>nfo:/>nfo#leM
Due$o;.,ig:/ListaM
Lista:/Due$o
#D+
#D+M
Due$o;.,ig apuntar( al $alor de Lista porque ese $alor es el puntero al siguiente elemento
despu@s de donde tenemos que insertar el nue$o.
*BO!#+UB# Horrar -E?B Lista:"listaM!la$eHus:"cla$e.M
E?B ?u%:"listaM
H#L>D
>& Lista/D>L "H#D 1Do esta1
#L,# >& Lista;.!la$e4!la$eHus
"H#D Horrar-Lista;.,ig,!la$eHus.
#L,# >& Lista;.!la$e/!la$eHus
"H#D H#L>D
?u%:/ListaM
Lista:/Lista;.,igM
+>,*O,#-?u%.M
#D+
#D+M
Do ace falta acer D#O-?u%. para acer ?u%:/D>L.
5.5 Li$ta$ co" caecera !icticia 7 ce"ti"ela

#l siguiente esquema representa una lista con cabecera fictcia y centinela $aca.#n este tipo de
listas se realiza m(s f(cilmente la insercin antes y, en el caso del centinela, tambi@n es =til para
las b=squedas.
8666666668 86666666668
Lista 66663A!abecera8666663A!entinela86663 D>L
8666666668 866386666666668
A
A
!entinela
Recorri2o$ "ormale$ co" -" $olo &-"tero
>D"#L#B ?u%43D>L and DO" #ncontrado
>& ?u%;.!la$e/!la$e
"H#D #ncontrado:/"BU#
#L,# ?u%:/?u%;.,igM
Recorri2o$ co" ce"ti"ela
Lo que acemos primero es meter la cla$e que buscamos en el centinela para que el puntero
nunca pueda llegar a D>L y seguimos el siguiente m@todo:
>D"#L#B ?ct;.!la$e43!la$e do
H#L>D
...
...
#D+M
BJ$K-e2a@ i"$erci'" 7 orra2o
*BO!#+UB# Huscar -!entinela,Lista:"listaM!la$eHus:"cla$eME?B >nfo:"info.M
E?B ?u%:"listaM
H#L>D
!entinela;.!la$e:/!la$eHusM
?u%:/Lista;.,igM -: *ara saltar la cabecera ficticia :.
>D"#L#B ?u%;.!la$e4!la$eHus do
?u%:/?u%;.,igM
>& ?u%43!entinela and ?u%;.!la$e/!la$eHus
"H#D >nfo:/?u%;.>nfoM
-: #n cualquier otro caso no emos encontrado la cla$e :.
#D+M

*BO!#+UB# !rear -E?B Lista,!entinela:"lista.M -: Las 0 por E?B :.
H#L>D
D#O-Lista.M
D#O-!entinela.M
Lista;.,ig:/!entinelaM
!entinela;.,ig:/D>L
#D+M
*BO!#+UB# >nsertar -E?B Lista:"listaM!entinela:"listaM!la$e#le:"cla$eM
>nfo:"info.M
E?B Due$o,?ctual,?nterior:"listaM
H#L>D
!entinela;.!la$e:/!la$#leM
-: ?unque la lista este $aca tendra dos elementos por lo tanto podramos acer la asignacin
anterior :.
?nt:/ListaM
?ctual:/Lista;.,igM
>D"#L#B ?ctual;.!la$e4!la$e#le do
H#L>D
?nterior:/?ctualM
?ctual:/?ctual;.,ig
#D+M
>& ?ctual;.!la$e/!la$e#le and ?ctual43!entinela
"H#D 1#lemento ya esta1
#L,# H#L>D
-: ,i es la misma cla$e pero apuntamos al centinela, tendremos que insertar porque el nue$o
elemento no estar( en la lista :.
Due$o;.>nfo:/>nfoM
Due$o;.!la$e:/!la$e#leM
Due$o;.,ig:/?ctualM
?nterior;.,ig:/Due$o
#D+
#D+M

*BO!#+UB# Horrado -E?B Lista:"listaM!entinela:"listaM!la$e#le:"cla$e.M
E?B ?ctual,?u%iliar:"listaM
H#L>D
!entinela;.!la$e:/!la$e#leM
?ctual:/ListaM
>D"#L#B ?ctual;.,ig;.!la$e4!la$e#le do
?ctual:/?ctual;.,igM
>& ?ctual;.,ig;.!la$e/!la$e#le and ?ctual;.,ig43!entinela
-: ,e da la primera condicin si la cla$e que buscamos que esta en la lista o llegamos al
centinela."enemos que insertar si cuando nos paramos no apuntamos al centinela :.
"H#D H#L>D
?u%:/?ctual;.,igM
?ctual;.,ig:/?u%;.,igM
+>,*O,#-?u%.
#D+
#D+M




C OTROS TIPOS DE LISTAS

C.1 Li$ta$ reorga"iAale$

,on aquellas listas en las que el =ltimo elemento consultado se sit=a al principio.

C.# Li$ta$ circ-lare$

#n ellas el =ltimo elemento apunta al primero.

C., Li$ta$ 2oleme"te e"laAa2a$

!ada elemento tiene dos punteros, uno de los cuales apunta al elemento siguiente y otro al
anterior.
8666668 8666668 8666668 8666668
A A A A A A A A
Lista 66663A A A A A A A A
866666A 866666A 866666A 866666A
A 66866663A 66866663A 66866663A 6686663 D>L 866666A 866666A 866666A 866666A
D>L 466668666 A466668666 A466668666 A466668666 A
8666668 8666668 8666668 8666668

C.3 Li$ta$ circ-lare$ 2oleme"te e"laAa2a$

8666668 8666668 8666668 8666668
A A A A A A A A
Lista 66663A A A A A A A A
866666A 866666A 866666A 866666A
866666663A 66866663A 66866663A 66866663A 668666666668
A 866666A 866666A 866666A 866666A A
A 8666668666 A466668666 A466668666 A466668666 A466668 A
A A 8666668 8666668 8666668 8666668 A A
A A A A
A 8666666666666666666666666666666666666666666666666666668 A
8666666666666666666666666666666666666666666666666666666666668
E>. Arole$.
1. DE:INICIONES.

Earias definiciones:
5 Un arbol es una lista en la que cada uno de sus elementos apunta a uno,
ninguno o $arios elementos del mismo tipo.
5 Un arbol es una estructura din(mica y omog@nea, por tanto est( copuesto de
elementos del mismto tipo base ", de forma que la estructura puede estar $aca
o compuesta por un elemento del tipo base " del que cuelgan un n=mero finito
de estructuras arbol similar, a las que llamaremos subarboles, y entre si son
disjuntos.
+os arboles son iguales cuando tengan igual n=mero de nodos, igual contenido en ellos y,
adem(s, est@n dispuestos de igual manera.

#. REPRESENTACION.

#.1 MatriA 2e a27ace"cia.
#s un array J9..n,9..nK O& HOOL#?D donde n es el n=mero de nodos que tiene el (rbol y cada
posicin de la matriz indicar( si e%iste un enlace entre dos nodos.#sto es normal acerlo en
lenguajes en que no pueden crearse componentes din(micamente, y referenciarles por medio de
punteros.
#jemplo:



















#.# Li$ta 2e a27ace"cia.
#s una tabla de 9 a n, siendo n el n=mero de nodos, donde cada elemento de la tabla representa
cada uno de los nodos del arbol y de cada uno de los elementos sale un puntero a una lista que
est( formada por todos los nodos que est(n enlazados con @l.
#jemplo:

86668 86668
8663A 0 86663A ) 86663 D>L
86668 A 86668 86668
9 A 68668 86668 86668
8666A 863A R 86663A T 86663 D>L
0 A 686668 86668 86668
8666A 86668 86668
) A 68666663A U 86663A W 86663 D>L
8666A 86668 86668
R A 68668
8666A A
T A 6866A
8666A A
U A 6866A
8666A A
W A 68666663 D>L
86668

#., E$tr-ct-ra 2i"Omica &-ra.
#n ella, todos los componentes o nodos, se representan por punteros e%plicitos.Eamos a tener
un tipo como:

"arbol/;#lementoM
#lemento/B#!OB+
>nfo:"infoM
!la$e:"cla$eM
#nlace9,#nlace0, ..., #nlacen:"arbol
#D+M


,. CONCEPTOS ASOCIADOS.


9 No2o: ,e denomina nodo a cada uno de los elementos de un (rbol.
9 Rama: Una rama es cada uno de los enlaces que e%iste entre los nodos de un
(rbol.
9 A"tece$or o &a2re: #s un nodo del que cuelga alg=n otro, llamado
descendiente o ijo.
9 De$ce"2ie"te 2irecto o a"tece$or 2irecto: Un nodo es descendiente directo
de otro, llamado antecesor directo si se puede acceder a el recorriendo
=nicamente una rama.
9 RaiA: La raiz de un (rbol es aquel nodo que no tiene antecesores, es decir,
todos son descendientes directos o indirectos de el.
9 Ni?el@ &ro!-"2i2a2@ alt-ra@ lo"git-2 o lo"git-2 2e cami"o 2e -" "o2o: #s
el n=mero de ramas que ay que recorrer para llegar a @l desde la raiz,
tendiendo en cuenta que la raiz tiene ni$el uno.
9 S-arol: ,e llama subarbol de raiz m al conjunto de nodos que dependen
directa o indirectamente de @l, asi como al propio m.
9 Gra2o 2e -" "o2o: #s el n=mero de descendientes directos que tiene.#l
grado de un arbol es igual al del nodo con mayor grado.
9 No2o termi"al - =o6a: #s aquel que tiene grado cero, es decir, que no tiene
ning=n descendiente.
9 No2o i"ter"o: #s aquel que no es oja.
9 Lo"git-2 2e cami"o i"ter"o 2e -" arol: #s la suma de las longitudes de
camino de todos sus nodos.




L!> / 980808)8)8) / 9R






9 Lo"git-2 2e cami"o eLter"a: #s la suma de las longitudes de camino de
todos los nodos especiales.
9 No2o e$&ecial: #s aquel que se ace colgar de aquellos nodos que no tienen
completo el cupo de descendientes.
#n el ejemplo anterior, los nodos 9,0,) y R no tienen completo el n=mero de
descendientes.? la operacin de colocar nodos especiales en un arbol se le
llama e$&a"2ir el arol.



L!# / )8R8R8R8R8R8R / 0W




9 Lo"git-2 2e cami"o i"ter"a me2ia: #s la longitud de camino interna
partido del n=mero de nodos.
3. ARBOLES BINARIOS.

Los (rboles de grado 0 tienen una especial importancia.,e les conoce con el nombre de (rboles
binarios.,e define un (rbol binario como un conjunto finito de elementos -nodos. que bien est(
$acio o est( formado por una raiz con dos (rboles binarios disjuntos, llamados sub(rbol
izquierdo y dereco de la raiz.
#n los apartados que siguen se considerar(n =nicamente (rboles binarios y, por lo tanto, se
utilizar( la palabra (rbol para referirse a (rbol binario.Los (rboles de grado suparior a 0 reciben
el nombre de (rboles multicamino.

3.1 Arol i"ario 2e J$K-e2a.

Los (rboles binarios se utilizan frecuentemente para representar conjuntos de datos cuyos
elementos se identifican por una cla$e =nica.,i el (rbol est( organizado de tal manera que la
cla$e de cada nodo es mayor que todas las cla$es su su subarbol izquierdo, y menor que todas
las cla$es del subarbol dereco se dice que este (rbol es un (rbol binario de b=squeda.
#jemplo:















3.# O&eracio"e$ O$ica$

Una tarea muy com=n a realizar con un (rbol es ejecutar una determinada operacin con cada
uno de los elementos del (rbol.#sta operacin se considera entonces como un par(metro de una
tar@ m(s general que es la $isita de todos los nodos o, como se denomina usualmente, del
recorrido del (rbol.
,i se considera la tarea como un proceso secuencial, entonces los nodos indi$iduales se $isitan
en un orden especfico, y pueden considerarse como organizados seg=n una estructura lineal.+e
eco, se simplifica considerablemente la descripcin de mucos algoritmos si puede ablarse
del proceso del siguiente elemento en el (rbol, seg=n un cierto orden subyacente.
Hay dos formas b(sicas de recorrer un (rbol: #l recorrido en amplitud y el recorrido en
profundidad.


T Recorri2o e" am&lit-2
#s aquel recorrido que recorre el (rbol por ni$eles, en el =ltimo ejemplo sera:
90 6 Z,9W 6 T,Y,9T
T Recorri2o e" &ro!-"2i2a2
Becorre el (rbol por sub(rboles.Hay tres formas: *reorden, orden central y postorden.
T Preor2e": Baiz, subarbol izquierdo y subarbol dereco.
T Or2e" ce"tral: ,ubarbol izquierdo, raiz, subarbol dereco.
T Po$tor2e": ,ubarbol izquierdo, subarbol dereco, raiz.
#jemplo:


















*reorden: 02 6 90 6 T 6 0 6 W 6 9) 6 9T 6 R2 6 )2 6 )T 6 RW
Orden central: 0 6 T 6 W 6 90 6 9) 6 9T 6 02 6 )2 6 )T 6 R2 6 RW
*ostorden: 0 6 W 6 T 6 9T 6 9) 6 90 6 )T 6 )2 6 RW 6 R2 6 02

#jemplo:













*reorden: \ 8 a b : c d Dotacin polaca
Orden central: a 8 b \ c : d Dotacin infija
*ostorden: a b 8 c d : \ Dotacin polaca in$ersa
Im&leme"taci'" 2e lo$ recorri2o$.

? continuacin se formulan los tres m@todos de recorrido por medio de tres programas
concretos.Dtese que el puntero Arbol es un par(metro constante -se pasa por $alor..#sto
e%presa el eco de que lo que interesa es la referencia al sub(rbol considerado y no la $ariable
cuyo $alor es el puntero, que podra ser alterada en caso de pasarlo como par(metro $ariable.


"I*#
"arbol/;#lementoM
#lemento/B#!OB+
>nfo:"infoM
!la$e:"cla$eM
izq,der:"arbol
#D+M


*BO!#+UB# *reOrden -Baiz:"arbol.M
H#L>D
>& Baiz43D>L
"H#D H#L>D
*rocesaDodoM
*reOrden-Baiz;.izq.M
*reOrden-Baiz;.der.
#D+
#D+M


*BO!#+UB# Orden!entral -Baiz:"arbol.M
H#L>D
>& Baiz43D>L
"H#D H#L>D
Orden!entral-Baiz;.izq.M
*rocesaDodoM
Orden!entral-Baiz;.der.
#D+
#D+M


*BO!#+UB# *ostOrden -Baiz:"arbol.M
H#L>D
>& Baiz43D>L
"H#D H#L>D
*ostOrden-Baiz;.izq.M
*ostOrden-Baiz;.der.M
*rocesaDodo
#D+
#D+M

3., B-$K-e2a 2e -" "o2o

#n un (rbol binario de b=squeda puede localizarse una cla$e arbitraria empezando por la raiz, y
a$anzando por un camino de b=squeda de forma que la decisin de continuar por el subarbol
izquierdo o dereco de un nodo dado se toma en base =nicamente al $alor de la cla$e de dico
nodo.
"al como ocurri en el caso de b=squeda en listas -#n el caso de recorrido iterati$o., la
complejidad de la condicin de terminacin del bucle sugiere buscar una solucin mejor.#sta
consiste en el uso de un centinela al final de la lista.*uede aplicarse la misma idea al caso de un
(rbol.#l uso de punteros permite que todas las ramas del (rbol acaben con el mismo, identico,
centinela.
La estructura resultante no es ya un (rbol, sino m(s bien un (rbol con todas las ojas atadas a un
punto de anclaje com=n, =nico.#l centinela puede ser considerado como un representante
com=n de todos los nodos e%ternos con los que se e%tendra el (rbol original.
&UD!">OD Huscar -?rbol:"arbolM!la$e:"cla$e.:"infoM
H#L>D
>& ?rbol/D>L
"H#D H#L>D
-: Do est( :.
Huscar:/2
#D+
#L,# >& ?rbol;.!la$e/!la$e
"H#D Huscar:/?rbol;.>nfo
#L,# >& ?rbol;.!la$e3!la$e
"H#D Huscar:/Huscar-?rbol;.izq,!la$e.
#L,# Huscar:/Huscar-?rbol;.der,!la$e.
#D+M

La funcin Localizar es una $ersin iterati$a de la funcon de b=squeda de un nodo en un (rbol
binario de b=squeda.


&UD!">OD Localizar-?rbol:"arbolM!la$e:"cla$e.:"infoM
E?B
#ncontrado:HOOL#?DM
H#L>D
#ncontrado:/&?L,#M
OH>L# -?rbol43D>L. ?D+ DO" #ncontrado +O
>& ?rbol;.!la$e/!la$e
"H#D #ncontrado:/"BU#
#L,# >& ?rbol;.!la$e3!la$e
"H#D ?rbol:/?rbol;.>zq
#L,# ?rbol:/?rbol;.+erM
Localizar:/?rbol;.>nfo
#D+M

3.3 Borra2o
La tarea consiste en borrar, es decir, sacar el nodo con cla$e % de un (rbol que tiene las cla$es
ordenadas.Horrar un nodo es f(cil si el elemento a borrar es una oja o solo tiene un
descendiente.
T ,i ay que borrar una oja, se borra con +>,*O,# y se pone el padre a D>L.
T *ara borrar un nodo con un descendiente, la $ariable arbol, en $ez de apuntar
al nodo a borrar, se situa el padre apuntando al descendiente y se borra el nodo.

La dificultad est( en el borrado de un elemento con dos descendientes, pues no puede se'alarse
en dos direcciones con un solo puntero.
T *ara borrar un nodo con dos descendientes,no $amos a borrar el nodo, sino
que subimos un nodo oja y lo borramos como oja."enemos dos
posibilidades: ,ubir el nodo oja m(s a la dereca del subarbol izquierdo, o el
m(s a la izquierda del subarbol dereco.
Los detalles del proceso se muestran en el procedimiento recursi$o llamado Borrar.#ste
procedimiento distingue tres casos:
9. Do ay ning=n nodo con la cla$e buscada.
0. #l componente con la cla$e buscada tiene un =nico descendiente como
m(%imo.
). #l componente con la cla$e buscada tiene dos descentientes.
#l procedimiento au%iliar recursi$o SubDer se acti$a solo en tercer caso.#ntonces desciente a lo
largo de la rama m(s a la dereca del sub(rbol izquierdo del elemento a borrar, y reemplaza la
informacin de inter@s.


*BO!#+UB# Horrar -E?B ?rbol:"arbolM!la$e:"cla$e.M
E?B
?u%:"arbolM


*BO!#+UB# ,ub+er-E?B *untero:"arbol.M
H#L>D
>& *untero;.der43D>L
"H#D ,ubder-*untero;.der.
#L,# H#L>D
?rbol;.!la$e:/*untero;.!la$eM
?rbol;.>nfo:/puntero;.>nfoM
?u%:/*unteroM
*untero:/*untero;.izq
#D+
#D+M
H#L>D
>& ?rbol/D>L
"H#D 1DO #,"?1
#L,# H#L>D
>& ?rbol;.!la$e3!la$e
"H#D Horrar -?rbol;.izq,!la$e.
#L,# >& ?rbol;.!la$e4!la$e
"H#D Horrar-?rbol;.der,!la$e.
#L,# >& ?rbol;.izq/D>L ?D+ ?rbol;.der/D>L
"H#D H#L>D -: Dodo oja :.
?u%:/?rbolM
?rbol:/D>L
#D+
#L,# >& ?rbol;.der/D>L
"H#D H#L>D -: ,olo oja izq :.
?u%:/?rbolM
?rbol:/?rbol;.izq
#D+
#L,# >& ?rbol;.izq/D>L
"H#D H#L>D
?u%:/?rbolM
?rbol:/?rbol;der
#D+
#L,# ,ubeder-?rbol;.izq.M
+>,*O,#-?u%.
#D+
#D+M

3.5 I"$erci'"

*rimero se realiza la b=squeda de la cla$e a insertar.,i este recorrido lle$a a un puntero que sea
igual a D>L -subarbol $acio., entonces se realiza la insercin ya que solo se pueden a'adir
nodos en las ojas, se inserta al final.

*BO!#+UB# >nsertar -E?B ?rbol:"arbolM!la$e:"cla$eM>nfo:"info.M
H#L>D
>& ?rbol/D>L -: Ha llegado al sitio donde ay que insertar :.
"H#D H#L>D
D#O -?rbol.M
?rbol;.izq:/D>LM
?rbol;.der:/D>LM
?rbol;.!la$e:/!la$eM
?rbol;.>nfo:/>nfo
#D+
#L,# >& ?rbol;.!la$e3!la$e
"H#D >nsertar -?rbol;.izq,cla$e,info.
#L,# >& ?rbol;.!la$e4!la$e
"H#D >nsertar -?rbol;.der,cla$e,info.
#L,# -: #BBOB :.
#D+M

#l par(metro Arbol es $ariable y no uno constante.#sto es esencial porque cuando se presenta el
caso de insercin se debe asignar un nue$o $alor a la $ariable que contenia el $alor D>L.
5. ARBOLES PRE:ECTAMENTE EU*ILIBRADOS.

,e usan especialmente cuando se insertan los elementos de un ficero ordenado con los m@todos
de arboles binarios de b=squeda.*ara que un arbol no dejenere en una lista entra el concepto de
equilibrio.Hay $arias formas.Un arbos est( perfectamente equilibrado cuando situados en
cualquiera de sus nodos, el n=mero de nodos del subarbol izquierdo y el dereco difieren como
muco en uno.#jemplo:




Eentajas:
La b=squeda es m(s r(pida que en cualquier otro tipo.!ada $ez que acemos
una comparacin eliminamos la mitad de elementos, porque est(n
equilibrados.#s similar a la b=squeda dicotmica en tablas.#l peor de los casos
es que el elemento no est@, y en ese caso la complejidad es:
Log
0
n
>ncon$enientes:
Hay que conocer el n=mero de nodos para saber cuantos ir(n a la dereca y
cuantos a la izquierda.#sto coca con el concepto de arbol -dinamismo., por
tanto no se utilizan muco.


5.1 Arole$ eK-ilira2o$ o ABL

#s una sua$izacin de las restricciones para formar arboles perfectamente equilibrados.Un arbol
es ?EL cuando situados en cualquiera de sus nodos, la altura del subarbol dereco y del
izquierdo difieren como muco en uno.#jemplo:






















La definicin no slo es simple, sino que adem(s conduce a un procedimiento de reequilibrado
relati$amente sencillo, y a una longitud de camino media pr(cticamente id@ntica a la del (rbol
perfectamente equilibrado.
#n un (rbol ?EL, se pueden realizar en O-lon n. unidades de tiempo, incluso en el peor de los
casos, las siguientes operaciones:
9. #ncontrar un nodo con una cla$e dada.
0. >nsertar un nodo con una cla$e dada.
). Horrar un nodo con una cla$e dada.
Eamos a a'adir un campo nue$o a la declaracin del tipo "arbol, que se llamar( equilibrio
-equ., que $a a $ariar entre 69, 2 y 9.

!ondiciones para $ariar equ:
_ La insercin se ace en las ojas
_ !uando creamos un nue$o nodo el campo de equilibrio $ale 2, ya que la altura
del subarbol izquierdo es igual que la del dereco.
_ !uando insertamos por la dereca incrementamos el $alor del campo de
equilibrio.
_ !uando insertamos por la izquierda decrementamos el $alor del campo de
equilibrio.
#jemplos:
5.1 I"$erci'" e" ABL

La insercin se ace siempre en las ojas, y $amos a tener un campo de equilibrio.Eamos a
tener una $ariable global llamada crecido de tipo HOOL#?D, que en el momento de insertar lo
$amos a poner a "BU# para despu@s controlar si se a desequilibrado o no.
,e sube restando o sumando 9 asta llegar a un cero.,i a la ora de sumar o restar un uno se sale
del rango ay que reequilibrar.
#jemplo:

8666668 8666668 8666668

+esequilibrios y reequilibrios

?l insertar un nue$o nodo en un (rbol equilibrado se pueden producir desequilibrios, que
quedar(n representados en los casos mostrados a continuacin.#n las figuras, las cajas
rectangulares representan sub(rboles, y la altura a'adida por la insercin se indica con
cruces.,imples transformaciones restauran el equilibrio deseado.

De$eK-ilirio iAK-ier2a(
iAK-ier2a $im&le.




















,e corrige con la rotacin izquierda6izquierda simple, que consiste en subir el nodo ?, que
tendr( al final el campo de equilibrio a 2.


















De$eK-ilirio 2erec=a(2erec=a $im&le
,e reequilibra con rotacin dereca6dereca simple.#s el reflejado del anterior.
De$eK-ilirio iAK-ier2o(2erec=o com&-e$to



,e corrige con la rotacin
izquierda6dereca compuesta.,e
sube el nodo H que pasa a tener el
campo de equilibrio a 2.

































De$eK-ilirio 2erec=o(iAK-ier2o com&-e$to
#s similar, solo que la imagen reflejada.

>mplementacin de la insercin

Un algoritmo que inserte y reequilibre depender( en forma crtica de la forma en que se
almacene la informacin relati$a al equilibrio del (rbol.Una solucin consiste en mantener la
informacin sobre el equilibrio, de forma completamente implicita, en la estructura misma del
(rbol.#n este caso, sin embargo, el factor de equilibrio debe 1averiguarse1 cada $ez que se
encuentre afectado por una insercin, con el consiguiente trabajo resultante.
Otra forma -la que $amos a usar. consiste en atribuir a, y almacenar con, cada nodo un factor de
equilibrio e%plcito.La definicin de nodo se ampla entonces a:
"I*# Dodo/B#!OB+
!la$e:"cla$eM
>nfo:"infoM
>zq,+er:;DodoM
#qui:69..9
#D+
#l proceso de insercin de un nodo consta fundamentalmente de las tres partes consecuti$as
siguientes:
T ,eguir el camino de b=squeda asta que se comprueba que la cla$e a=n no
est( en el (rbol.
T >nsertar el nue$o nodo y determinar el factor de equilibrio resultante.
T Eol$er siguiendo el camino de b=squeda y comprobar el factor de equilibrio
de cada nodo.

?unque este m@todo realiza algunas comprobaciones que son redundantes, una $ez que se
establece el equilibrio, @ste no necesita comprobarse en los antecesores del nodo en cuestin.
#n cada paso se debe mandar informacin sobre si la altura del sub(rbol -en el cual se a
realizado la insercin. a aumentado o no.*or lo tanto se e%tiende la lista de par(matros del
procedimiento con el HOOL#?D !recido, que debe ser un par(metro de tipo $ariable, ya que se
utiliza para transmitir un resultado.

*BO!#+UB# >nsertar -E?B ?rbol:"arbolM!la$e:"cla$eM>nfo:"infoM
E?B !recido:HOOL#?D.M
*BO!#+UB# Bequizq -E?B ?rbol:"arbolME?B !recido:HOOL#?D.M
E?B
?u%9,?u%0:"arbolM
H#L>D
!?,# ?rbol;.#q O&
9: H#L>D
?rbol;.#q:/2M -: Hemos insertado por >[+? 969/2 :.
!recido:/&?L,# -: ,olo $a a cambiar cuando #q/2 :.
#D+M
2:?rbol;.#q:/69M -: 269/69 :.
69: H#L>D -: Hay que reequilibrar :.
?u%9:/?rbol;.izqM
>& ?u%9;.#q/69
"H#D H#L>D -: >zda6>zda simple :.
?rbol;.izq:/?u%9;.derM
?u%9;.der:/?rbolM
?rbol;.#q:/2M
?u%9;.#q:/2M
?rbol:/?u%9
#D+
#L,# H#L>D -: >zda6+ca compuesto :.
?u%0:/?u%9;.derM
?u%9;.der:/?u%0;.izqM
?u%0;.izq:/?u%9M
?rbol;.izq:/?u%0;.derM
?u%0;.der:/?rbolM
>& ?u%0;.#q/69
"H#D H#L>D
?u%;.#q:/2M
?rbol;.#q:/9
#D+
#L,# H#L>D
?u%9;.#q:/69M
?rbol;.#q:/2
#D+
?u%0;.#q:/2M
?rbol:/?u%0
#D+M
!recido:/&?L,#
#D+M
#D+M
H#L>D
>& ?rbol/D>L
"H#D H#L>D
!rearDodo-?rbol,!la$e,>nfo.M
!recido:/"BU#M
#D+
#L,# >& ?rbol;.!la$e/!la$e
"H#D 1#rror1
#L,# >& ?rbol;.!la$e3!la$e
"H#D H#L>D
>nsertar-?rbol;.izq,!la$e,>nfo,!recido.M
>& !recido
"H#D Bequizq-?rbol,!recido.
#D+
#L,# H#L>D
>nsertar-?rbol;.der,!la$e,>nfo,!recido.M
>& !recido
"H#D Bequder-?rbol,!recido.
#D+
#D+M

La complejidad de las operaciones de equilibrado sugiere que estos (rboles deben utilizarse slo
si las recuperaciones de informacin son considerablemente m(s frecuentes que las inserciones.
5.# Borra2o e" ABL

Eamos a $er solo las distintas posibilidades que se pueden dar al borrar un nodo en el lado
dereco.? la izquierda es sim@trico.

Ca$o 1.RaiA.
Ca$o 1.1: ,i alguno de los subarboles que salen de la raiz est( $acio, entonces
el otro estar( $acio o solo tiene un nodo, por ser un (rbol equilibrado.
T ,i solo tiene dos nodos se sube el no borrado acia arriba.
_ ,i solo est( el nodo a borrar, el arbol acaba $acio.
Ca$o 1.#: ,i no ay ning=n subarbol $acio se sube el nodo de m(s a la dereca
del subarbol izquierdo, se intercambia los $alores de la raiz por los de ese nodo,
y despues es borra este =ltimo.

Ca$o #.Borra2o e" el $-arol 2erec=o.

Ca$o #.1: ,i el campo de equilibrio tiene un cero, los dos subarboles son
iguales.#ntonces lo borramos y el campo de equilibrio pasa a 69.

Ca$o #.#: ,i tiene un 9, entonces el subarbol dereco tiene una altura m(s que
el izquierdo.?l borrar equilibramos y pasa a ser 2 ya que restamos 9.
T ,e puede aber desequilibrado por la izquierda porque al
borrar se a disminuido en uno la altura del (rbol.

Ca$o #.,: ,i tiene un 69, la altura del subarbol izquierdo es mayor que la del
dereco.?l borrar en el dereco se rompe el equilibrio, que pasa a 60.Hay tres
casos.


Ca$o #.,.1
















Ca$o #.,.#









Ca$o #.,.,







Fue $isto de otra forma, puede ser:

















T Gediante rotacion izquierda6dereca compuesta queda:






T Hay otros
dos casos, que el bloque 0]0 sea el m(s peque'o, o que lo sea el 0]9."ienen
altura D60 y por lo dem(s se tratan igual.
C. ARBOLES DE B*SU*EDA OPTIMOS.

,on arboles binarios o no binarios en los que los nodos con mayor probabilidad de ser
consultados se situan m(s cerca de la raiz.#l camino medio, ser( el camino del nodo por la
probabilidad de ser consultado.,on est(ticos, una $ez creados no se borra, ni se inserta, etc.
,e utilizan en analizadores de le%ico y diccionarios de datos.#l camino medio, ser( el camino
del nodo por la probabilidad de ser consultado.

De$eK-ilirio 2erec=a(2erec=a $im&le
,e reequilibra con rotacin dereca6dereca simple.#s el reflejado del anterior.
De$eK-ilirio iAK-ier2o(2erec=o com&-e$to







,i lo deseas puedes bajarte este articulo en formato La"eP: algoritm.doc -R9U ^b.

También podría gustarte