You are on page 1of 106

Estructura de Datos

Unidad Temas Subtemas


1 Anlisis de algoritmos. 1.1 Concepto de Complejidad de
algoritmos.
1.2 Aritmtica de la notacin .
1.! Complejidad.
1.!.1 Tiempo de ejecucin de un
algoritmo.
1.3.2 Complejidad en espacio.
1.4 Seleccin de un algoritmo.
2 "anejo de memoria. 2.1 Manejo de memoria esttica.
2.2 "anejo de memoria dinmica.
! Estructuras lineales
esttica # dinmicas.
!.1 $ilas.
!.2 Colas.
!.! %istas enla&adas.
!.!.1 Simples.
!.!.2 Dobles.
' (ecursi)idad. '.1 De*inicin.
'.2 $rocedimientos recursi)os.
4.3 Mecnica de recursin.
4.4 Transformacin de algoritmos
recursivos a iterativos.
4.5 ecursividad en el dise!o.
'.+ Complejidad de los algoritmos
recursi)os.
, Estructuras no lineales
estticas # dinmicas.
,.1Concepto de rbol.
,.1.1 Clasi*icacin de rboles.
,.2peraciones -sicas sobre rboles
binarios.
,.2.1 Creacin.
,.2.2 .nsercin.
,.2.! Eliminacin.
,.2.' (ecorridos sistemticos.
,.2., -alanceo.
+ rdenacin interna. +.1Algoritmos de rdenamiento por
.ntercambio.
+.1.1 -urbuja.
+.1.2 /uic0sort.
+.1.! S1ellSort.
+.2Algoritmos de ordenamiento por
Distribucin.
+.2.1 (adi2.
3 rdenacin e2terna. 3.1Algoritmos de ordenacin e2terna.
3.1.1 .ntercalacin directa.
3.1.2 "e&cla natural.
4 "todos de b5s6ueda. 4.1Algoritmos de ordenacin e2terna.
4.1.1 Secuencial.
4.1.2 -inaria.
4.1.! 7as1.
".2#$s%ueda e&terna.
".2.1 Secuencial.
".2.2 #inaria.
".2.3 'as(.
Unidad 1. Anlisis de algoritmos.
Introduccin
La resolucin prctica de un problema exige por una parte un algoritmo o mtodo de resolucin y por otra
un programa o codificacin de aquel en un ordenador real. Ambos componentes tienen su importancia;
pero la del algoritmo es absolutamente esencial, mientras que la codificacin puede muchas veces pasar a
nivel de ancdota.
A efectos prcticos o ingenieriles, nos deben preocupar los recursos fsicos necesarios para que un
programa se e!ecute. Aunque puede haber muchos parametros, los mas usuales son el tiempo de
e!ecucin y la cantidad de memoria "espacio#. $curre con frecuencia que ambos parametros estn fi!ados
por otras ra%ones y se plantea la pregunta inversa& 'cual es el tamano del mayor problema que puedo
resolver en ( segundos y)o con * bytes de memoria+ ,n lo que sigue nos centraremos casi siempre en el
parametro tiempo de e!ecucin, si bien las ideas desarrolladas son fcilmente aplicables a otro tipo de
recursos.
-ara cada problema determinaremos un medida . de su tama/o "por n0mero de datos# e intentaremos
hallar respuestas en funcin de dicho .. ,l concepto exacto que mide . depende de la naturale%a del
problema. As, para un vector se suele uti%ar como . su longitud; para una matri%, el n0mero de elementos
que la componen; para un grafo, puede ser el n0mero de nodos "a veces es mas importante considerar el
n0mero de arcos, dependiendo del tipo de problema a resolver#; en un fichero se suele usar el n0mero de
registros, etc. ,s imposible dar una regla general, pues cada problema tiene su propia lgica de coste.
1.1 Concepto de Complejidad de algoritmos.
La complejidad nos sirve para ver cuanto cuesta la ejecucin de un
programa.
Asintotas
Por una parte necesitamos analizar la potencia de los algoritmos independientemente de la
potencia de la mquina que los ejecute e incluso de la habilidad del programador que los
codifique. Por otra, este anlisis nos interesa especialmente cuando el algoritmo se aplica a
problema grandes. Casi siempre los problemas pequeos se pueden resolver de cualquier forma,
apareciendo las limitaciones al atacar problemas grandes. No debe olvidarse que cualquier
tcnica de ingeniera, si funciona, acaba aplicndose al problema ms grande que sea posible! las
tecnologias de "ito, antes o despus, acaban llevndose al lmite de sus posibilidades.
#as consideraciones anteriores nos llevan a estudiar el comportamiento de un algoritmo cuando
se fuerza el tamao del problema al que se aplica. $atemticamente hablando, cuando N tiende a
infinito. %s decir, su comportamiento asint&tico.
'ean (g)n*( diferentes funciones que determinan el uso de recursos. +abra funciones (g( de todos
los colores. #o que vamos a intentar es identificar (familias( de funciones, usando como criterio
de agrupaci&n su comportamiento asint&tico.
, un conjunto de funciones que comparten un mismo comportamiento asint&tico le
denominaremos un &rden de complejidad-. +abitualmente estos conjuntos se denominan .,
e"istiendo una infinidad de ellos.
Para cada uno de estos conjuntos se suele identificar un miembro f)n* que se utiliza como
representante de la clase, hablndose del conjunto de funciones (g( que son del orden de (f)n*(,
denotndose como
g IN O(f(n))
Con frecuencia nos encontraremos con que no es necesario conocer el comportamiento e"acto,
sino que basta conocer una cota superior, es decir, alguna funci&n que se comporte (a/n peor(.
#a definici&n matemtica de estos conjuntos debe ser mu0 cuidadosa para involucrar ambos
aspectos! identificaci&n de una familia 0 posible utilizaci&n como cota superior de otras funciones
menos malas!
1cese que el conjunto .)f)n** es el de las funciones de orden de f)n*, que se define como
O(f(n))= {g: INTEGER -> REAL
+
tales que
existen las cnstantes ! " N
#
tales que
$a%a t& N > N
#
' g(N) (= !)f(N) *
en palabras, .)f)n** esta formado por aquellas funciones g)n* que crecen a un ritmo menor o
igual que el de f)n*.
1e las funciones (g( que forman este conjunto .)f)n** se dice que "estn dominadas
asintticamente" por (f(, en el sentido de que para N suficientemente grande, 0 salvo una
constante multiplicativa (2(, f)n* es una cota superior de g)n*.
Reglas Prcticas
,unque no e"iste una receta que siempre funcione para calcular la complejidad de un algoritmo,
si es posible tratar sistematicamente una gran cantidad de ellos, basandonos en que suelen estar
bien estructurados 0 siguen pautas uniformes.
#oa algoritmos bien estructurados combinan las sentencias de alguna de las formas siguientes
3. sentencias sencillas
4. secuencia )5*
6. decisi&n )if*
7. bucles
8. llamadas a procedimientos
Sentencias sencillas
Nos referimos a las sentencias de asignaci&n, entrada9salida, etc. siempre 0 cuando no trabajen
sobre variables estructuradas cu0o tamao este relacionado con el tamao N del problema. #a
inmensa ma0ora de las sentencias de un algoritmo requieren un tiempo constante de ejecuci&n,
siendo su complejidad .)3*.
Secuencia 89:
#a complejidad de una serie de elementos de un programa es del orden de la suma de las
complejidades individuales, aplicndose las operaciones arriba e"puestas.
Decisin 8i*:
#a condici&n suele ser de .)3*, complejidad a sumar con la peor posible, bien en la rama :+%N,
o bien en la rama %#'%. %n decisiones multiples )%#'% ;<, '=;:C+ C,'%*, se tomara la peor
de las ramas.
-ucles
%n los bucles con contador e"plcito, podemos distinguir dos casos, que el tamao N forme parte
de los lmites o que no. 'i el bucle se realiza un n/mero fijo de veces, independiente de N,
entonces la repetici&n s&lo introduce una constante multiplicativa que puede absorberse.
E+,- f% (int i= #- i ( .- i++) { alg/&e/O(0) * => .)O(0) = O(0)
'i el tamao N aparece como lmite de iteraciones ...
E+,- f% (int i= #- i ( N- i++) { alg/&e/O(0) * => N ) O(0) = O(n)
E+,- f% (int i= #- i ( N- i++) {
f% (int += #- + ( N- +++) {
alg/&e/O(0)
*
*
tendremos N > N > .)3* ? .)n
4
*
E+,- f% (int i= #- i ( N- i++) {
f% (int += #- + ( i- +++) {
alg/&e/O(0)
*
*
el bucle e"terior se realiza N veces, mientras que el interior se realiza 0' 1' 2' ,,, N veces
respectivamente. %n total,
0 + 1 + 2 + ,,, + N = N)(0+N)31 -> O(n
1
)

, veces aparecen bucles multiplicativos, donde la evoluci&n de la variable de control no es lineal
)como en los casos anteriores*
E+,- c= 0-
45ile (c ( N) {
alg/&e/O(0)
c= 1)c-
*
%l valor incial de (c( es 3, siendo (4
2
( al cabo de (2( iteraciones. %l n/mero de iteraciones es tal
que
1
!
>= N => != eis (lg
1
(N)) @el entero inmediato superiorA
0, por tanto, la complejidad del bucle es .)log n*.
E+,- c= N-
45ile (c > 0) {
alg/&e/O(0)
c= c 3 1-
*
Bn razonamiento anlogo nos lleva a log
4
)N* iteraciones 0, por tanto, a un orden .)log n* de
complejidad.
E+,- f% (int i= #- i ( N- i++) {
c= i-
45ile (c > #) {
alg/&e/O(0)
c= c31-
*
*
tenemos un bucle interno de orden .)log n* que se ejecuta N veces, luego el conjunto es de orden
.)n log n*
%lamadas a procedimientos
#a complejidad de llamar a un procedimiento viene dada por la complejidad del contenido del
procedimiento en s. %l coste de llamar no es sino una constante que podemos obviar
inmediatamente dentro de nuestros anlisis asint&ticos.
%l clculo de la complejidad asociada a un procedimiento puede complicarse notblemente si se
trata de procedimientos recursivos. %s fcil que tengamos que aplicar tcnicas propias de la
matemtica discreta, tema que queda fuera de los lmites de esta nota tcnica.
Ejemplo; e)aluacin de un polinomio
1.2 Aritmtica de la notacin .
rdenes de Complejidad
1e dice que $"f"n## define un "orden de complejidad". ,scogeremos como representante de este orden a
la funcin f"n# ms sencilla del mismo. As tendremos
$"2# orden constante
$"log n# orden logartmico
$"n# orden lineal
$"n log n#
$"n
3
# orden cuadrtico
$"n
a
# orden polinomial "a 4 3#
$"a
n
# orden exponencial "a 4 3#
$"n5# orden factorial
,s ms, se puede identificar una !erarqua de rdenes de comple!idad que coincide con el orden de la tabla
anterior; !erarqua en el sentido de que cada orden de comple!idad superior tiene a los inferiores como
subcon!untos. 1i un algoritmo A se puede demostrar de un cierto orden $2, es cierto que tambien
pertenece a todos los rdenes superiores "la relacin de orden 6ota superior de7 es transitiva#; pero en la
prctica lo 0til es encontrar la 8menor cota superior8, es decir el menor orden de comple!idad que lo cubra.
Impacto Prctico
-ara captar la importancia relativa de los rdenes de comple!idad conviene echar algunas cuentas.
1ea un problema que sabemos resolver con algoritmos de diferentes comple!idades. -ara compararlos
entre si, supongamos que todos ellos requieren 2 hora de ordenador para resolver un problema de tama/o
.92::.
';u ocurre si disponemos del doble de tiempo+ .otese que esto es lo mismo que disponer del mismo
tiempo en un odenador el doble de potente, y que el ritmo actual de progreso del hard<are es exactamente
ese&
8duplicacin anual del n0mero de instrucciones por segundo8.
';u ocurre si queremos resolver un problema de tama/o 3n+
O(f(n)) N=100 t=! N=00
lo" n 2 h 2:::: 2.2= h
n 2 h 3:: 3 h
n lo" n 2 h 2>> 3.?: h
n

2 h 2@2 @ h
n
#
2 h 23A B h

n
2 h 2:2 2:
?:
h
Los algoritmos de comple!idad $"n# y $"n log n# son los que muestran un comportamiento ms 8natural8&
prcticamente a doble de tiempo, doble de datos procesables.
Los algoritmos de comple!idad logartmica son un descubrimiento fenomenal, pues en el doble de tiempo
permiten atacar problemas notablemente mayores, y para resolver un problema el doble de grande slo
hace falta un poco ms de tiempo "ni mucho menos el doble#.
Los algoritmos de tipo polinmico no son una maravilla, y se enfrentan con dificultad a problemas de
tama/o creciente. La prctica viene a decirnos que son el lmite de lo 8tratable8.
1obre la tratabilidad de los algoritmos de comple!idad polinmica habria mucho que hablar, y a veces
seme!ante calificativo es puro eufemismo. *ientras comple!idades del orden $"n
3
# y $"n
?
# suelen ser
efectivamente abordables, prcticamente nadie acepta algoritmos de orden $"n
2::
#, por muy polinmicos
que sean. La frontera es imprecisa.
Cualquier algoritmo por encima de una comple!idad polinmica se dice 8intratable8 y slo ser aplicable a
problemas ridiculamente peque/os.
A la vista de lo anterior se comprende que los programadores busquen algoritmos de comple!idad lineal. ,s
un golpe de suerte encontrar algo de comple!idad logartmica. 1i se encuentran soluciones polinomiales, se
puede vivir con ellas; pero ante soluciones de comple!idad exponencial, ms vale seguir buscando.
.o obstante lo anterior ...
... si un programa se va a e!ecutar muy pocas veces, los costes de codificacin y depuracin son
los que ms importan, relegando la comple!idad a un papel secundario.
... si a un programa se le prev larga vida, hay que pensar que le tocar mantenerlo a otra persona
y, por tanto, conviene tener en cuenta su legibilidad, incluso a costa de la comple!idad de los
algoritmos empleados.
... si podemos garanti%ar que un programa slo va a traba!ar sobre datos peque/os "valores ba!os
de .#, el orden de comple!idad del algoritmo que usemos suele ser irrelevante, pudiendo llegar a
ser incluso contraproducente.
-or e!emplo, si disponemos de dos algoritmos para el mismo problema, con tiempos de e!ecucin
respectivos&
al"oritmo tiempo complejidad
f 2:: n $"n#
g n
3
$"n
3
#
asintticamente, 8f8 es me!or algoritmo que 8g8; pero esto es cierto a partir de . 4 2::.
1i nuestro problema no va a tratar !ams problemas de tama/o mayor que 2::, es me!or solucin
usar el algoritmo 8g8.
,l e!emplo anterior muestra que las constantes que aparecen en las frmulas para ("n#, y que
desaparecen al calcular las funciones de comple!idad, pueden ser decisivas desde el punto de
vista de ingeniera. -ueden darse incluso e!emplos ms dramaticos&
al"oritmo tiempo complejidad
f n $"n#
g 2:: n $"n#
a0n siendo dos algoritmos con idntico comportamiento asinttico, es obvio que el algoritmo 8f8 es
siempre 2:: veces ms rpido que el 8g8 y candidato primero a ser utili%ado.
... usualmente un programa de ba!a comple!idad en cuanto a tiempo de e!ecucin, suele conllevar
un alto consumo de memoria; y viceversa. A veces hay que sopesar ambos factores, quedndonos
en alg0n punto de compromiso.
... en problemas de clculo numrico hay que tener en cuenta ms factores que su comple!idad
pura y dura, o incluso que su tiempo de e!ecucin& queda por considerar la precisin del clculo, el
mximo error introducido en clculos intermedios, la estabilidad del algoritmo, etc. etc.
Propiedades de los Conjuntos O(f)
.o entraremos en muchas profundidades, ni en demostraciones, que se pueden hallar en los libros
especiali%ados. .o obstante, algo hay que saber de cmo se traba!a con los con!untos $"# para poder
evaluar los algoritmos con los que nos encontremos.
-ara simplificar la notacin, usaremos $"f# para decir $"f"n##
Las primeras reglas slo expresan matemticamente el concepto de !erarqua de rdenes de comple!idad&
A. La relacin de orden definida por
f D g D94 f"n# E. $"g#
es reflexiva& f"n# E. $"f#
y transitiva& f"n# E. $"g# y g"n# E. $"h# 94 f"n# E. $"h#
F. f E. $"g# y g E. $"f# D94 $"f# 9 $"g#
Las siguientes propiedades se pueden utili%ar como reglas para el clculo de rdenes de comple!idad.
(oda la maquinaria matemtica para el clculo de lmites se puede aplicar directamente&
C. Lim"nG4inf#f"n#)g"n# 9 : 94 f E. $"g#
94 g .$(HE. $"f#
94 $"f# es subcon!unto de $"g#
I. Lim"nG4inf#f"n#)g"n# 9 J 94 f E. $"g#
94 g E. $"f#
94 $"f# 9 $"g#
,. Lim"nG4inf#f"n#)g"n#9 E.K 94 f .$(HE. $"g#
94 g E. $"f#
94 $"f# es supercon!unto de $"g#
Las que siguen son reglas habituales en el clculo de lmites&
K. 1i f, g E. $"h# 94 fLg E. $"h#
M. 1ea J una constante, f"n# E. $"g# 94 JNf"n# E. $"g#
O. 1i f E. $"h2# y g E. $"h3# 94 fLg E. $"h2Lh3#
E. 1i f E. $"h2# y g E. $"h3# 94 fNg E. $"h2Nh3#
P. 1ean los reales : D a D b 94 $"n
a
# es subcon!unto de $"n
b
#
Q. 1ea -"n# un polinomio de grado J 94 -"n# E. $"n
J
#
L. 1ean los reales a, b 4 2 94 $"loga# 9 $"logb#
La regla RLS nos permite olvidar la base en la que se calculan los logaritmos en expresiones de comple!idad.
La combinacin de las reglas RQ, MS es probablemente la ms usada, permitiendo de un pluma%o olvidar
todos los componentes de un polinomio, menos su grado.
-or 0ltimo, la regla ROS es la basica para anali%ar el concepto de secuencia en un programa& la composicin
secuencial de dos tro%os de programa es de orden de comple!idad el de la suma de sus partes.
1.! Complejidad.
1.!.1 Tiempo de ejecucin de un algoritmo.
$iempo de %jecucin
Tna medida que suele ser 0til conocer es el tiempo de e!ecucin de un programa en funcin de ., lo que
denominaremos (".#. ,sta funcin se puede medir fsicamente "e!ecutando el programa, relo! en mano#, o
calcularse sobre el cdigo contando instrucciones a e!ecutar y multiplicando por el tiempo requerido por
cada instruccin. As, un tro%o sencillo de programa como
12; for "int i9 :; i D .; iLL# 13;
requiere
(".#9 t2 L t3N.
siendo t2 el tiempo que lleve e!ecutar la serie 8128 de sentencias, y t3 el que lleve la serie 8138.
-rcticamente todos los programas reales incluyen alguna sentencia condicional, haciendo que las
sentencias efectivamente e!ecutadas dependan de los datos concretos que se le presenten. ,sto hace que
mas que un valor (".# debamos hablar de un rango de valores
(min".# D9 (".# D9 (max".#
los extremos son habitualmente conocidos como 8caso peor8 y 8caso me!or8. ,ntre ambos se hallara algun
8caso promedio8 o ms frecuente.
Cualquier frmula (".# incluye referencias al parmetro . y a una serie de constantes 8(i8 que dependen
de factores externos al algoritmo como pueden ser la calidad del cdigo generado por el compilador y la
velocidad de e!ecucin de instrucciones del ordenador que lo e!ecuta. Iado que es fcil cambiar de
compilador y que la potencia de los ordenadores crece a un ritmo vertiginoso "en la actualidad, se duplica
anualmente#, intentaremos anali%ar los algoritmos con algun nivel de independencia de estos factores; es
decir, buscaremos estimaciones generales ampliamente vlidas.
Complejidad en tiempo: tiempo necesario para la ejecucin del algoritmo.
1.!.2 Complejidad en espacio.
Complejidad en espacio: se refiere a la cantidad de memoria necesaria para
la ejecucin del algoritmo.
1.' Seleccin de un algoritmo.
Unidad 2. "anejo de memoria.
2.! "anejo de memoria esttica.
2.' "anejo de memoria dinmica.
Manejo de memoria dinmica.
Sobre el tratamiento de memoria, GLib dispone de una serie de
instrucciones que sustituyen a las ya conocidas por todos 6allc, f%ee, etc. y,
siguiendo con el modo de llamar a las funciones en GLib, las funciones que
sustituyen a las ya mencionadas son g/6allc y g/f%ee.
Reserva de memoria.
La funcin g/6allc posibilita la reserva de una ona de memoria, con un
n!mero de bytes que le pasemos como par"metro. #dem"s, tambi$n e%iste
una funcin similar llamada g/6allc# que, no slo reserva una ona de
memoria, sino que, adem"s, llena esa ona de memoria con ceros, lo cual
nos puede beneficiar si se necesita un ona de memoria totalmente limpia.
g$inte% g_malloc (
numero_de_bytes )&
gulong numero_de_bytes &
g$inte% g_malloc0 (
numero_de_bytes )&
gulong numero_de_bytes &
'%iste otro conjunto de funciones que nos permiten reservar memoria de una
forma parecida a cmo se (ace en los lenguajes orientados a objetos. 'sto
se realia mediante las siguientes macros definidas en GLib 3g6e6,5:
3) 7n8enience 6e6%" allcat%s
)3
9&efine g/ne4(st%uct/t"$e' n/st%ucts) :
((st%uct/t"$e )) g/6allc (((gsi;e) si;ef (st%uct/t"$e)) )
((gsi;e) (n/st%ucts))))
9&efine g/ne4#(st%uct/t"$e' n/st%ucts) :
((st%uct/t"$e )) g/6allc# (((gsi;e) si;ef (st%uct/t"$e)) )
((gsi;e) (n/st%ucts))))
9&efine g/%ene4(st%uct/t"$e' 6e6' n/st%ucts) :
((st%uct/t"$e )) g/%eallc ((6e6)' ((gsi;e) si;ef
(st%uct/t"$e)) ) ((gsi;e) (n/st%ucts))))

Como se puede apreciar, no son m"s que macros basadas en g/6allc,
g/6allc# y g/%eallc. La forma de funcionamiento de g/ne4 y g/ne4# es
mediante el nombre de un tipo de datos y un n!mero de elementos de ese
tipo de datos, de forma que se puede (acer:
G<t%ing )st% = g/ne4 (G<t%ing'0)-
G<t%ing )a%%/st% = g/ne4 (G<t%ing' =)-

'n estas dos l)neas de cdigo, se asigna memoria para un elemento de tipo
GString, que queda almacenado en la variable st%, y para un array de cinco
elementos de tipo GString, que queda almacenado en la variable a%%/st%*.
g/ne4# funciona de la misma forma que g/ne4, con la !nica diferencia de que
inicialia a + toda la memoria asignada. 'n cuanto a g/%ene4, $sta funciona de
la misma forma que g/%eallc, es decir, reasigna la memoria asignada
anteriormente.
Liberacin de memoria.
Cuando se (ace una reserva de memoria con g/6allc y, en un momento
dado, el uso de esa memoria no tiene sentido, es el momento de liberar esa
memoria. , el sustituto de f%ee es g/f%ee que, b"sicamente, funciona igual
que la anteriormente mencionada.
8i& g_free (
memoria_reservada )
&

gpointer
memoria_reservada
&
Realojamiento de memoria.
'n determinadas ocasiones, sobre todo cuando se utilian estructuras de
datos din"micas, es necesario ajustar el tama-o de una ona de memoria
.ya sea para (acerla m"s grande o m"s peque-a*. /ara eso, GLib ofrece la
funcin g/%eallc, que recibe un puntero a memoria que apunta a una regin
que es la que ser" acomodada al nuevo tama-o y devuelve el puntero a la
nueva ona de memoria. 'l anterior puntero es liberado y no se deber)a
utiliar m"s:
g$inte% g_realloc (
memoria_reservada
,

numero_de_bytes )&
gpointer
memoria_reservada
&
gulong numero_de_bytes &
Otras funciones de manejo de memoria dinmica
8i&) callc ( unsigne& n>"tes )-
Como malloc, pero rellena de ceros la zona de memoria.
c5a%) st%&u$ ( c5a%) ca&ena )-
Crea un duplicado de la cadena. 'e reservan strlen(cadena)+1 b0tes.
Unidad !. Estructuras lineales esttica #
dinmicas.
!.' $ilas.
#as pilas son otro tipo de estructura de datos lineales, las cuales presentan restricciones en
cuanto a la posici&n en la cual pueden realizarse las inserciones 0 las e"tracciones de elementos.
Bna pila es una lista de elementos en la que se pueden insertar 0 eliminar elementos s&lo por uno
de los e"tremos. Como consecuencia, los elementos de una pila sern eliminados en orden
inverso al que se insertaron. %s decir, el /ltimo elemento que se meti& a la pila ser el primero en
salir de ella.
%n la vida cotidiana e"isten muchos ejemplos de pilas, una pila de platos en una alacena, una pila
de latas en un supermercado, una pila de papeles sobre un escritorio, etc.
1ebido al orden en que se insertan 0 eliminan los elementos en una pila, tambin se le conoce
como estructura #;<. )#ast ;n, <irst .ut! /ltimo en entrar, primero en salir*.
Representacin en Memoria
#as pilas no son estructuras de datos fundamentales, es decir, no estn definidas como tales en los
lenguajes de programaci&n. #as pilas pueden representarse mediante el uso de !
,rreglos.
#istas enlazadas.
Nosotros ahora usaremos los arreglos. Por lo tanto debemos definir el tamao m"imo de la pila,
adems de un apuntador al /ltimo elemento insertado en la pila el cual denominaremos 'P. #a
representaci&n grfica de una pila es la siguiente!
Como utilizamos arreglos para implementar pilas, tenemos la limitante de espacio de memoria
reservada. Bna vez establecido un m"imo de capacidad para la pila, 0a no es posible insertar
ms elementos.
Bna posible soluci&n a este problema es el uso de espacios compartidos de memoria. 'upongase
que se necesitan dos pilas , cada una con un tamao m"imo de n elementos. %n este caso se
definir un solo arreglo de 4>n elementos, en lugar que dos arreglos de n elementos.
%n este caso utilizaremos dos apuntadores! 'P3 para apuntar al /ltimo elemento insertado en la
pila 3 0 'P4 para apuntar al /ltimo elemento insertado en la pila 4. Cada una de las pilas insertar
sus elementos por los e"tremos opuestos, es decir, la pila 3 iniciar a partir de la localidad 3 del
arreglo 0 la pila 4 iniciar en la localidad 4n. 1e este modo si la pila 3 necesita ms de n espacios
)ha0 que recordar que a cada pila se le asignaron n localidades* 0 la pila 4 no tiene ocupados sus
n lugares, entonces se podrn seguir insertando elementos en la pila 3 sin caer en un error de
desbordamiento.
Notacin Infija, Postfija y Prefija
#as pilas son estructuras de datos mu0 usadas para la soluci&n de diversos tipos de problemas.
Pero tal vez el principal uso de estas estructuras es el tratamiento de e"presiones matemticas.
ALORI!MO PARA "ON#$R!IR $%PR$&ION$& IN'I(A& $N PO&!'I(A& )RPN*
3. ;ncrementar la pila
4. ;nicializar el conjunto de operaciones
6. $ientras no ocurra error 0 no sea fin de la e"presi&n infija haz
'i el carcter es!
3. P,C%N:%';' ;DEB;%C1.. Colocarlo en la pila
4. P,C%N:%';' 1%C%C+.. %"traer 0 desplegar los valores hasta encontrar
parntesis izquierdo. Pero N. desplegarlo.
6. BN .P%C,1.C.
'i la pila esta vaca o el carcter tiene ms alta prioridad que el
elemento del tope de la pila insertar el carcter en la pila.
%n caso contrario e"traer 0 desplegar el elemento del tope de la pila
0 repetir la comparaci&n con el nuevo tope.
7. .P%C,N1.. 1esplegarlo.
7. ,l final de la e"presi&n e"traer 0 desplegar los elementos de la pila hasta que se vace.
ALORI!MO PARA $#AL+AR +NA $%PR$&ION RPN
3. ;ncrementar la pila
4. Cepetir
:omar un caracter.
'i el caracter es un operando colocarlo en la pila.
'i el caracter es un operador entonces tomar los dos valores del tope de la pila,
aplicar el operador 0 colocar el resultado en el nuevo tope de la pila. )'e produce
un error en caso de no tener los 4 valores*
6. +asta encontrar el fin de la e"presi&n CPN.
Operaciones en Pilas
#as principales operaciones que podemos realizar en una pila son!
;nsertar un elemento )push*.
%liminar un elemento )pop*.
#os algoritmos para realizar cada una de estas operaciones se muestran a continuaci&n. #a
variable m"imo para hacer referencia al m"imo n/mero de elementos en la pila.
Insercin )Pus,*
si sp?m"imo entonces
mensaje )overfloF*
en caso contrario
spGHH spI3
pila@spAGHH valor
$liminacin )Pop*
si sp?J entonces
mensaje )underfloF*
en caso contrario
"GHHpila@spA
spGHHspH3
!., Colas.
0na cola es una estructura de almacenamiento, donde la podemos
considerar como una lista de elementos, en la que $stos van a ser insertados
por un e%tremo y ser"n e%tra)dos por otro.
Las colas son estructuras de tipo 1213 .first4in, first4out*, ya que el primer
elemento en entrar a la cola ser" el primero en salir de ella.
'%isten muc()simos ejemplos de colas en la vida real, como por ejemplo:
personas esperando en un tel$fono p!blico, ni-os esperando para subir a un
juego mec"nico, estudiantes esperando para subir a un camin escolar, etc.
Representacin en Memoria
Podemos representar a las colas de dos formas !
Como arreglos
Como listas ordenadas
%n esta unidad trataremos a las colas como arreglos de elementos, en donde debemos definir el
tamao de la cola 0 dos apuntadores, uno para accesar el primer elemento de la lista 0 otro que
guarde el /ltimo. %n lo sucesivo, al apuntador del primer elemento lo llamaremos <, al de el
/ltimo elemento , 0 $,K;$. para definir el n/mero m"imo de elementos en la cola.
"ola Lineal
#a cola lineal es un tipo de almacenamiento creado por el usuario que trabaja bajo la tcnica
<;<. )primero en entrar primero en salir*. #as colas lineales se representan grficamente de la
siguiente manera!
#as operaciones que podemos realizar en una cola son las de inicializaci&n, inserci&n 0
e"tracci&n. #os algoritmos para llevar a cabo dichas operaciones se especifican ms adelante.
#as condiciones a considerar en el tratamiento de colas lineales son las siguientes!
.verfloF )cola llena*, cuando se realice una inserci&n.
BnderfloF)cola vaca*, cuando se requiera de una e"tracci&n en la cola.
Laco
ALORI!MO -$ INI"IALI.A"I/N
< G HH 3
, GHH J
ALORI!MO PARA IN&$R!AR
'i ,?m"imo entonces
mensaje )overfloF*
en caso contrario
,GHH ,I3
cola@,AGHH valor
ALORI!MO PARA $%!RA$R
'i ,Mlt< entonces
mensaje )underfloF*
en caso contrario
< GHH <I3
" GHH cola@<A
"ola "ircular
#as colas lineales tienen un grave problema, como las e"tracciones s&lo pueden realizarse por un
e"tremo, puede llegar un momento en que el apuntador , sea igual al m"imo n/mero de
elementos en la cola, siendo que al frente de la misma e"istan lugares vacos, 0 al insertar un
nuevo elemento nos mandar un error de overfloF )cola llena*.
Para solucionar el problema de desperdicio de memoria se implementaron las colas circulares, en
las cuales e"iste un apuntador desde el /ltimo elemento al primero de la cola.
#a representaci&n grfica de esta estructura es la siguiente!
#a condici&n de vaco en este tipo de cola es que el apuntador < sea igual a cero.
#as condiciones que debemos tener presentes al trabajar con este tipo de estructura son las
siguientes!
.ver floF, cuando se realice una inserci&n.
Bnder floF, cuando se requiera de una e"tracci&n en la cola.
Lacio
ALORI!MO -$ INI"IALI.A"I/N
< G HH J
,GHH J
ALORI!MO PARA IN&$R!AR
'i )<I3?,* & )<?3 0 ,?m"imo* entonces
mensaje )overfloF*
en caso contrario
inicio
si ,?m"imo entonces
,GHH3
cola@,AGHH valor
en caso contrario
, GHH,I3
cola@,AGHH valor
si <?J entonces
< GHH 3
fin
ALORI!MO PARA $%!RA$R
'i <?J entonces
mensaje )underfloF*
en caso contrario
" GHH cola@<A
si <?, entonces
< GHH J
,GHH J
en caso contrario
si <?m"imo entonces
< GHH3 en caso contrario < GHH <I3
-o0le "ola
%sta estructura es una cola bidimensional en que las inserciones 0 eliminaciones se pueden
realizar en cualquiera de los dos e"tremos de la bicola. Nrficamente representamos una bicola de
la siguiente manera!
%"isten dos variantes de la doble cola!
1oble cola de entrada restringida.
1oble cola de salida restringida.
#a primer variante s&lo acepta inserciones al final de la cola, 0 la segunda acepta eliminaciones
s&lo al frente de la cola
ALGORITMOS DE ENTRADA RESTRINGIDA
Algoritmo de Iniciali1acin
< G HH 3
, GHH J
Algoritmo para Insertar
'i ,?m"imo entonces
mensaje )overfloF*
en caso contrario
, GHH,I3
cola@,AGHH valor
Algoritmo para $2traer
'i <Mgt, entonces
mensaje )underfloF*
en caso contrario
mensaje )frente9atrs*
si frente entonces
" GHH cola@<A
< GHH <I3
en caso contrario
" GHH cola@,A
, GHH ,H3
ALGORITMOS DE SALIDA RESTRINGIDA
Algoritmo de Iniciali1acin
< GHH3
, GHH J
Algoritmo para Insertar
'i <Mgt, entonces
mensaje )overfloF*
en caso contrario
mensaje )<rente9,trs*
si <rente entonces
cola@<A GHHvalor
en caso contrario
, GHH ,I3
cola@,A GHHvalor
Algoritmo para $2traer
'i <?J entonces
mensaje )underfloF*
en caso contrario
" GHHcola@<A
< GHH <I3
"ola de Prioridades
%sta estructura es un conjunto de elementos donde a cada uno de ellos se les asigna una prioridad,
0 la forma en que son procesados es la siguiente!
3. Bn elemento de ma0or prioridad es procesado al principio.
4. 1os elementos con la misma prioridad son procesados de acuerdo al orden en que fueron
insertados en la cola.
Algoritmo para Insertar
" GHH3
finalGHHverdadero
para i desde 3 hasta n haz
'i cola@iAMgtprioridad entonces
" GHHi
final GHHfalso
salir
si final entonces
" GHHnI3
para i desde nI3 hasta "I3
cola@iA GHHprioridad
n GHH nI3
Algoritmo para $2traer
'i cola@3A?J entonces
mensaje)overfloF*
en caso contrario
procesar GHHcola@3A
para i desde 4 hasta n haz
cola@iH3A GHHcola@3A
n GHH nH3
Operaciones en "olas
#as operaciones que nosotros podemos realizar sobre una cola son las siguientes!
;nserci&n.
%"tracci&n.
#as inserciones en la cola se llevarn a cabo por atrs de la cola, mientras que las eliminaciones
se realizarn por el frente de la cola )ha0 que recordar que el primero en entrar es el primero en
salir*.
!.+ %istas enla&adas.
!.+.1Simples.
Bna lista enlazada o encadenada es una colecci&n de elementos & nodos, en donde cada uno
contiene datos 0 un enlace o liga.
Bn nodo es una secuencia de caracteres en memoria dividida en campos )de cualquier tipo*. Bn
nodo siempre contiene la direcci&n de memoria del siguiente nodo de informaci&n si este e"iste.
Bn apuntador es la direcci&n de memoria de un nodo
#a figura siguiente muestra la estructura de un nodo!
%l campo liga, que es de tipo puntero, es el que se usa para establecer la liga con el siguiente
nodo de la lista. 'i el nodo fuera el /ltimo, este campo recibe como valor N;# )vaco*.
, continuaci&n se muestra el esquema de una lista !
Operaciones en Listas $nla1adas
#as operaciones que podemos realizar sobre una lista enlazada son las siguientes!
Recorrido3 %sta operaci&n consiste en visitar cada uno de los nodos que forman la lista .
Para recorrer todos los nodos de la lista, se comienza con el primero, se toma el valor del
campo liga para avanzar al segundo nodo, el campo liga de este nodo nos dar la
direcci&n del tercer nodo, 0 as sucesivamente.
Insercin3 %sta operaci&n consiste en agregar un nuevo nodo a la lista. Para esta
operaci&n se pueden considerar tres casos!
;nsertar un nodo al inicio.
;nsertar un nodo antes o despus de cierto nodo.
;nsertar un nodo al final.
4orrado3 #a operaci&n de borrado consiste en quitar un nodo de la lista, redefiniendo las
ligas que correspondan. 'e pueden presentar cuatro casos!
%liminar el primer nodo.
%liminar el /ltimo nodo.
%liminar un nodo con cierta informaci&n.
%liminar el nodo anterior o posterior al nodo cierta con informaci&n.
45s6ueda3 %sta operaci&n consiste en visitar cada uno de los nodos, tomando al campo
liga como puntero al siguiente nodo a visitar.
Listas Lineales
%n esta secci&n se mostrarn algunos algoritmos sobre listas lineales sin nodo de cabecera 0 con
nodo de cabecera.
Bna lista con nodo de cabecera es aquella en la que el primer nodo de la lista contendr en su
campo dato alg/n valor que lo diference de los dems nodos )como ! >, H, I, etc*. Bn ejemplo de
lista con nodo de cabecera es el siguiente!
%n el caso de utilizar listas con nodo de cabecera, usaremos el apuntador C,O para hacer
referencia a la cabeza de la lista.
Para el caso de las listas sin nodo de cabecera, se usar la e"presi&n :.P para referenciar al
primer nodo de la lista, 0 :.P)dato*, :.P)liga* para hacer referencia al dato almacenado 0 a la
liga al siguiente nodo respectivamente.
Algoritmo de "reacin
topGHHN;#
repite
neF)p*
leer)p)dato**
si top?N;# entonces
topGHHp
en caso contrario
q)liga*GHHp
p)liga*GHHN;#
qGHHp
mensaje)-otro nodoP-*
leer)respuesta*
hasta respuesta?no

Algoritmo para Recorrido
pGHHtop
mientras pGQN;# haz
escribe)p)dato**
pGHHp)liga!*

Algoritmo para insertar al final
pGHHtop
mientras p)liga*GQN;# haz
pGHHp)liga*
neF)q*
p)liga*GHHq
q)liga*GHHN;#

Algoritmo para insertar antes7despu8s de 9%9 informacin
pGHHtop
mensaje)antes9despues*
lee)respuesta*
si antes entonces
mientras pGQN;# haz
si p)dato*?-"- entonces
neF)q*
leer)q)dato**
q)liga*GHHp
si p?top entonces
topGHHq
en caso contrario
r)liga*GHHq
pGHHnil
en caso contrario
rGHHp
pGHHp)lin2*
si despues entonces
pGHHtop
mientras pGQN;# haz
si p)dato*?-"- entonces
neF)q*
leer)q)dato**
q)liga*GHHp)liga*
p)liga*GHHq
pGHHN;#
en caso contrario
pGHHp)liga*
pGHHtop
mientras p)liga*GQN;# haz
pGHHp)liga*
neF)q*
p)liga*GHHq
q)liga*GHHN;#

Algoritmo para 0orrar un nodo
pGHHtop
leer)valorRaRborrar*
mientras pGQN;# haz
si p)dato*?valorRaRborrar entonces
si p?top entonces
si p)liga*?N;# entonces
topGHHN;#
en caso contrario
top)liga*GHHtop)liga*
en caso contrario
q)liga*GHHp)liga*
dispose)p*
pGHHN;#
en caso contrario
qGHHp
pGHHp)liga*

Algoritmo de creacin de una lista con nodo de ca0ecera
neF)cab*
cab)dato*GHH->-
cab)liga*GHHN;#
qGHHcab
repite
neF)p*
leer)p)dato**
p)liga*GHHN;#
qGHHp
mensaje)otro nodoP*
leer)respuesta*
hasta respuesta?no

Algoritmo de e2traccin en una lista con nodo de ca0ecera
leer)valorRaRborrar*
pGHHcab
qGHHcab)liga*
mientras qGQN;# haz
si q)dato*?valorRaRborrar entonces
pGHHq)liga*
dispose)q*
qGHHN;#
en caso contrario
pGHHq
qGHHq)liga*
!.+.2Dobles.
Bna lista doble , & doblemente ligada es una colecci&n de nodos en la cual cada nodo tiene dos
punteros, uno de ellos apuntando a su predecesor )li* 0 otro a su sucesor)ld*. Por medio de estos
punteros se podr avanzar o retroceder a travs de la lista, seg/n se tomen las direcciones de uno
u otro puntero.
#a estructura de un nodo en una lista doble es la siguiente!
%"isten dos tipos de listas doblemente ligadas!
Listas do0les lineales3 %n este tipo de lista doble, tanto el puntero izquierdo del primer
nodo como el derecho del /ltimo nodo apuntan a N;#.
Listas do0les circulares3 %n este tipo de lista doble, el puntero izquierdo del primer nodo
apunta al /ltimo nodo de la lista, 0 el puntero derecho del /ltimo nodo apunta al primer
nodo de la lista.
1ebido a que las listas dobles circulares son ms eficientes, los algoritmos que en esta secci&n se
traten sern sobre listas dobles circulares.
%n la figura siguiente se muestra un ejemplo de una lista doblemente ligada lineal que almacena
n/meros!
%n la figura siguiente se muestra un ejemplo de una lista doblemente ligada circular que
almacena n/meros!
, continuaci&n mostraremos algunos algoritmos sobre listas enlazadas. Como 0a se mencion&,
llamaremos li al puntero izquierdo 0 ld al puntero derecho, tambin usaremos el apuntador top
para hacer referencia al primer nodo en la lista, 0 p para referenciar al nodo presente.
Algoritmo de creacin
topGHHN;#
repite
si top?N;# entonces
neF)p*
lee)p)dato**
p)ld*GHHp
p)li*GHHp
topGHHp
en caso contrario
neF)p*
lee)p)dato**
p)ld*GHHtop
p)li*GHHp
p)ld)li**GHHp
mensaje)otro nodoP*
lee )respuesta*
hasta respuesta?no
Algoritmo para recorrer la lista
HHC%C.CC;1. , #, 1%C%C+,.
pGHHtop
repite
escribe)p)dato**
pGHHp)ld*
hasta p?top
HHC%C.CC;1. , #, ;DEB;%C1,.
pGHHtop
repite
escribe)p)dato**
pGHHp)li*
hasta p?top)li*
Algoritmo para insertar antes de 9%9 informacin
pGHHtop
mensaje )antes de P*
lee)"*
repite
si p)dato*?" entonces
neF)q*
leer)q)dato**
si p?top entonces
topGHHq
q)ld*GHHp
q)li*GHHp)li*
p)ld)li**GHHq
p)li*GHHq
pGHHtop
en caso contrario
pGHHp)ld*
hasta p?top
Algoritmo para insertar despues de 9%9 informacin
pGHHtop
mensaje)despues de P*
lee)"*
repite
si p)dato*?" entonces
neF)q*
lee)q)dato**
q)ld*GHHp)ld*
q)li*GHHp
p)li)ld**GHHq
p)ld*GHHq
pGHHtop
en caso contrario
pGHHp)ld*
hasta p?top
Algoritmo para 0orrar un nodo
pGHHtop
mensaje)Lalor a borrar*
lee)valorRaRborrar*
repite
si p)dato*?valorRaRborrar entonces
p)ld)li**GHHp)ld*
p)li)ld**GHHp)li*
si p?top entonces
si p)ld*?p)li* entonces
topGHHnil
en caso contrario
topGHHtop)ld*
dispose)p*
pGHHtop
en caso contrario
pGHHp)ld*
hasta p?top
Unidad '. (ecursi)idad.
.<T(DUCC.=<
)l rea de la programacin es mu* amplia * con muc(os detalles. +os programadores necesitan ser
capaces de resolver todos los pro,lemas %ue se les presente a trav-s del computador aun cuando en el
lenguaje %ue utili.an no (a*a una manera directa de resolver los pro,lemas. )n el lenguaje de
programacin C/ as0 como en otros lenguajes de programacin/ se puede aplicar una t-cnica %ue se le
dio el nom,re de recursividad por su funcionalidad. )sta t-cnica es utili.ada en la programacin
estructurada para resolver pro,lemas %ue tengan %ue ver con el factorial de un n$mero/ o juegos de
lgica. +as asignaciones de memoria pueden ser dinmicas o estticas * (a* diferencias entre estas dos
* se pueden aplicar las dos en un programa cual%uiera.
'.3 De*inicin.
+ablamos de recursividad, tanto en el mbito informtico como en el mbito matemtico, cuando
definimos algo )un tipo de objetos, una propiedad o una operaci&n* en funci&n de si mismo.#a
recursividad en programaci&n es una herramienta sencilla, mu0 /til 0 potente.
%jemplo!
#a potenciaci&n con e"ponentes enteros se puede definir!
a ? 3
a
n
? a>a
)nH3*
si nQ
%l factorial de un entero positivo suele definirse!
S ? 3
nS ? n>)nH3*S si nQ
%n programaci&n la recursividad supone la posibilidad de permitir a un subprograma llamadas a
si mismo, aunque tambin supone la posibilidad de definir estructuras de datos recursivas.
+a recursividad es una t-cnica de programacin importante. Se utili.a para reali.ar una llamada a una
funcin desde la misma funcin. Como ejemplo $til se puede presentar el clculo de n$meros factoriales.
1l factorial de 2 es/ por definicin/ 1. +os factoriales de n$meros ma*ores se calculan mediante la
multiplicacin de 1 3 2 3 .../ incrementando el n$mero de 1 en 1 (asta llegar al n$mero para el %ue se est
calculando el factorial.
)l siguiente prrafo muestra una funcin/ e&presada con pala,ras/ %ue calcula un factorial.
4Si el n$mero es menor %ue cero/ se rec(a.a. Si no es un entero/ se redondea al siguiente entero. Si el
n$mero es cero/ su factorial es uno. Si el n$mero es ma*or %ue cero/ se multiplica por -l factorial del
n$mero menor inmediato.4
5ara calcular el factorial de cual%uier n$mero ma*or %ue cero (a* %ue calcular como m0nimo el factorial
de otro n$mero. +a funcin %ue se utili.a es la funcin en la %ue se encuentra en estos momentos/ esta
funcin de,e llamarse a s0 misma para el n$mero menor inmediato/ para poder ejecutarse en el n$mero
actual. )sto es un ejemplo de recursividad.
+a recursividad * la iteracin 6ejecucin en ,ucle7 estn mu* relacionadas/ cual%uier accin %ue pueda
reali.arse con la recursividad puede reali.arse con iteracin * viceversa. 8ormalmente/ un clculo
determinado se prestar a una t-cnica u otra/ slo necesita elegir el enfo%ue ms natural o con el %ue se
sienta ms cmodo.
Claramente/ esta t-cnica puede constituir un modo de meterse en pro,lemas. )s fcil crear una funcin
recursiva %ue no llegue a devolver nunca un resultado definitivo * no pueda llegar a un punto de
finali.acin. )ste tipo de recursividad (ace %ue el sistema ejecute lo %ue se conoce como ,ucle 4infinito4.
5ara entender mejor lo %ue en realidad es el concepto de recursin veamos un poco lo referente a la
secuencia de >ibonacci.
5rincipalmente (a,r0a %ue aclarar %ue es un ejemplo menos familiar %ue el del factorial/ %ue consiste en
la secuencia de enteros.
2/1/1/2/3/5/"/13/21/34/.../
Cada elemento en esta secuencia es la suma de los precedentes 6por ejemplo 2 9 1 : 2/ 1 9 1 : 2/ 1 9 2
: 3/ 2 9 3 : 5/ ...7 sean fib627 : 2/ fib 617 : 1 * as0 sucesivamente/ entonces puede definirse la secuencia
de ;i,onacci mediante la de*inicin recursi)a 6define un o,jeto en t-rminos de un caso mas simple de si
mismo7<
fi, 6n7 : n if n : : 2 or n : : 1
fi, 6n7 : fi, 6n = 27 9 fi, 6n = 17 if n >: 2
5or ejemplo/ para calcular fib 6?7/ puede aplicarse la definicin de manera recursiva para o,tener<
;i, 6?7 : fi, 647 9 fi, 657 : fi, 627 9 fi, 637 9 fi, 657 : fi, 627 9 fi, 617 9 fi, 637 9 fi, 657 : 2 9 1
fi, 637 9 fi, 657
1. 9 fi, 617 9 fi, 627 9 fi,657 :
1. 9 1 9 fi,627 9 fi, 617 9 fi, 657 :
2. 9 2 9 1 9 fi,657 : 3 9 fi, 637 9 fi, 647 :
3. 9 fi, 617 9 fi, 627 9 fi, 647 :
3 9 1 9 fi, 627 9 fi, 617 9 fi, 647 :
4. 9 2 9 1 9 fi, 627 9 fi, 637 : 5 9 fi, 627 9 fi, 617 9 fi, 637 :
5. 9 2 9 1 9 fi, 617 9 fi, 627 : ? 9 1 9 fi, 627 9 fi, 617 :
?. 9 2 9 1 : "
@,s-rvese %ue la definicin recursiva de los n$meros de ;i,onacci difiere de las definiciones recursivas
de la funcin factorial * de la multiplicacin . +a definicin recursiva de fib se refiere dos veces a s0 misma
. 5or ejemplo/ fib 6?7 : fib 647 9 fib 657/ de tal manera %ue al calcular fib 6?7/ fib tiene %ue aplicarse de
manera recursiva dos veces. Sin em,argo calcular fib 657 tam,i-n implica calcular fib 647/ as0 %ue al
aplicar la definicin (a* muc(a redundancia de clculo. )n ejemplo anterior/ fib637 se calcula tres veces
por separado. Ser0a muc(o mas eficiente 4recordar4 el valor de fib637 la primera ve. %ue se calcula *
volver a usarlo cada ve. %ue se necesite. )s muc(o mas eficiente un m-todo iterativo como el %ue sigue
parar calcular fib 6n7.
Af 6n B : 17
return 6n7C
lofi, : 2 C
(ifi, : 1 C
for 6i : 2C i B : nC i 997
D
& : lofi, C
lofi, : (ifi, C
(ifi, : & 9 lofi, C
E F3 fin del for3F
return 6(ifi,7 C
Comprese el numero de adiciones 6sin incluir los incrementos de la varia,le 0ndice/ i7 %ue se ejecutan
para calcular fib 6?7 mediante este algoritmo al usar la definicin recursiva. )n el caso de la funcin
factorial/ tienen %ue ejecutarse el mismo numero de multiplicaciones para calcular n! Mediante am,os
m-todos< recursivo e iterativo. +o mismo ocurre con el numero de sumas en los dos m-todos al calcular
la multiplicacin. Sin em,argo/ en el caso de los n$meros de ;i,onacci/ el m-todo recursivo es muc(o
mas costoso %ue el iterativo.
%l concepto de recursividad va ligado al de repetici&n. 'on recursivos aquellos algoritmos que,
estando encapsulados dentro de una funci&n, son llamados desde ella misma una 0 otra vez, en
contraposici&n a los algoritmos iterativos, que hacen uso de bucles Fhile, doHFhile, for, etc.
,lgo es recursivo si se define en trminos de s mismo )cuando para definirse hace menci&n a s
mismo*. Para que una definici&n recursiva sea vlida, la referencia a s misma debe ser
relativamente ms sencilla que el caso considerado.
%jemplo! definici&n de nT natural!
HQ el N T J es natural
HQ %l NT n es natural si nH3 lo es.
%n un algoritmo recursivo distinguimos como mnimo 4 partes!
a*3 "aso tri:ial, 0ase o de fin de recursin;
%s un caso donde el problema puede resolverse sin tener que hacer uso de una nueva llamada a s
mismo. %vita la continuaci&n indefinida de las partes recursivas.
0*3 Parte puramente recursi:a;
Celaciona el resultado del algoritmo con resultados de casos ms simples. 'e hacen nuevas
llamadas a la funci&n, pero estn ms pr&"imas al caso base.
$($MPLO
;:%C,:;L.!
int Factorial( int n )
{
int i, res=1;
for(i=1; i<=n; i++ )
res = res*i;
return(res);
}
C%CBC';L.!
int Factorial( int n )
{
if(n==0) return(1);
return(n*Factorial(n-1));
}
T.$S DE (ECU(S.=<
Recursi:idad simple! ,quella en cu0a definici&n s&lo aparece una llamada recursiva. 'e
puede transformar con facilidad en algoritmos iterativos.
Recursi:idad m5ltiple! 'e da cuando ha0 ms de una llamada a s misma dentro del
cuerpo de la funci&n, resultando ms dificil de hacer de forma iterativa.

int Fib( int n ) /* ej: Fibonacci */


{
if(n<=1) return(1);
return(Fib(n-1) + Fib(n-));
}

Recursi:idad anidada! %n algunos de los arg. de la llamada recursiva ha0 una nueva
llamada a s misma.

int !c"( int n, int # ) /* ej: !c"er#an */


{
if(n==0 ) return(#+1);
else if(#==0) return(!c"(n-1,1));
return(!c"(n-1, !c"(n,#-1)));
}

Recursi:idad cru1ada o indirecta! 'on algoritmos donde una funci&n provoca una
llamada a s misma de forma indirecta, a travs de otras funciones.

$j: %ar o &#'ar:


int 'ar( int nu#' )
{
if(nu#'==0) return(1);
return( i#'ar(nu#'-1));
}

int i#'ar( int nu#i )


{
if(nu#i==0) return(0);
return( 'ar(nu#i-1));
}
%A $.%A DE (ECU(S.=<
#a memoria del ordenador se divide )de manera l&gica, no fsica* en varios segmentos )7*!
&egmento de cdigo; Parte de la memoria donde se guardan las instrucciones del programa en
cod. $quina.
&egmento de datos; Parte de la memoria destinada a almacenar las variables estticas.
Mont<culo; Parte de la memoria destinada a las variables dinmicas.
Pila del programa; Parte destinada a las variables locales 0 parmetros de la funci&n que est
siendo ejecutada.
Llamada a una funcin:
'e reserva espacio en la pila para los parmetros de la funci&n 0 sus variables locales.
'e guarda en la pila la direcci&n de la lnea de c&digo desde donde se ha llamado a la
funci&n.
'e almacenan los parmetros de la funci&n 0 sus valores en la pila.
,l terminar la funci&n, se libera la memoria asignada en la pila 0 se vuelve a la instruc.
,ctual.
Llamada a una funcin recursiva:
%n el caso recursivo, cada llamada genera un nuevo ejemplar de la funci&n con sus
correspondientes objetos locales!
#a funci&n se ejecutar normalmente hasta la llamada a s misma. %n ese momento se
crean en la pila nuevos parmetros 0 variables locales.
%l nuevo ejemplar de funci&n comieza a ejecutarse.
'e crean ms copias hasta llegar a los casos bases, donde se resuelve directamente el
valor, 0 se va saliendo liberando memoria hasta llegar a la primera llamada )/ltima en
cerrarse*
E?E(C.C.S
a*3 !orres de =anoi; Problema de soluci&n recursiva, consiste en mover todos los discos )de
diferentes tamaos* de una aguja a otra, usando una aguja au"iliar, 0 sabiendo que un disco no
puede estar sobre otro menor que ste.
/?/ ? ?
@///A ? ?
@/////A ? ?
@ A ? ?
-------------------------------------
A B 7
/* (olucion:
1- )o*er n-1 +iscos +e ! a ,
- )o*er 1 +isco +e ! a -
.- )o*er n-1 +iscos +e , a -
*/
*oi+ /anoi( n, inicial, au0, final )
{
if( n10 )
{
/anoi(n-1, inicial, final, au0 );
'rintf(2)o*er 3+ +e 3c a 3c2, n, inicial, final );
/anoi(n-1, au0, inicial, final );
}
}
0*3 "alcular 2 ele:ado a n de forma recursi:a;
float 0ele*n( float base, int e0' )
{
if(e0' == 0 ) return(1);
return( base*0ele*n(base,e0'-1));
}
c*3 Multiplicar > n?s con sumas sucesi:as recurs;
int #ulti( int a, int b )
{
if(b == 0 ) return(0);
return( a + #ulti(a, b-1));
}
d*3 @Au8 ,ace este programaB;
*oi+ cosa( c4ar *ca+, int i)
{
if( ca+5i6 7= 8908 )
{
cosa(ca+,i+1);
'rintf(23c2, ca+5i6 );
}
}
Sol: Imprime la cadena invertida.
'.4 $rocedimientos recursi)os.
Bn procedimiento recursivo es aqul que se llama a s mismo. Por ejemplo, el siguiente procedimiento utiliza la
recursividad para calcular el factorial de su argumento original!
Cunctin Cact%ial(B"Dal N As Intege%) As Intege%
If N (= 0 T5en E Reac5e& en& f %ecu%si8e calls,
Retu%n 0 E N = # % 0' s cli6> >ac! ut f calls,
Else E N > 0' s call Cact%ial again,
Retu%n Cact%ial(N - 0) ) N
En& If
En& Cunctin
Nota 'i un procedimiento 'unction se llama a s mismo de manera recursiva, su nombre debe ir seguido de un
parntesis, aunque no e"ista una lista de argumentos. 1e lo contrario, se considerar que el nombre de la funci&n
representa al valor devuelto por sta.
#os programas tienen una cantidad de espacio limitado para las variables. Cada vez que un procedimiento se llama a
s mismo, se utiliza ms espacio. 'i este proceso contin/a indefinidamente, se acaba produciendo un error de espacio
de la pila. #a causa puede ser menos evidente si dos procedimientos se llaman entre s indefinidamente, o si nunca se
cumple una condici&n que limita la recursividad.
1ebe asegurarse de que los procedimientos recursivos no se llamen a s mismos indefinidamente, o tantas veces que
puedan agotar la memoria. #a recursividad normalmente puede sustituirse por bucles.
Dise@ando $rocedimientos (ecursi)os;
%jemplo! %ncontrar races.
Eueremos escribir un procedimiento para encontrar la raz c/bica de a, es decir, queremos un
procedimiento que calcule
f(a)=" ' tal que a = "F
.
M8todo de 0iseccin;
'uponiendo que queremos encontrar la raz c/bica de a, 0 tenemos dos valores "
J
0 "
3
, tal que
"
J
6
G? a G? "
3
6
.
Partimos el intervalo )"
J
, "
3
* en dos definiendo "
m
? )"
J
I "
3
*94, vemos enseguida "
m
6
habiendo
tres posibilidades.
3. "
J
? "
3
, hemos encontrado el resultado.
4. "
m
6
Qa, entonces la raz se encuentra en el intervalo )"
J
, "
m
*
6. "
m
G a, entonces la raz se encuentra en el intervalo )"
m
, "
3
*
0 as se repite hasta UencajonarV la raz.
Necesitamos construir primero un procedimiento au"iliar que calcule "
6
!
(&efine cu>e
(la6>&a (x) () x () x x)))
%l procedimiento para calcular races c/bicas por el mtodo de bisecci&n debe entonces ser capaz
de tomar una desici&n respecto a que acci&n seguir si el valor es ma0or o menor a los lmites de
la bisecci&n!
(&efine cu>e/%t/sl8e
(la6>&a (a x# x0)
(if (= x# x0)
x#
(if (> (cu>e (3 (+ x# x0) 1,#)) a)
(cu>e/%t/sl8e a x# (3 (+ x# x0) 1,#))
(cu>e/%t/sl8e a (3 (+ x# x0) 1,#) x0)))))
%nseguida necesitamos introducir una precisi&n, esto para indicar al programa cuando debe de
terminar la ejecuci&n, puesto que en ocasiones no es posible llegar al valor esperado 0 entonces
es necesario conformarse con una apro"imaci&n, que es precisamente la que dicta el valor de
epsilon en el siguiente caso!
(&efine e$siln #,##=)
(&efine cu>e/%t
(la6>&a (a)
(cu>e/%t/sl8e a x# x0)))
(&efine cu>e/%t/sl8e
(la6>&a (a x# x0)
(if ( ( (- x0 x#) e$siln)
(3 (+ (x# x0) 1,#)
(if (> ( cu>e (3 (+ x0 x#) 1,#)) a)
(cu>e-%t-sl8e a x# (3 (+ x# x0) 1,#))
(cu>e-%t-sl8e a (3 (+ x# x0) 1,#) x0)))))
W una vez que se llega al valor de "J & se rebase el valor de epsilon, el programa tendr un
resultado 0 culminar su ejecuci&n.
'.A "ecnica de recursin.
'.1B Trans*ormacin de algoritmos recursi)os a
iterati)os.
'.11 (ecursi)idad en el dise@o.
'.12 Complejidad de los algoritmos recursi)os.
El anlisis de algoritmos recursivos requiere utilizar tcnicas especiales. La tcnica ms adecuada
consiste simplemente en utilizar ciertas frmulas conocidas, las cuales son vlidas para la
mayora de
funciones recursivas.
La primera frmula se aplica a funciones recursivas en las que el tamao de los datos decrece de
forma
aritmtica:
La segunda frmula se aplica a funciones recursivas en las que el tamao de los datos decrece de
forma
geomtrica:
donde:
a = n de veces que se activa la funcin recursiva en cada llamada. a=1 en la funcin factorial;
a=2 en fibonacci.
c = constante que determina la velocidad con que disminuyen los datos (decremento de una
progresin aritmtica en el primer caso, razn de una progresin geomtrica en el segundo caso).
La demostracin de las frmulas anteriores puede encontrarse en la bibliografa.
$ropiedades de las de*iniciones o algoritmos recursi)os;
Gn re%uisito importante para %ue sea correcto un algoritmo recursivo es %ue no genere
una secuencia infinita de llamadas as0 mismo. Claro %ue cual%uier algoritmo %ue genere
tal secuencia no termina nunca. Gna funcin recursiva f de,e definirse en t-rminos %ue
no impli%uen a f al menos en un argumento o grupo de argumentos. He,e e&istir una
4salida4 de la secuencia de llamadas recursivas.
Si en esta salida no puede calcularse ninguna funcin recursiva. Cual%uier caso de
definicin recursiva o invocacin de un algoritmo recursivo tiene %ue reducirse a la larga
a alguna manipulacin de uno o casos mas simples no recursivos.
Unidad ,. Estructuras no lineales estticas #
dinmicas.
,.! Concepto de rbol.
, los arboles ordenados de grado dos se les conoce como arboles binarios 0a que cada nodo del
rbol no tendr ms de dos descendientes directos. #as aplicaciones de los arboles binarios son
mu0 variadas 0a que se les puede utilizar para representar una estructura en la cual es posible
tomar decisiones con dos opciones en distintos puntos.
#a representaci&n grfica de un rbol binario es la siguiente!
+a0 dos formas tradicionales de representar un rbol binario en memoria!
Por medio de datos tipo punteros tambin conocidos como variables dinmicas o listas.
Por medio de arreglos.
'in embargo la ms utilizada es la primera, puesto que es la ms natural para tratar este tipo de
estructuras.
#os nodos del rbol binario sern representados como registros que contendrn como mnimo tres
campos. %n un campo se almacenar la informaci&n del nodo. #os dos restantes se utilizarn para
apuntar al subarbol izquierdo 0 derecho del subarbol en cuesti&n.
Cada nodo se representa grficamente de la siguiente manera!
,.!.1 Clasi*icacin de rboles.
'%isten cuatro tipos de "rbol binario:.
,. O. 1istinto.
,. O. 'imilares.
,. O. %quivalentes.
,. O. Completos.
# continuacin se (ar" una breve descripcin de los diferentes tipos de "rbol
binario as) como un ejemplo de cada uno de ellos.
A. B. DISTINTO
'e dice que dos rboles binarios son distintos cuando sus estructuras son diferentes. %jemplo!
A. B. SIMILARES
1os arboles binarios son similares cuando sus estructuras son idnticas, pero la informaci&n que
contienen sus nodos es diferente. %jemplo!
A. B. E!I"ALENTES
'on aquellos arboles que son similares 0 que adems los nodos contienen la misma informaci&n.
%jemplo!
A. B. #OM$LETOS
'on aquellos arboles en los que todos sus nodos e"cepto los del ultimo nivel, tiene dos hijos5 el
subarbol izquierdo 0 el subarbol derecho.
Ar0oles $n,e0rados
%"iste un tipo especial de rbol binario llamado enhebrado, el cual contiene hebras que pueden
estar a la derecha o a la izquierda. %l siguiente ejemplo es un rbol binario enhebrado a la
derecha.
AR4OL $N=$4RA-O A LA -$R$"=A3 %ste tipo de rbol tiene un apuntador a la
derecha que apunta a un nodo antecesor.
AR4OL $N=$4RA-O A LA I.A+I$R-A3 %stos arboles tienen un apuntador a la
izquierda que apunta al nodo antecesor en orden.
,.' peraciones -sicas sobre rboles binarios.
,.'.1 Creacin.
%l algoritmo de creaci&n de un rbol binario es el siguiente!
Procedimiento crear)q!nodo*
inicio
mensaje)(Cama izquierdaP(*
lee)respuesta*
si respuesta ? (si( entonces
neF)p*
q)li* GHH nil
crear)p*
en caso contrario
q)li* GHH nil
mensaje)(Cama derechaP(*
lee)respuesta*
si respuesta?(si( entonces
neF)p*
q)ld*GHHp
crear)p*
en caso contrario
q)ld* GHHnil
fin
;N;C;.
neF)p*
raizGHHp
crear)p*
<;N
Implementaciones del Cr0ol 0inario
,l igual que ocurre en el caso de las listas, podemos implementar un rbol binario mediante
estructuras estticas o mediante estructuras dinmicas. %n ambos casos, cada nodo del rbol
contendr tres valores!
X #a informaci&n de un tipobase dado contenida en el nodo.
X Bn enlace al hijo derecho )raz del subrbol derecho*
X Bn enlace al hijo izquierdo )raz del subrbol izquierdo*
Nrficamente!
,.'.2 .nsercin.
IN&$R"ION $N +N AR4OL -$ 4+&A+$-A 4INARIA

%l siguiente algoritmo realiza una b/squeda en un rbol de b/squeda binaria e inserta
un nuevo registro si la b/squeda resulta infructuosa. )'uponemos la e"istencia de una
funci&n ma2etree que constru0e un rbol binario consistente en un solo nodo cu0o
campo de informaci&n se transfiere como argumento 0 da como resultado un
apuntador al rbol. 'in embargo, en nuestra versi&n particular, suponemos que
ma2etree acepta dos argumentos, un registro 0 una llave*.
q = null-
$ = t%ee-
45ile ($ G= null ) {
if (!e" == !($) )
%etu%n($)
q = $-
if (!e" !($) )
$ = left($)-
else
$ = %ig5t($)-
* 3) fin &el 45ile )3
8 = 6a!et%ee(%ec' !e")-
if (q == null)
t%ee = 8-
else
if (!e" !(q) )
left(q) = 8-
else
%ig5t(q) = 8-
%etu%n(8)-
Insercin de un elemento
#a operaci&n de inserci&n de un nuevo nodo en un rbol binario de b/squeda consta de tres fases
bsicas!
3. Creaci&n del nuevo nodo
4. O/squeda de su posici&n correspondiente en el rbol. 'e trata de encontrar la posici&n que le
corresponde para que el rbol resultante siga siendo de b/squeda.
6. ;nserci&n en la posici&n encontrado. 'e modifican de modo adecuado los enlaces de la
estructura.
#a creaci&n de un nuevo nodo supone simplemente reservar espacio para el registro asociado 0
rellenar sus tres campos.
1ado que no nos hemos impuesto la restricci&n de que el rbol resultante sea equilibrado,
consideraremos que la posici&n adecuada para insertar el nuevo nodo es la hoja en la cual se
mantiene el orden del rbol. ;nsertar el nodo en una hoja supone una operaci&n mucho menos
complicada que tener que insertarlo como un nodo interior 0 modificar la posici&n de uno o
varios subrboles completos.
#a inserci&n del nuevo nodo como una hoja supone simplemente modificar uno de los enlaces del
nodo que ser su padre.
Leamos con un ejemplo la evoluci&n de un rbol conforme vamos insertando nodos siguiendo el
criterio anterior respecto a la posici&n adecuada.
,.'.! Eliminacin.
$liminacin de un elemento
#a eliminaci&n de un nodo de un rbol binario de b/squeda es ms complicada que la inserci&n,
puesto que puede suponer la recolocaci&n de varios de sus nodos. %n lneas generales un posible
esquema para abordar esta operaci&n es el siguiente!
3. Ouscar el nodo que se desea borrar manteniendo un puntero a su padre.
4. 'i se encuentra el nodo ha0 que contemplar tres casos posibles!
a. 'i el nodo a borrar no tiene hijos, simplemente se libera el espacio que ocupa
b. 'i el nodo a borrar tiene un solo hijo, se aade como hijo de su padre, sustitu0endo la
posici&n ocupada por el nodo borrado.
c. 'i el nodo a borrar tiene los dos hijos se siguen los siguientes pasos!
i. 'e busca el m"imo de la rama izquierda o el mnimo de la rama derecha.
ii. 'e sustitu0e el nodo a borrar por el nodo encontrado.
Leamos grficamente varios ejemplos de eliminaci&n de un nodo!
$LIMINA"ION $N +N AR4OL -$ 4+&A+$-A
4INARIA

Presentemos ahora un algoritmo para eliminar un nodo con llave 2e0 de un rbol de
b/squeda binaria. +a0 tres casos a considerar. 'i el nodo a ser eliminado no tiene
hijos, puede eliminarse sin ajustes posteriores al rbol, si el nodo a eliminado tiene
s&lo un subrbol, su /nico hijo puede moverse hacia arriba 0 ocupar su lugar. 'in
embargo, si el nodo p a ser eliminado tiene dos subrboles, su sucesor en orden s )o
predecesor* debe tomar su lugar. %l sucesor en orden no puede tener un subrbol
izquierdo )dado que un descendiente izquierdo sera el sucesor en orden de p*. ,s el
hijo derecho de s puede moverse hacia arriba para ocupar el lugar s.
%n el siguiente algoritmo, sino e"iste nodo con llave 2e0 en el rbol, el rbol se deje
intacto.
$ = t%ee-
q = null-
3) >usca% el n& cn la lla8e !e"' a$unta% &ic5 n&
)3
3) cn $ " seHala% a su $a&%e cn q' si existe)3
45ile ($ G= null II !e" G= !($) )
q = $-
$ = (!e" !($) ) J left($) : %ig5t($)-
K = (!e" !($)) J left($) : %ing5t($)-
* 3) fin &el 45ile )3
if ($ == null )
3) la lla8e n estL en el L%>l &e+a% el
L%>l sin 6&ifica% )3
%etu%n-
3) asigna% a la 8a%ia>le %$ el n& que %ee6$la;a%L a n& ($)
)3
3)ls $%i6e%s &s cass: el n& que se eli6ina%L')3
3)a l 6Ls tene% un 5i+)3
if (left ($) == null)
%$ = %ig5t($)-
else
if (%g5t($) == null)
%$ = left($)-
else {
3) Te%ce% cas: n&e ($) tiene &s 5i+s,
Asigna% a %$)3
3) al suces% in%&en &e $ " a f el
$a&%e &e %$ )3
f = $-
%$ = %ig5t($)-
s = left(%$)- 3) s es sie6$%e el 5i+
i;quie%& &e %$ )3
45ile (s G= null) {
f = %$-
%$ = s-
s = left(%$)-
* 3) fin &el 45ile )3
3) En este $unt %$ es el suces% in%&en &e $ )3
if (f G= $) {
3) $ n es el $a&%e &e %$ " %$ = = left(f) )3
left(f) = %ig5t(%$)-
3) eli6ina% n&e(%$) &e su $siciMn actual "
%ee6$la;a%l )3
3) cn el 5i+ &e%ec5 &el n&e(%$)' n&e(%$) t6a el
luga% )3
3) &e n&e($) )3
%ing5t(%$) = %ig5t($)-
* 3) fin &e if )3
3)asigna% al 5i+ i;quie%& &e n&e(%$) un 8al% tal
)3
3) que n&e(%$) t6e el luga% &e n&e($) )3
left(%$) = left($)-
* 3) fin &e if )3
3) inse%ta% n&e(%$) en la $siciMn antes )3
3) cu$a&a $% n&e($)
)3
if (q = = null)
3) n&e ($) e%a la %aN; &el L%>l
)3
t%ee = %$-
else
($ = = left(q) ) J left(q) = %$ : %ig5t(q) =
%$-
f%een&e($)-
%etu%n-
,.'.' (ecorridos sistemticos.
Recorrido de un Cr0ol 0inario
Cecorrer un rbol consiste en acceder una sola vez a todos sus nodos. %sta operaci&n es bsica en
el tratamiento de rboles 0 nos permite, por ejemplo, imprimir toda la informaci&n almacenada en
el rbol, o bien eliminar toda esta informaci&n o, si tenemos un rbol con tipo base numrico,
sumar todos los valores...
%n el caso de los rboles binarios, el recorrido de sus distintos nodos se debe realizar en tres
pasos!
X acceder a la informaci&n de un nodo dado,
X acceder a la informaci&n del subrbol izquierdo de dicho nodo,
X acceder a la informaci&n del subrbol derecho de dicho nodo.
;mponiendo la restricci&n de que el subrbol izquierdo se recorre siempre antes que el derecho,
esta forma de proceder da lugar a tres tipos de recorrido, que se diferencian por el orden en el que
se realizan estos tres pasos. ,s distinguimos!
X Preorden! primero se accede a la informaci&n del nodo, despus al subrbol izquierdo 0
despus al derecho.
Inorden! primero se accede a la informaci&n del subrbol izquierdo, despus se accede a la
informaci&n del nodo 0, por /ltimo, se accede a la informaci&n del subrbol derecho.
Postorden! primero se accede a la informaci&n del subrbol izquierdo, despus a la del subrbol
derecho 0, por /ltimo, se accede a la informaci&n del nodo.
'i el nodo del que hablamos es la raz del rbol, estaremos recorriendo todos sus nodos. 1ebemos
darnos cuenta de que esta definici&n del recorrido es claramente recursiva, 0a que el recorrido de
un rbol se basa en el recorrido de sus subrboles izquierdo 0 derecho usando el mismo mtodo.
,unque podramos plantear una implementaci&n iterativa de los algoritmos de recorrido, el uso
de la recursi&n simplifica enormemente esta operaci&n.
Recorrido de un Ar0ol 4inario
+a0 tres manera de recorrer un rbol ! en inorden, preorden 0 postorden. Cada una de ellas tiene
una secuencia distinta para analizar el rbol como se puede ver a continuaci&n!
3. INORDEN
Cecorrer el subarbol izquierdo en inorden.
%"aminar la raz.
Cecorrer el subarbol derecho en inorden.
4. PREORDEN
%"aminar la raz.
Cecorrer el subarbol izquierdo en preorden.
recorrer el subarbol derecho en preorden.
6. POSTORDEN
Cecorrer el subarbol izquierdo en postorden.
Cecorrer el subarbol derecho en postorden.
%"aminar la raz.
, continuaci&n se muestra un ejemplo de los diferentes recorridos en un rbol binario.
Inorden; N1O+%;,CYZ<
Preorden; ,O1N%+;C<YZ
Postorden; N1+;%OZY<C,
R$"ORRI-O $N +N AR4OL 4INARIO
.tra operaci&n com/n es recorrer un rbol binario5 esto es, pasar a travs del rbol,
enumerando cada uno de sus nodos una vez. Euiz solo se desee imprimir los
contenidos de cada nodo al enumerarlos, o procesar los nodos en otra forma. %n
cualquier caso, se habla de visitar cada nodo al enumerar ste.
%l orden en que se visitan los nodos de una lista lineal es, de manera clara, del primero
al /ltimo. 'in embargo, no ha0 tal orden lineal (natural( para los nodos de un rbol.
,s, se usan diferentes ordenamientos para el recorrido en diferentes casos. %nseguida
se definen tres de estos mtodos de recorrido. %n cada uno de ellos, no ha0 que hacer
nada para recorrer un rbol binario vaco. :odos los mtodos se definen en forma
recursiva, de manera que el recorrido de un rbol binario implica la visita de la raz 0
el recorrido de sus subrboles izquierdo 0 derecho. #a /nica diferencia entre los
mtodos es el orden en que se ejecutan esas tres operaciones.
Para recorrer un rbol binario lleno en preorden )conocido tambin como orden con
prioridad a la profundidad o depthHfirst order*, se ejecuta de la siguientes tres
operaciones!
3. Lisitar la raz.
4. Cecorrer el subrbol izquierdo en preorden.
6. Cecorrer el subrbol derecho en preorden.
Para recorrer un rbol binario lleno en orden )u orden simtrico*
3. Cecorrer el subrbol izquierdo en orden.
4. Lisitar la raz.
6. Cecorrer el subrbol derecho en orden.
Para recorrer un rbol binario lleno en postorden!
3. Cecorrer el subrbol izquierdo en postorden.
4. Cecorrer el subrbol derecho en postorden.
6. Lisitar la raz.
%s posible implantar el recorrido de rboles binarios en C por medio de rutinas
recursivas que reflejen las definiciones de recorrido. #as tres rutinas en C! pretav,
intrav 0 posttrav, imprimen los contenidos de un rbol binario en preorden, orden 0
postorden, respectivamente. %l parmetro de cada rutina es un apuntador al nodo raz
de un rbol binario. 'e usa la representaci&n dinmica de los nodos para un rbol
binario!
K%eta8(t%ee)
NOOEKTR t%ee-
{
if (t%ee G= NPLL) {
$%intf(QR&3nQ' t%ee - >inf)- 3) 8isitan& la %aN; )3
$%et%a8(t%ee - > left)- 3) %ec%%ien& el
su>L%>l i;quie%& )3
$%et%a8(t%ee - > %ig5t)- 3) %ec%%ien& el su>L%>l
&e%ec5 )3
* 3) fin &el if )3
* 3) fin &e $et%a8)3
int%a8(t%ee)
NOOEKTR t%ee-
{
if (t%ee G= NPLL) {
int%a8(t%ee - > left)- 3) %ec%%ien& el
su>L%>l i;quie%& )3
$%intf(QR&3nQ' t%ee - >inf)- 3) 8isitan& la %aN; )3
int%a8(t%ee - > %ig5t)- 3) %ec%%ien& el su>L%>l
&e%ec5 )3
* 3) fin &el if )3
* 3) fin &e int%a8)3
$stt%a8(t%ee)
NOOEKTR t%ee-
{
if (t%ee G= NPLL) {
$stt%a8(t%ee - > left)- 3) %ec%%ien& el
su>L%>l i;quie%& )3
$stt%a8(t%ee - > %ig5t)- 3) %ec%%ien& el
su>L%>l &e%ec5 )3
$%intf(QR&3nQ' t%ee - >inf)- 3) 8isitan& la %aN; )3
* 3) fin &el if )3
* 3) fin &e $stt%a8)3
Por supuesto, las rutinas pueden escribirse de manera no recursiva para ejecutar la
inserci&n o eliminaci&n necesarias de manera e"plcita. Por ejemplo, la siguiente
rutina no recursiva para recorrer un rbol binario en orden!
9&efine SAT<TA7. 0##
int%a81(t%ee)
NOOEKTR t%ee-
{
st%uct stac! {
int t$-
NOOEKTR ite6@ SAT<TA7. A-
* s-
NOOEKTR $-
s,t$ = -0-
$ = t%ee-
& {
3) &escen&e% $% las %a6as i;quie%&as tant c6 sea
$si>le' )3
3) gua%&an& ls a$unta&%es a ls n&s
en el ca6in )3
45ile ($ G= NPLL ) {
$us5 (s' $)-
$ = $ - > left-
* 3) fin &el 45ile )3
3) 8e%ifica% si se te%6inM )3
if (Ge6$t"(s) ) {
3) en este $unt el su>L%>l i;quie%& estL 8acN )3
$ = ( $$(s) )-
$%intf(QR&3nQ' $ - >inf)- 3) 8isitan& la %aN; )3
$ = $ - >%ig5t- 3) %ec%%ien& el su>L%>l
&e%ec5 )3
* 3) fin &el if )3
* 45ile (Ge6$t"(s) II $ G= NPLL )-
* 3) fin &el int%a81 )3
,.'., -alanceo.
AR4OL$& 4ALAN"$A-O&

1efinamos primero de manera ms precisa la notaci&n de un rbol (balanceado(. #a
altura de un rbol binario es el nivel m"imo de sus hojas )tambin se conoce a veces
como la profundidad del rbol *. Por conveniencia, la altura del rbol nulo se define
como [3. Bn rbol binario balanceado )a veces llamado rbol ,L#* %s un rbol
binario en el cual las alturas de los subrboles de todo nodo difieren a los sumo en 3.
%l balance de un nodo en un rbol binario se define como la altura de su subrbol
izquierdo menos la altura de su sibrbol derecho. Cada nodo de un rbol binario
balanceado tiene balance igual a 3, H3 o J , dependiendo de si la altura de sus sibrbol
izquierdo es ma0or que, menor que o igual a la altura de su subrbol derecho.
Para que el rbol se mantenga balanceado es necesario realizar una transformaci&n en
el mismo de manera que!
3. %l recorrido en orden del rbol transformado sea el mismo que para el rbol
original )es decir, que el rbol transformado siga siendo un rbol de b/squeda
binaria*
4. %l rbol transformado est balanceado.
6. Bn algoritmo para implantar una rotaci&n izquierda de un subrbol con raz en p
es el siguiente!
q= %ig5t ($)-
5l& = left (q)-
left (q) = $-

Unidad +. rdenacin interna.
+.! Algoritmos de rdenamiento por .ntercambio.
Introduccin&
,l ordenamiento es una labor com0n que reali%amos continuamente. '-ero te has preguntado qu es
ordenar+ '.o+ ,s que es algo tan corriente en nuestras vidas que no nos detenemos a pensar en ello.
$rdenar es simplemente colocar informacin de una manera especial basndonos en un criterio de
ordenamiento.
,n la computacin el ordenamiento de datos tambin cumple un rol muy importante, ya sea como un fin en
s o como parte de otros procedimientos ms comple!os. 1e han desarrollado muchas tcnicas en este
mbito, cada una con caractersticas especficas, y con venta!as y desventa!as sobre las dems. Aqu voy
a mostrarte algunas de las ms comunes, tratando de hacerlo de una manera sencilla y comprensible.
+.!.1 -urbuja.
'escripcin&
,ste es el algoritmo ms sencillo probablemente. Edeal para empe%ar. Consiste en ciclar repetidamente a
travs de la lista, comparando elementos adyacentes de dos en dos. 1i un elemento es mayor que el que
est en la siguiente posicin se intercambian. '1encillo no+
Pseudocdi"o en C&
(abla de variables
Nom(re $ipo )so
lista Cualquiera Lista a ordenar
(A* Constante entera (ama/o de la lista
i ,ntero Contador
! ,ntero Contador
temp ,l mismo que los elementos de la lista -ara reali%ar los intercambios

2. for "i92; iD(A*; iLL#
3. for !9: ; !D(A* G 2; !LL#
?. if "listaR!S 4 listaR!L2S#
@. temp 9 listaR!S;
=. listaR!S 9 listaR!L2S;
A. listaR!L2S 9 temp;

)n ejemplo
Uamos a ver un e!emplo. ,sta es nuestra lista&
@ G ? G = G 3 G 2
(enemos = elementos. ,s decir, (A* toma el valor =. Comen%amos comparando el primero con el
segundo elemento. @ es mayor que ?, as que intercambiamos. Ahora tenemos&
# G * G = G 3 G 2
Ahora comparamos el segundo con el tercero& @ es menor que =, as que no hacemos nada. Continuamos
con el tercero y el cuarto& = es mayor que 3. Entercambiamos y obtenemos&
? G @ G G + G 2
Comparamos el cuarto y el quinto& = es mayor que 2. Entercambiamos nuevamente&
? G @ G 3 G 1 G +
Vepitiendo este proceso vamos obteniendo los siguientes resultados&
? G 3 G 2 G @ G =
3 G 2 G ? G @ G =
2 G 3 G ? G @ G =
Optimi,ando&
1e pueden reali%ar algunos cambios en este algoritmo que pueden me!orar su rendimiento.
1i observas bien, te dars cuenta que en cada pasada a travs de la lista un elemento va
quedando en su posicin final. 1i no te queda claro mira el e!emplo de arriba. ,n la primera pasada
el = "elemento mayor# qued en la 0ltima posicin, en la segunda el @ "el segundo mayor
elemento# qued en la pen0ltima posicin. -odemos evitar hacer comparaciones innecesarias si
disminuimos el n0mero de stas en cada pasada. (an slo hay que cambiar el ciclo interno de esta
manera&
for "!9:; !D(A* G i; !LL#
-uede ser que los datos queden ordenados antes de completar el ciclo externo. -odemos
modificar el algoritmo para que verifique si se han reali%ado intercambios. 1i no se han hecho
entonces terminamos con la e!ecucin, pues eso significa que los datos ya estn ordenados. (e
de!o como tarea que modifiques el algoritmo para hacer esto -.).
$tra forma es ir guardando la 0ltima posicin en que se hi%o un intercambio, y en la siguiente
pasada slo comparar hasta antes de esa posicin.
/nlisis del al"oritmo&
Wste es el anlisis para la versin no optimi%ada del algoritmo&
,stabilidad & ,ste algoritmo nunca intercambia registros con claves iguales. -or lo tanto es estable.
Vequerimientos de *emoria & ,ste algoritmo slo requiere de una variable adicional para reali%ar
los intercambios.
(iempo de ,!ecucin & ,l ciclo interno se e!ecuta n veces para una lista de n elementos. ,l ciclo
externo tambin se e!ecuta n veces. ,s decir, la comple!idad es n N n 9 $"n

#. ,l comportamiento
del caso promedio depende del orden de entrada de los datos, pero es slo un poco me!or que el
del peor caso, y sigue siendo $"n

#.
0entajas-
Kcil implementacin.
.o requiere memoria adicional.
'es1entajas-
*uy lento.
Veali%a numerosas comparaciones.
Veali%a numerosos intercambios.
,ste algoritmo es uno de los ms pobres en rendimiento. 1i miras la demostracin te dars cuenta de ello.
.o es recomendable usarlo. (an slo est aqu para que lo cono%cas, y porque su sencille% lo hace bueno
para empe%ar. Xa veremos otros mucho me!ores. Ahora te recomiendo que hagas un programa y lo
pruebes. 1i tienes dudas mira el programa de e!emplo.
Mtodo de la "Burbuja"
'in duda este mtodo es un mtodo (clsico( por ponerle un nombre, 0a que es uno de los mas
bsicos en lo que a ordenaciones se refiere, aunque no es el mas eficiente por su tiempo de
ejecuci&n, si es uno de los mas fciles de programar en cualquier lenguaje de programaci&n.
'u funcionamiento se basa principalmente en comparar la primera posici&n del arreglo con la
siguiente superior del mismo, 0 si es ma0or )orden ascendente*, se intercambian lugares 0 se
prosigue con la siguiente posici&n, hasta terminar con la longitud del arreglo. :odo esto tiene su
objetivo 0 que a travs de la primera pasada o recorrido sobre el vector nos aseguramos que el
valor ma0or de los datos contenidos en el arreglo se coloqu en la ultima posici&n del mismo.
1espus de la primer pasada se sigue iterando hasta el grado de quedar ordenado todo el arreglo.
Seguimiento Logico
Analisis
Tiempo:
%l tiempo de programaci&n en base a la escala de la cual se hizo menci&n en la introducci&n es
mu0 tardado, por que visita todas las posiciones del vector 0 compara todas contra todas lo que
hace de este mtodo un mtodo mu0 lento, podemos darle un tiempo de programaci&n de! D
unidades de tiempo3
Costo:
%n lo que respecta al costo, al ser un programa no mu0 difcil en programar el costo tambin es
proporcional al tiempo de ejecuci&n 9 programaci&n, por lo tanto le asigno! > unidades de costo3
Espacio:
%s espacio en disco fsico de disco que requiere este mtodo es de! 3 Zb.
BURBUJA
Funcion principal Programa
void burbuja)void*
\
Fhile ))sigue* MM )vueltas G? nH3**
\
sigue?J5
for )d?35 d G? nHvueltas5 dII* 99num de comp. por vuelta
\
if)a@dA Q a@dI3A*
\
temp?a@dA5
a@dA?a@dI3A5
a@dI3A?temp5
icII5
sigue ? 35
]
compII5
]
vueltasII5
]
]
+.!.2 /uic0sort.
,sta es probablemente la tcnica ms rpida conocida. Kue desarrollada por C.A.V. Ooare en 2>A:. ,l
algoritmo original es recursivo, pero se utili%an versiones iterativas para me!orar su rendimiento "los
algoritmos recursivos son en general ms lentos que los iterativos, y consumen ms recursos#. ,l algoritmo
fundamental es el siguiente&
,liges un elemento de la lista. -uede ser cualquiera. Lo llamaremos elemento de di1isin.
Fuscas la posicin que le corresponde en la lista ordenada "explicado ms aba!o#.
Acomodas los elementos de la lista a cada lado del elemento de divisin, de manera que a un lado
queden todos los menores que l y al otro los mayores "explicado ms aba!o tambin#. ,n este
momento el elemento de divisin separa la lista en dos sublistas "de ah su nombre#.
Veali%as esto de forma recursiva para cada sublista mientras stas tengan un largo mayor que 2.
Tna ve% terminado este proceso todos los elementos estarn ordenados.
Tna idea preliminar para ubicar el elemento de divisin en su posicin final sera contar la cantidad de
elementos menores y colocarlo un lugar ms arriba. -ero luego habra que mover todos estos elementos a
la i%quierda del elemento, para que se cumpla la condicin y pueda aplicarse la recursividad.
Veflexionando un poco ms se obtiene un procedimiento mucho ms efectivo. 1e utili%an dos ndices& i, al
que llamaremos contador por la i%quierda, y !, al que llamaremos contador por la derecha. ,l algoritmo es
ste&
Vecorres la lista simultneamente con i y !& por la i%quierda con i "desde el primer elemento#, y por
la derecha con ! "desde el 0ltimo elemento#.
Cuando listaRiS sea mayor que el elemento de divisin y listaR!S sea menor los intercambias.
Vepites esto hasta que se crucen los ndices.
,l punto en que se cru%an los ndices es la posicin adecuada para colocar el elemento de
divisin, porque sabemos que a un lado los elementos son todos menores y al otro son todos
mayores "o habran sido intercambiados#.
Al finali%ar este procedimiento el elemento de divisin queda en una posicin en que todos los elementos a
su i%quierda son menores que l, y los que estn a su derecha son mayores.
Pseudocdi"o en C&
(abla de variables
Nom(re $ipo )so
lista Cualquiera Lista a ordenar
inf ,ntero ,lemento inferior de la lista
sup ,ntero ,lemento superior de la lista
elemHdiv ,l mismo que los elementos de la lista ,l elemento divisor
temp ,l mismo que los elementos de la lista -ara reali%ar los intercambios
i ,ntero Contador por la i%quierda
! ,ntero Contador por la derecha
cont ,ntero ,l ciclo continua mientras cont tenga el valor 2

.ombre -rocedimiento& $rdVap
-armetros&
lista a ordenar "lista#
ndice inferior "inf#
ndice superior "sup#

)) Eniciali%acin de variables
2. elemHdiv 9 listaRsupS;
3. i 9 inf G 2;
?. ! 9 sup;
@. cont 9 2;

)) Uerificamos que no se crucen los lmites
=. if "inf 49 sup#
A. retornar;

)) Clasificamos la sublista
Y. <hile "cont#
B. <hile "listaRLLiS D elemHdiv#;
>. <hile "listaRGG!S 4 elemHdiv#;
2:. if "i D !#
22. temp 9 listaRiS;
23. listaRiS 9 listaR!S;
2?. listaR!S 9 temp;
2@. else
2=. cont 9 :;

)) Copiamos el elemento de divisin
)) en su posicin final
2A. temp 9 listaRiS;
2Y. listaRiS 9 listaRsupS;
2B. listaRsupS 9 temp;

)) Aplicamos el procedimiento
)) recursivamente a cada sublista
2>. $rdVap "lista, inf, i G 2#;
3:. $rdVap "lista, i L 2, sup#;

.ota&
La primera llamada debera ser con la lista, cero ":# y el tama/o de la lista menos 2 como
parmetros.
)n ejemplo
,sta ve% voy a cambiar de lista ;GI
= G ? G Y G A G 3 G 2 G @
Comen%amos con la lista completa. ,l elemento divisor ser el @&
= G ? G Y G A G 3 G 2 G *
Comparamos con el = por la i%quierda y el 2 por la derecha.
+ G ? G Y G A G 3 G 1 G *
= es mayor que cuatro y 2 es menor. Entercambiamos&
1 G ? G Y G A G 3 G + G *
Avan%amos por la i%quierda y la derecha&
2 G # G Y G A G G = G *
? es menor que @& avan%amos por la i%quierda. 3 es menor que @& nos mantenemos ah.
2 G ? G 2 G A G G = G *
Y es mayor que @ y 3 es menor& intercambiamos.
2 G ? G G A G 2 G = G *
Avan%amos por ambos lados&
2 G ? G 3 G 3 G Y G = G *
,n este momento termina el ciclo principal, porque los ndices se cru%aron. Ahora intercambiamos listaRiS
con listaRsupS "pasos 2AG2B#&
2 G ? G 3 G * G Y G = G 3
Aplicamos recursivamente a la sublista de la i%quierda "ndices : G 3#. (enemos lo siguiente&
1 G # G
2 es menor que 3& avan%amos por la i%quierda. ? es mayor& avan%amos por la derecha. Como se
intercambiaron los ndices termina el ciclo. 1e intercambia listaRiS con listaRsupS&
2 G G #
Al llamar recursivamente para cada nueva sublista "listaR:SGlistaR:S y listaR3SGlistaR3S# se retorna sin hacer
cambios "condicin =.#.-ara resumir te muestro cmo va quedando la lista&
1egunda sublista& listaR@SGlistaRAS
2 G + G 3
+ G 2 G 3
= G 3 G 2
-ara cada nueva sublista se retorna sin hacer cambios "se cru%an los ndices#.
Kinalmente, al retornar de la primera llamada se tiene el arreglo ordenado&
2 G 3 G ? G @ G = G A G Y
Optimi,ando&
1lo voy a mencionar algunas optimi%aciones que pueden me!orar bastante el rendimiento de quicJsort&
Oacer una versin iterativa& -ara ello se utili%a una pila en que se van guardando los lmites
superior e inferior de cada sublista.
.o clasificar todas las sublistas& Cuando el largo de las sublistas va disminuyendo, el proceso se
va encareciendo. -ara solucionarlo slo se clasifican las listas que tengan un largo menor que n.
Al terminar la clasificacin se llama a otro algoritmo de ordenamiento que termine la labor. ,l
indicado es uno que se comporte bien con listas casi ordenadas, como el ordenamiento por
insercin por e!emplo. La eleccin de n depende de varios factores, pero un valor entre 2: y 3= es
adecuado.
,leccin del elemento de divisin& 1e elige desde un con!unto de tres elementos& listaRinferiorS,
listaRmitadS y listaRsuperiorS. ,l elemento elegido es el que tenga el valor medio seg0n el criterio de
comparacin. ,sto evita el comportamiento degenerado cuando la lista est prcticamente
ordenada.
/nlisis del al"oritmo&
,stabilidad & .o es estable.
Vequerimientos de *emoria & .o requiere memoria adicional en su forma recursiva. ,n su forma
iterativa la necesita para la pila.
(iempo de ,!ecucin &
Caso promedio. La comple!idad para dividir una lista de n es $"n#. Cada sublista genera
en promedio dos sublistas ms de largo n)3. -or lo tanto la comple!idad se define en forma
recurrente como&
f"2# 9 2
f"n# 9 n L 3 f"n)3#
La forma cerrada de esta expresin es&
f"n# 9 n log3n
,s decir, la comple!idad es O(n lo"n).
,l peor caso ocurre cuando la lista ya est ordenada, porque cada llamada genera slo
una sublista "todos los elementos son menores que el elemento de divisin#. ,n este caso
el rendimiento se degrada a $"n
3
#. Con las optimi%aciones mencionadas arriba puede
evitarse este comportamiento.
0entajas-
*uy rpido
.o requiere memoria adicional.
'es1entajas-
Emplementacin un poco ms complicada.
Vecursividad "utili%a muchos recursos#.
*ucha diferencia entre el peor y el me!or caso.
La mayora de los problemas de rendimiento se pueden solucionar con las optimi%aciones mencionadas
arriba "al costo de complicar mucho ms la implementacin#. ,ste es un algoritmo que puedes utili%ar en la
vida real. ,s muy eficiente. ,n general ser la me!or opcin. Ententa programarlo. *ira el cdigo si tienes
dudas.
Mtodo Quick Sort
%s el mtodo sin duda de los ms rpidos, pero tiene a su vez 6 variantes de l mismo las cuales son!
Pivote en la posicion ;nicio
Pivote en la posicion <inal
Pivote en la posicion diferente de ;nicio [ <inal
%ste mtodo es igual en sus tres vertientes, lo /nico que difiere uno de otro es en el momento de saber
donde deben iniciar las comparaciones, 0a que como sus respectivos nombres lo dicen son en diferentes
posiciones. 'eg/n sea el que se utiliza donde se encuentre el pivote, se compara con el e"tremo si es
ma0or No ha0 cambio )para ordenaci&n ascendente*, en caso contrario si lo ha05 0 ese elemento ahora se
convierte en pivote 0 se compara con todas las dems posiciones del vector de manera que va avanzando 0
dejando al final el elemento ma0or.
%l pivote cambia seg/n sea la posici&n actual en la que se encuentra si los elementos son ma0ores o
menores, de esta manera se compara de un lado con el e"tremo, se regresa el pivote 0 se analiza el otro
lado hasta su e"tremo. Como se indica en la fig. sig.
Seguimiento Lgico
Analisis
Tiempo:
%ste mtodo como se comentaba al inicio de la e"plicaci&n es una de los mas rpidos por su
anlisis, aunque no se pueda decir lo mismo de su programaci&n, por lo cual, le asignaremos! E
unidades de tiempo de tardanza en ejecuci&n.
Costo:
%l costo que le asignaremos a este mtodo es de F unidades de costo por que su implementaci&n
en alg/n lenguaje de programaci&n es algo tedioso por que son tres variantes 0 las tres se tendran
que programar.
Espacio:
%# espacio que ocupa en disco es de! GH0
QUICK SORT
Funcin Principal del programa
void quic2 sort)int top, int fin, int pos*
\
int stac2min@6JA, stac2ma"@6JA, ini5
stac2min@topA ? top5
stac2ma"@topA ? fin5
Fhile )top Q J*
\
ini ? stac2min@topA5
fin ? stac2ma"@topA5
topHH5
pos ? ))fin H ini*94* I 35
reduceint)Mini,Mfin,Mpos*5
if )ini G posH3*
\
topII5
stac2min@topA ? ini5
stac2ma"@topA ? posH35
]
if )fin Q posI3*
\
topII5
stac2min@topA ? posI35
stac2ma"@topA ? fin5
]
]
]
+.!.! S1ellSort.
Mtodo Shell
%l mtodo 'hell, creado por 1onald 'hell, de ah su nombre, es un mtodo mas eficiente en
comparaci&n con su antecesor el de burbuja, porque utiliza casi la mitad del tiempo requerido
para realizar la ordenaci&n de datos contenidos en un vector.
%l mecanismo de funcionamiento del mtodo shell, es partir el total de elemento )n*, entre dos
para evaluar el vector en dos partes. 1espus de esta divisi&n se toma el primer elemento de la
primera parte 0 se compara con la posici&n del resultado de la divisi&n inicial mas una posici&n,
avanzando de uno en uno hasta llegar al final5 si se realiza alg/n movimiento entre las
comparaciones se vuelve a iniciar las comparaciones con saltos de la misma longitud anterior, en
caso contrario se vuelve a dividir el salto actual entre dos 0 se sigue el mismo procedimiento,
hasta que los saltos sean de una posici&n 0 es as cuando llegamos a la utilizaci&n del mtodo de
la burbuja. 1e ah que es mas rpido este mtodo por que divide el vector 0 no es tan rpido
como se quisiera 0a que recurre a la burbuja para ordenar al final, 0 0a que el tiempo no es una de
las ventajas de la burbuja pues en la rapidez afecta al mtodo shell, pero en la que a eficiencia se
refiere si supera el shell al mtodo de la burbuja.
Seguimiento Lgico
Anlisis
Tiempo:
%l tiempo de programaci&n es un poco ms elevado, 0 el tiempo de ejecuci&n es menos que el
anterior pero aun as es tardado. %"isten dos vertientes de este mtodo, el normal 0 el
personalizado 0 podemos darle un tiempo de programaci&n 0 ejecuci&n de! I3J unidades de
tiempo3
Costo:
%n lo que respecta al costo, al ser un programa un poco mas elevado que el anterior el costo
tambin es proporcional al tiempo de ejecuci&n 9 programaci&n, por lo tanto le asigno! K3J
unidades de costo3
Espacio:
%s espacio en disco fsico de disco que requiere este mtodo es de! G H03
METODO SHE

Funcin Principal del programa
void shell)int inter*
\
int band, i, au"5
int j,25
99 inter ? n945
Fhile )interQJ*
\
for)i ? interI35 i G? n5 iII*
\
j?iHinter5
Fhile)jQ?3*
\
2?jIinter5
if)a@jAG?a@2A*
\
j?35
]
else
\
au"?a@jA5
a@jA?a@2A5
a@2A?au"5
icII5
]
compII5
j?jHinter5
]
]
inter?inter945
]
]
+.' Algoritmos de ordenamiento por Distribucin.
$rincipios de distribucin
Cuando los datos tienen ciertas caracteristicas como por ejemplo estar dentro de
determinado rango * no (a,er elementos repetidos/ pueden aprovec(arse estas
caracteristicas para colocar un elemento en su lugar/ por ejemplo<
rigen
2 1 2 3 4 5 ? I " J
I 1 3 2 4 2 ? 5 " J
Destino

2 2
1 1
2 2
3 3
4 4
5 5
? ?
I I
" "
J J
K continuacin se presenta el cdigo para cam,iar los valores del @rigen al Hestino<
for6int &:2C &B12C&997
destinoLorigenL&MM:origenL&MC
C/ue 1acer cuando se repitan los datosD
+o %ue de,emos (acer es incrementar la capacidad de la urna. 5ara lograrlo podemos
(acer lo siguiente<
1.E Hefinir un arreglo en el %ue cada posicin puede ser ocupada por mas de un registro
6un arreglo de arreglo de registros7 puede darse la situacin de ser insuficiente la
cantidad de registros adicionales o de e&istir demadiado desperdicio de memoria.
2.E Hefinir el tama!o de la urna varia,le a trav-s del uso de estructuras como las listas
simples enla.adas.

Urna simple
struct nodo
D
NNNNNNN infoC
struct nodo 3sigC
E
nodo 3nuevo/ 3iniL12M/ 3finL12MC
int i/pC
void main67
D
for6i:2CiB12<i997
iniLiM:finLiM:8G++C
for6i:2CiBnOi997
D
nuevo:neP nodoC
nuevo=>info:KLiMC
nuevo=> sig:8G++C
if6iniLKLiMM::8G++7
ini:fin:nuevoC
else
D
fin=>sig:nuevoC
fin:nuevoC
E
for6i:2/p:2C iB12Ci997
D
nuevo:iniLiMC
P(ile6nuevo7
D
KLpM:nuevo=>infoC
p99C
iniLiM:nuevo=>sigC
delete nuevoC
nuevo:iniC
E
E
E
C/ue 1acer cuando el rango de los )alores 6ue 6ueremos ordenar es de 1BB a
AAAD
Kplicar urnas simples tantas veces como dig0tos tenga el ma*or de los n$meros a
ordenar. 5ara la ordenacin se (ar de la siguiente manera< )n la primera pasada se
tomar en consideracin el dig0to menos significativo 6unidades7/ en la siguiente vuelta
se tomar el siguiente dig0to (asta terminar 6Hecenas/
Centena/ ...7.
void main67
D
for6cont:1C contB:vecesC cont997
D
for 6*:2C iBnC *997
D
np:KLiMQ 6i312
cont
7C
np:npF613 12
cont = 1
7C
urnasNsimples67C
E
E
E
Mtodo de Distribucin simple o Dispersin
%l mtodo que ahora analizremos, es mu0 sencillo en su descripci&n, por que lo que hace es
crear categoras de n/meros para que seg/n su categora se acomoden en funci&n de su cifra mas
significativa, 0 si en cada categora e"isten mas de un elemento, se crea una lista ligada que en su
parte inicial todas apuntaran a NB##, para que al ir visitando las categoras, a su vez se visitara
cada nodo que contenga las lista que se irn insertando de manera ordenada, de esta manera se
ordena el vector.
%n lo referente a su programaci&n, tampoco es mu0 difcil, aunque si lo ser si aun no se tiene
bien clara la implementaci&n de una lista.
Seguimiento lgico
'e desea ordenar el siguiente vector!
Funcion principal del programa
Anlisis
Tiempo:
%l tiempo de ejecuci&n para este programa es mu0 bueno 0 rpido por lo que se le puede asignar!
F unidades de tiempo.
Costo:
%l costo si es un buen punto, por que se pude alzar el precio pero no por que sea difcil la
programaci&n del mtodo si no por la deficiencia en el aprendizaje del manejo de listas, por que
si tomamos en cuenta que las listas estn mas que aprendidas damos en valor de E unidades de
costo3
Espacio:
%n cuesti&n de espacio se siguen manejando el mismo para todos los mtodos! G H0.
M!TODO DE DISTRIBUCI"# SIM$E O
DIS$ERSI"#

st%&ct no'o (
int 'ato)
st%&ct no'o *ap&nta'o%)
+)
main,-
(
no'o *./#U)0*ap&nta'o% tipo no'o *0
cl%sc%,-)
00 p%int1,23p4n25.-)0*imp%ime el ap&nta'o% con 'i%eccion a n&ll*0
./ne6,no'o-)0*ap&nta'o% ap&nta al no'o se asi7na memo%ia*0
00 p%int1,23p4n25.-)0*imp%ime la 'i%eccion 'el no'o*0
i1,.- ( 0*8e%i1ca si 1&e asi7na'a la 'i%eccion 'e memo%ia*0
.9:'ato/;)0*se le asi7na el 8alo% al campo 'e la est%&ct&%a 'ato*0
.9:ap&nta'o%/#U)0*asi7na n&ll al ap&nta'o% 'e <*0
+
else
co&t==2no >a? memo%ia 'isponi@le2)
00ciclo A&e pi'e B; no'os a la memo%ia
no'o *a&.5*n&e8o)00se &tiliCan estas 8a%ia@le pa%a no pe%'e% el inicio 'e la lista
a&./.)
1o%,int i/B)i=/B;)iDD- (
n&e8o/ne6,no'o-)
00 p%int1,23p4n25n&e8o-)
i1,n&e8o- (
n&e8o9:'ato/i)
n&e8o9:ap&nta'o%/#U)
a&.9:ap&nta'o%/n&e8o)
a&./n&e8o)
+
else (
co&t==2no >a? memo%ia 'isponi@le2)
i/BB)
+)
+)
a&./.)
6>ile,a&.E/#U-
(
co&t ==a&.9:'ato==24n2)
a&./a&.9:ap&nta'o%)
+
7etc>,-)
%et&%n ;)
+


0*OTRO $ROFRAMA ESTE SE AMA DIGUSIO#*0
8oi' o%'ena%Hpo%H'i1&sion,int entIJ5 int a5 int @5 int salIJ-)
8oi' most%a%H8ecto%,int entIJ5int K-)
8oi' meCcla%H8ecto%es,int entBIJ5 int entLIJ5 int nB5 int nL5
int salIJ-)
int compa%aciones / ;)
main,-
(
int 8ecto%HentIL;J / (M5 N5 O5 P5 Q5 R5 S5 ;5 L+)
int n / R)
int 8ecto%HsalIL;J)
p%int1,2Tecto% no o%'ena'o /: 2-)
most%a%H8ecto%,8ecto%Hent5n-)
o%'ena%Hpo%H'i1&sion,8ecto%Hent5;5n9B58ecto%Hsal-)
p%int1,2Tecto% o%'ena'o /: 2-)
most%a%H8ecto%,8ecto%Hsal5n-)
p%int1,24nEl n&me%o 'e compa%aciones es 3'25compa%aciones-)
+
8oi' most%a%H8ecto%,int entIJ5 int K-
(
int i)
1o%,i / ;) i = K) iDD-
p%int1,23Q'25entIiJ-)
p%int1,24n2-)
+
8oi' o%'ena%Hpo%H'i1&sion,int entIJ5 int a5 int @5 int salIJ-
(
int m)
int salBIL;J5 salLIL;J)
0* Comp%o@a% si el 8ecto% contiene solo &n elemento *0
i1,a // @-
salI;J / entIaJ) 0* De8&el8e el Unico elemento *0
else
0* Comp%o@a% si el 8ecto% contiene 'os elementos. *0
i1,B // ,@ 9 a--
(
i1,entIaJ =/ entI@J- 0* #o inte%cam@ia% los elementos. *0
(
salI;J / entIaJ)
salIBJ / entI@J)
+
else 0* Inte%cam@ia% los elementos. *0
(
salI;J / entI@J)
salIBJ / entIaJ)
+
compa%acionesDD)
+
else
(
0* Di8i'i% el 8ecto% 'e t%es o mas elementos. *0
m / a D ,@ 9 a-0L) 0* Clc&lo 'e la mita' *0
o%'ena%Hpo%H'i1&sion,ent5a5m5salB-) 0* O%'ena% p%ime%a mita' *0
o%'ena%Hpo%H'i1&sion,ent5mDB5@5salL-)0* O%'ena% se7&n'a mita' *0
0* MeCcla% las 'os mita'es. *0
meCcla%H8ecto%es,salB5salL5BDm9a5@9m5sal-)
+
+
8oi' meCcla%H8ecto%es,int entBIJ5 int entLIJ5 int nB5 int nL5 int salIJ-
(
int i / ;5V / ;5K / ;)
6>ile,,i = nB- WW ,V = nL--
(
0* Comp%o@a% si el p%ime% elemento 'el 8ecto% es
el ms peA&eXo *0
i1,entBIiJ =/ entLIVJ-
(
salIKJ / entBIiJ)
iDD) 0* Act&aliCa% el Yn'ice *0
+
else 0* El se7&n'o elemento es ms peA&eXo. *0
(
salIKJ / entLIVJ)
VDD) 0* Act&aliCa% el Yn'ice. *0
+
KDD) 0* Act&aliCa% el Yn'ice 'e sali'a. *0
compa%acionesDD)
+
0* Comp%o@a% si >a? elementos a la iCA&ie%'a
en el p%ime% 8ecto%. *0
i1,i E/ nB-
(
'o 0* Esc%i@i% los elementos %estantes 'e entB
al 8ecto% 'e sali'a. *0
(
salIKJ / entBIiJ)
iDD)
KDD)
+ 6>ile,i = nB-)
+
else 0* Esc%i@i% los elementos %estantes 'e entL
al 8ecto% 'e sali'a. *0
(
'o
(
salIKJ / entLIVJ)
VDD)
KDD)
+ 6>ile,V = nL-)
+
+
+.'.1 (adi2.
)ste m-todo se emplea para organi.ar informacin por mas de un criterio.
Ejemplo<
Criterio de orden
3 1 2
8om,re Carrera Calificacin
Kna ASC J2
#eatri. +A J2
Kni,al ASC J1
#eto +A J2
o,erto ASC J2
Kni,al ASC J1
Kna ASC J2
o,erto ASC J2
#eatri. +A J2
#eto +A J2
+o %ue (acemos es determinar la importancia de los criterios de ordenacin * aplicar
ordenacin esta,le tantas veces como criterios se tengan/ empe.ando por el criterio
menos importante * determinando por el criterio ms importante.
Mtodo Radix
%l mtodo Cadi" 'ort, no varia con respecto a su antecesor el mtodo de 1istribuci&n simple o
dispersi&n, lo que varia en este caso es que para el acomodo de datos, se utiliza la cifra menos
significativa 0 despus vuelve a caer a la distribuci&n simple, tomando la cifra mas significativa
por que en la primera pasada aun no esta ordenado el vector.
1e nueva cuenta se visitan todas las categoras de n/meros 0 si e"iste una lista de igual manera se
recorre, previamente que los datos insertados en esa lista este 0a ordenados. W se despliegan los
datos 0 quedan de forma ordenada, ascendentemente, si se desea hacer una ordenaci&n
descendente, solo basta con recorrer el vector de categoras de abajo hacia arriba.
Anlisis
Tiempo:
%l tiempo de programaci&n 0 de ejecuci&n es mu0 pobre 0a que tiene que hacer su funci&n como
mtodo 0 todava utiliza el distribuci&n simple para ordenar, lo que representa mas tardanza, por
lo que se asignamos J unidades de tiempo de ejecucin.
Costo:
%l costo que le podemos dar a este mtodo es mu0 bueno, por lo que E unidades de costo por la
programaci&n del mtodo serian buenos, aunque el costo es alto por que utiliza dos mtodos
innecesariamente.
Espacio:
Como los dems mtodos, utilizan GH0 de memorias en disco.
METODO RADI<


G&nciZn p%incipal 'el p%o7%ama
8oi' %a'i.so%t,int .IJ5 int n-
(
int 1%ontIB;J5 %ea%IB;J)
st%&ct (
int in1o)
int ne.t)
+ no'eIn&meltsJ)
int e.p5 1i%st5 i5 V5 K5 p5 A5 ?)
1o%,i/;) i=n9B) iDD- (no'eIiJ.in1o/.IiJ)
no'eIiJ.ne.t / iDB) +
no'eIn9BJ.in1o/.In9BJ)
no'eIn9BJ.ne.t / 9B)
1i%st / ;) 001i%st es la ca@eCa 'e la lista li7a'a
1o%,K/B) K=O) KDD- (
1o%,i/;) i=B;) iDD- (
%ea%IiJ / 9B)
1%ontIiJ / 9B) +
6>ile, 1i%st E/ 9B-
( p / 1i%st)
1i%st / no'eI1i%stJ.ne.t)
? / no'eIpJ.in1o)
e.p / po6,B;5 K9B-) 00ele8a% B; a la ,K9B-9esima potencia
V / ,?0e.p-3B;) 00inse%ta% ? en A&e&eIVJ
A / %ea%IVJ)
i1,A//9B-
1%ontIVJ / p)
else
no'eIAJ.ne.t / p)
%ea%IVJ / p)
+ 001in 'el 6>ile
1o%,V/;) V=B; WW 1%ontIVJ//9B) VDD-)
1i%st / 1%ontIVJ)
6>ile, V=/ R- ( 008e%i1ica% si se te%mino
1o%,i / VDB) i=B; WW 1%ontIiJ//9B) iDD-)
i1,i=/R- ( p / i)
no'eI%ea%IVJJ.ne.t / 1%ontIiJ)
+ 001in 'el i1
V / i)
+ 001in 'el 6>ile
no'eI%ea%IpJJ.ne.t / 9B)
+001in 'el 1o%
1o%,i/;) i=n) iDD- ( .IiJ/no'eI1i%stJ.in1o)
1i%st / no'eI1i%stJ.ne.t)
+ 001in 'el 1o%
+ 001in 'el %a'i. so%t
F%a1icas 'e Ren'imiento 'e los M[to'os
'e O%'enaciZn Inte%na
%n este apartado observamos, grficamente como se comporta cada mtodo con los dems, de
esta manera es mas visible 0 mas practico ver por cual decidirse. Lemos que en los primeros
criterios si ha0 diferencia entre mtodos, pero en lo que al espacio se refiere vemos que no ha0
variaci&n siempre la capacidad de cada mtodo es de 3Zb!
Unidad 3. rdenacin e2terna.
3.2 Algoritmos de ordenacin e2terna.
3.2.1.ntercalacin directa.
Mtodo de Mecla Directa
%s un mtodo mu0 interesante que permite obtener una ma0or velocidad en la ordenaci&n 0 en un
anlisis mu0 personal es un mtodo mu0 eficiente por que se basa en particiones 0 fusiones en
dos archivos )<4,<6*, 0 en un archivo desordenado )<3*.
Se toma el primer elemento de 15 y se almacena en el arc(ivo 16, se recorre
una posicin en 15 y el siguiente elemento se almacena en 17 de esta
manera obtenemos un arc(ivo 16 t 17 que contienen elemento de 15. Se
procede a (acer la primera particin de uno y la fusin de dos, lo que
significa que al (acer la particin de uno, se toma el elemento del arc(ivo 16
y el primer elemento del arc(ivo 17 y se comparan seg!n sea mayor o menor
se acomoda en el arc(ivo 15 .el original*, se sigue con la siguiente posicin
de uno (asta que se acaba. /ara la siguiente pasada se aumenta el doble la
particin y la fusin, por ejemplo, en la siguiente pasada la particin ser" de
6 y la fusin de 8, y se procede de la misma manera tomando el primer
elemento de la particin en 16 y el primer elemento de 17, el que resulte
menor se acomoda y despu$s el que resulta mayor tambi$n se pone en el
15.'stos pasos se realian de forma continua (asta terminar todas las
particiones. 'l final de seguir aumentando al doble las fusiones y las
particiones ser" en el momento que las fusiones e%cedan el numero de
elementos, entonces termina el proceso, y la ordenacin quedara en el
arc(ivo 15.
Anlisis
Tiempo:
%n cuesti&n de :iempo, es un mtodo mu0 rpido as que le asigno por su rapidez en ejecuci&n! 4
unidades de tiempo, lo que significa que usa mu0 poco tiempo para ordenar dos archivos de
registros.
Costo:
%l costo si se eleva por su funcionalidad 0 por su dificultad para programar ordenaciones en
archivos. Por lo que L unidades de costo son buenos.
Espacio:
%l espacio sigue de manera constante para todos los mtodos! GH0
Me1cla directa
H Combinaci&n de secuencias en una sola ordenada por selecci&n repetida de componentes
accesibles en cada momento.
H ,lgoritmo
3. 1ividir la secuencia a en dos mitades, b 0 c
4. $ezclar b 0 c combinando cada elemento en pares ordenados
6. #lamar a a la secuencia mezclada 0 repetir los pasos 3 0 4, combinando los pares ordenados en
cudruplos ordenados
7. Cepetir hasta que quede ordenada toda la secuencia.
<uente 77 88 34 74 ^7 3_ J` `a
'eparaci&n en 4 fuentes!
<uente 3 77 88 34 74
<uente 4 ^7 3_ J` `a
'e ordenan en pares ordenados
1estino 77 ^77 3_ 887 J` 347 74 `a
'eparaci&n en 4 fuentes!
<uente 3 77 ^77 3_ 88
<uente 4 J` 347 74 `a
'e ordenan los pares ordenados
se compara J` 0 77 se escribe J`5
se compara 77 0 34 se escribe 345
se escriben el 77 0 el ^7 sin comparaci&n porque se sabe que estn ordenados
1estino J` 34 77 ^77 3_ 74 88 `a
<uente 3 J` 34 77 ^7
<uente 4 3_ 74 88 `a
1estino J` 34 3_ 74 77 88 `a ^7
Terminologa
H Fase. .peraci&n que trata el conjunto completo de datos
H Pase o etapa. Proceso ms corto que repetido constitu0e el proceso de clasificaci&n.
H Bn pase consta de dos fases!
una de divisi&n
una de combinaci&n
H ,l acabar un pase se origina una cinta
H Mezcla de fases. %n cada pase 4 fases )divisi&n 0 combinaci&n*
H Mezcla de ! fase o "alanceada! %liminar la fase de divisi&n
Clasificaci&n por mezcla directa, con 4 arreglos
fuente destino
i # $ l
mezcla divisi&n
Fase %ombinada de mezcla&divisin
H #as dos secuencias destino estn representadas por los e'tremos de un s&lo arreglo
H 1espus de cada pase la fuente se convierte en destino 0 viceversa
(epresentacin de los datos ) algoritmo de mezcla
a: ARRAY 1..2*n OF Tipo_datos
i,j: ndices a elementos fuente
k,l: ndices a elementos destino
up
%l metodo de ordenacion por Mezcla Directa es posiblemente el mas utilizado por su facil
comprension.
#a idea central de este algoritmo consiste en la relacion sucesiva de una particion 0 una
fusion que produce secuencias ordenadas de longitud cada vez ma0or. %n la primera
pasada la particion es de longitud 3 0 la fusion o mezcla produce secuencias ordenadas de
longitud 4. %n la segunda pasada la particion es de longitud 4 0 la fusion o mezcla
produce secuencias ordenadas de longitud 7. %ste proceso se repite hasta que la longitud
de la secuencia para la particion sea ma0or o igual que el numero de elementos en el
archivo original.
'upongase que se desea ordenar las claves del archivo <. Para realizar tal actividad se
utilizan dos archivos au"iliares a los que se les denominara <3 0 <4.
< ! J^, a8, 37, `_, 4^, 3a, 63, 48, J7, J8, 36, 3_, a4, 7`, `3
Particion en secuencias de longitud 3.
<3 ! J^-,37-, 4^-, 63-, J7-, 36-, a4-, `3-
<4 ! a8-, `_-, 3a-, 48-, J8-, 3_-, 7`-
<usion en secuencias de longitud 4
<! J^, a8-, 37, `_-, 3a, 4^-, 48, 63-, J7, J8-, 36, 3_-, 7`, a4-, `3-
Particion en secuencias de longitud 4
<3 ! J^, a8-, 3a, 4^-, J7, J8-, 7`, a4-
<4 ! 37, `_-, 48, 63-, 36-, 3_-, `3-
<usion en secuencias de longitud 7
< ! J^, 37, `_, a8-, 3a, 48, 4^, 63-, J7, J8, 36, 3_-, 7`, `3, a4-
Particion en secuencias de logitud 7
<3 ! J^, 37, `_, a8-, J7, J8, 36, 3_-
<4 ! 3a, 48, 4^, 63-, 7`, `3, a4-
<usion en secuencias de longitud _
< ! J^, 37, 3a, 48, 4^, 63, `_, a8-, J7, J8, 36, 3_, 7`, `3, a4-
Particion en secuencias de longitud 3`
<3 ! J^, 37, 3a, 48, 4^, 63, `_, a8-
<4 ! J7, J8, 36, 3_, 7`, `3, a4-
<usion en secuencias de longitud 3`
< ! J7, J8, J^, 36, 37, 3a, 3_, 48, 4^, 63, 7`, `3, `_, a4, a8
3.2.2 "e&cla natural.
%l $etodo de ordenacion por Mezcla Euili!rada, conocido tambien con el nombre de Me1cla
Natural, es una optimizacion del $etodo de $ezcla 1irecta. #a idea central de este algoritmo
consiste en realizar las particiones tomando secuencias ordenadas de ma"ima longitud en lugar de
secuencias de tamao fijo previamente determinadas. #uego realiza la fusion de las secuencias
ordenadas, alternativamente sobre dos archivos. ,plicando estas acciones en forma repetida se
lograra que el archivo original quede ordenado. Para la realizacion de este proceso de ordenacion
se necesitaran cuatro archivos. %l archivo original < 0 tres archivos au"iliares a los que se
denominaran <3, <4, 0 <6. 1e estos archivos, dos seran considerados de entrada 0 dos de salida5
esta alternativamente con el objeto de realizar la fusion H particion. %l proceso termina cuando en
la realizacion de una fucion H particion el segundo archivo quede vacio.
< ! J^, a8, 37, `_, 4^, 3a, 63, 48, J7, J8, 36, 3_, a4, 7`, `3
#os pasos que se realizan son los siguientes
Particion ;nicial
<4 ! J^-,a8-, 4^-, 48-, 7`, `3-
<6 ! 37, `_-, 3a, 63-, J7, J8, 36, 3_, a4-
Primera <usio H Particion
<! J^, 37, `_, a8-, J7, J8, 36, 3_, 48, 7`, `3, a4-
<3 ! 3a, 4^, 63-
'egunda <usion H Particion
<4 ! J^, 37, 3a, 4^, 63, `_, a8-
<6 ! J7, J8, 36, J_, 48, 7`, `3, a4-
:ercera <usion H Particion
< ! J7, J8, J^, 36, 37, 3a, 3_, 48, 4^, 63, 7`, `3, `_, a4, a8
<3 !
.bservese que al realizar la tercera <usion H Particion el segundo archivo queda vacio, por lo que
puede afirmarse que el archivo 0a se encuentra ordenado.
Algoritmo de me&cla natural
%n cuanto a los ficheros secuenciales, el mtodo ms usado es el de mezcla natural. %s vlido
para ficheros de tamao de registro variable.
%s un buen mtodo para ordenar barajas de naipes, por ejemplo.
Cada pasada se compone de dos fases. %n la primera se separa el fichero original en dos
au"iliares, los elementos se dirigen a uno u otro fichero separando los tramos de registros que 0a
estn ordenados. %n la segunda fase los dos ficheros au"iliares se mezclan de nuevo de modo que
de cada dos tramos se obtiene siempre uno ordenado. %l proceso se repite hasta que s&lo
obtenemos un tramo.
Por ejemplo, supongamos los siguientes valores en un fichero de acceso secuencial, que
ordenaremos de menor a ma0or!
2' 0' 1' U' V' W' =' X' 0#' Y
'epararemos todos los tramos ordenados de este fichero!
@2A' @0' 1' U' V' WA' @=' X' 0#A' @YA
#a primera pasada separar los tramos alternndolos en dos ficheros au"iliares!
aux0: @2A' @=' X' 0#A
aux1: @0' 1' U' V' WA' @YA
,hora sigue una pasada de mezcla, mezclaremos un tramo de cada fichero au"iliar en un /nico
tramo!
6e;cla: @0' 1' 2' U' V' WA' @=' Y' X' 0#A
,hora repetimos el proceso, separando los tramos en los ficheros au"iliares!
aux0: @0' 1' 2' U' V' WA
aux1: @=' Y' X' 0#A
W de mezclndolos de nuevo!
6e;cla: 0' 1' 2' U' =' V' Y' X' W' 0#
%l fichero 0a est ordenado, para verificarlo contaremos los tramos obtenidos despus de cada
proceso de mezcla, el fichero estar desordenado si nos encontramos ms de un tramo.
$jemplo;
33 6e;cla,c : O%&ena6ient &e a%c5i8s secuenciales
33 O%&ena fic5e%s &e text $% %&en alfa>Ztic &e lNneas
33 Psan& el alg%it6 &e 6e;cla natu%al
9inclu&e (st&i,5>
9inclu&e (st&li>,5>
9inclu&e (st%ing,5>
8i& Sst%a%(CILE )fic5)-
8i& Se;cla(CILE )fic5)-
8i& <e$a%a%(CILE )fic5' CILE ))aux)-
>l Se;cla%(CILE )fic5' CILE ))aux)-
int 6ain()
{
CILE )fic5e%-
fic5e% = f$en(Q6e;cla,txtQ' Q%+Q)-
$uts(QCic5e% &es%&ena&:nQ)-
Sst%a%(fic5e%)-
$uts(QO%&enan& fic5e%:nQ)-
Se;cla(fic5e%)-
$uts(QCic5e% %&ena&:nQ)-
Sst%a%(fic5e%)-
fclse(fic5e%)-
s"ste6(QKAP<EQ)-
%etu%n #-
*
33 Suest%a el cnteni& &el fic5e% Qfic5Q
8i& Sst%a%(CILE )fic5)
{
c5a% linea@01XA-
%e4in&(fic5)-
fgets(linea' 01X' fic5)-
45ile(Gfef(fic5)) {
$uts(linea)-
fgets(linea' 01X' fic5)-
*
*
33 Alg%it6 &e 6e;cla:
8i& Se;cla(CILE )fic5)
{
>l %&ena&-
CILE )aux@1A-
33 Bucle que se %e$ite 5asta que el fic5e% estZ %&ena&:
& {
33 7%ea ls &s fic5e%s auxilia%es $a%a se$a%a% ls t%a6s:
aux@#A = f$en(Qaux0,txtQ' Q4+Q)-
aux@0A = f$en(Qaux1,txtQ' Q4+Q)-
%e4in&(fic5)-
<e$a%a%(fic5' aux)-
%e4in&(aux@#A)-
%e4in&(aux@0A)-
%e4in&(fic5)-
%&ena& = Se;cla%(fic5' aux)-
fclse(aux@#A)-
fclse(aux@0A)-
* 45ile(G%&ena&)-
33 Eli6ina ls fic5e%s auxilia%es:
%e68e(aux@#A)-
%e68e(aux@0A)-
*
33 <e$a%a ls t%a6s %&ena&s alte%nan& ent%e ls fic5e%s auxilia%es:
8i& <e$a%a%(CILE )fic5' CILE ))aux)
{
c5a% linea@01XA' ante%i%@1A@01XA-
int sali&a = #-
33 Dl%es iniciales $a%a ls [lti6s 8al%es
33 al6acena&s en ls fic5e%s auxilia%es
st%c$"(ante%i%@#A' QQ)-
st%c$"(ante%i%@0A' QQ)-
33 7a$tu%a la $%i6e% lNnea:
fgets(linea' 01X' fic5)-
45ile(Gfef(fic5)) {
33 Oeci&e a quZ fic5e% &e sali&a c%%es$n&e la lNnea leN&a:
if(sali&a == # II st%c6$(linea' ante%i%@#A) ( #) sali&a = 0-
else if(sali&a == 0 II st%c6$(linea' ante%i%@0A) ( #) sali&a = #-
33 Al6acena la lNnea actual c6 la [lti6a aHa&i&a:
st%c$"(ante%i%@sali&aA' linea)-
33 AHa&e la lNnea al fic5e% auxilia%:
f$uts(linea' aux@sali&aA)-
33 Lee la siguiente lNnea:
fgets(linea' 01X' fic5)-
*
*
33 Se;cla ls fic5e%s auxilia%es:
>l Se;cla%(CILE )fic5' CILE ))aux)
{
c5a% ulti6a@01XA' linea@1A@01XA' ante%i%@1A@01XA-
int ent%a&a-
int t%a6s = #-
33 Lee la $%i6e%a lNnea &e ca&a fic5e% auxilia%:
fgets(linea@#A' 01X' aux@#A)-
fgets(linea@0A' 01X' aux@0A)-
33 Dal%es iniciales-
st%c$"(ulti6a' QQ)-
st%c$"(ante%i%@#A' QQ)-
st%c$"(ante%i%@0A' QQ)-
33 Bucle' 6ient%as n se aca>e ningun &e ls fic5e%s auxilia%es
(que&an t%a6s $% 6e;cla%):
45ile(Gfef(aux@#A) II Gfef(aux@0A)) {
33 <eleccina la lNnea que se aHa&i%L:
if(st%c6$(linea@#A' linea@0A) (= #) ent%a&a = #- else ent%a&a = 0-
33 Al6acena el 8al% c6 el [lti6 aHa&i&:
st%c$"(ante%i%@ent%a&aA' linea@ent%a&aA)-
33 AHa&e la lNnea al fic5e%:
f$uts(linea@ent%a&aA' fic5)-
33 Lee la siguiente lNnea &el fic5e% auxilia%:
fgets(linea@ent%a&aA' 01X' aux@ent%a&aA)-
33 De%ifica% fin &e t%a6' si es asN c$ia% el %est &el t% t%a6:
if(st%c6$(ante%i%@ent%a&aA' linea@ent%a&aA) >= #) {
ent%a&a == # J ent%a&a = 0 : ent%a&a = #-
t%a6s++-
33 7$ia l que que&a &el t%a6 actual al fic5e% &e sali&a:
& {
st%c$"(ante%i%@ent%a&aA' linea@ent%a&aA)-
f$uts(linea@ent%a&aA' fic5)-
fgets(linea@ent%a&aA' 01X' aux@ent%a&aA)-
* 45ile(Gfef(aux@ent%a&aA) II st%c6$(ante%i%@ent%a&aA'
linea@ent%a&aA) (= #)-
*
*
33 AHa&i% t%a6s que que&en sin 6e;cla%:
if(Gfef(aux@#A)) t%a6s++-
45ile(Gfef(aux@#A)) {
f$uts(linea@#A' fic5)-
fgets(linea@#A' 01X' aux@#A)-
*
if(Gfef(aux@0A)) t%a6s++-
45ile(Gfef(aux@0A)) {
f$uts(linea@0A' fic5)-
fgets(linea@0A' 01X' aux@0A)-
*
%etu%n(t%a6s == 0)-
*
.rdenar archivos es siempre una tarea mu0 lenta 0 requiere mucho tiempo. %ste algoritmo,
adems requiere el doble de espacio en disco del que ocupa el fichero a ordenar, por ejemplo,
para ordenar un fichero de 8JJ megas se necesitan otros 8JJ megas de disco libres.
'in embargo, un fichero como el mencionado, sera mu0 difcil de ordenar en memoria.
Mtodo de Mecla !"uilibrada
, juicio personal es el mejor mtodo de ordenaci&n e"terna por que realiza una combinaci&n de
los dos mtodos anteriores 0 se logra con su uni&n, este mtodo mu0 rpido en su ejecuci&n 0
mu0 eficiente.
La manera en que opera este m$todo, es que realia particiones tomando en
cuenta secuencias ordenadas de m"%ima longitud, es decir que del arc(ivo
original verifica si el elemento inmediato superior es mayor que $l, si es
mayor se va formando la secuencia y se env)a al arc(ivo 16 tambi$n el
apuntador se mueve al arc(ivo 17, si no es mayor se verifica si el siguiente
elemento en comparacin con el actual es mayor si lo es se env)a el arc(ivo
17, y el apuntador se regresa al arc(ivo 16, este proceso se realia (asta que
se terminen los elementos de 15.
#l tener las particiones (ec(as se procede a comparar por medio de un
recorrido por el m$todo de distribucin simple, para ver el nuevo orden que
tendr" el arc(ivo 15, as) tambi$n se vuelve a repetir todos los procesos antes
descritos y de esta manera queda el arc(ivo ordenado y9o cuando el tercer
arc(ivo queda con :0LL o vac)o.




Anlisis

:iempo!
%l tiempo que necesita para ordenar un archivo es mu0 corto, as que para asignarle un tiempo,
valoraremos su rapidez de ejecuci&n 0 se le puede asignar G unidad de tiempo de tardanza en las
ordenaciones de archivos e"ternos.

Costo!
%l costo se eleva considerablemente por que es la implementaci&n de dos mtodos en uno solo 0
eso requiere de un anlisis mu0 detallando, por lo que se le asignan Dunidades de costo a este
mtodo.

Espacio:
%l almacenamiento de este mtodo es reducido de manera que es igual a los dems! GH0
Unidad 4. "todos de b5s6ueda.
4.! Algoritmos de ordenacin e2terna.
Bna b/squeda es el proceso mediante el cual podemos localizar un elemento con un valor
especifico dentro de un conjunto de datos. :erminamos con "ito la b/squeda cuando el elemento
es encontrado.
4.!.1Secuencial.
45s6ueda &ecuencial
, este mtodo tambien se le conoce como b/squeda lineal 0 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.
%ste es el mtodo de b/squeda ms lento, pero si nuestro arreglo se encuentra completamente
desordenado es el /nico que nos podr a0udar a encontrar el dato que buscamos.
ind GH 3
encontrado GH falso
mientras no encontrado 0 ind G N haz
si arreglo@indA ? valorRbuscado entonces
encontrado GH verdadero
en caso contrario
ind GH ind I3
#$s%ueda secuencial/ tam,i-n se le conoce como ,$s%ueda lineal. Supongamos una
coleccin de registros organi.ados como una lista lineal. )l algoritmo ,sico de
,$s%ueda secuencial consiste en empe.ar al inicio de la lista e ir a trav-s de cada
registro (asta encontrar la llave indicada 6R7/ o (asta al final de la lista.


+a situacin ptima es %ue el registro ,uscado sea el primero en ser e&aminado. )l
peor caso es cuando las llaves de todos los n registros son comparados con R 6lo %ue
se ,usca7. )l caso promedio es nF2 comparaciones.

)ste m-todo de ,$s%ueda es mu* lento/ pero si los datos no estn en orden es el
$nico m-todo %ue puede emplearse para (acer las ,$s%uedas. Si los valores de la llave
no son $nicos/ para encontrar todos los registros con una llave particular/ se re%uiere
,uscar en toda la lista.


Mejoras en la eficiencia de la ,$s%ueda secuencial

1:"uestreo de acceso

)ste m-todo consiste en o,servar %ue tan frecuentemente se solicita cada registro *
ordenarlos de acuerdo a las pro,a,ilidades de acceso detectadas.

2:"o)imiento 1acia el *rente

)ste es%uema consiste en %ue la lista de registros se reorganicen dinmicamente.
Con este m-todo/ cada ve. %ue ,$s%ueda de una llave sea e&itosa/ el registro
correspondiente se mueve a la primera posicin de la lista * se recorren una posicin
(acia a,ajo los %ue esta,an antes %ue el.

!:Transposicin

)ste es otro es%uema de reorgani.acin dinmica %ue consiste en %ue/ cada ve. %ue
se lleve a ca,o una ,$s%ueda e&itosa/ el registro correspondiente se intercam,ia con el
anterior. Con este procedimiento/ entre mas accesos tenga el registro/ mas
rpidamente avan.ara (acia la primera posicin. Comparado con el m-todo de
movimiento al frente/ el m-todo re%uiere mas tiempo de actividad para reorgani.ar al
conjunto de registros . Gna ventaja de m-todo de transposicin es %ue no permite %ue
el re%uerimiento aislado de un registro/ cam,ie de posicin todo el conjunto de
registros. He (ec(o/ un registro de,e ganar poco a poco su derec(o a alcan.ar el inicio
de la lista.

':rdenamiento

Gna forma de reducir el numero de comparaciones esperadas cuando (a* una
significativa frecuencia de ,$s%ueda sin -&ito es la de ordenar los registros en ,ase al
valor de la llave. )sta t-cnica es $til cuando la lista es una lista de e&cepciones/ tales
como una lista de decisiones/ en cu*o caso la ma*or0a de las ,$s%uedas no tendrn
-&ito. Con este m-todo una ,$s%ueda sin -&ito termina cuando se encuentra el primer
valor de la llave ma*or %ue el ,uscado/ en lugar de la final de la lista.
4.!.2-inaria.
45s6ueda 4inaria
#as condiciones que debe cumplir el arreglo para poder usar b/squeda binaria son que el arreglo
este ordenado 0 que se conozca el numero de elementos.
%ste mtodo consiste en lo siguiente! comparar el elemento buscado con el elemento situado en la
mitad del arreglo, si tenemos suerte 0 los dos valores coinciden, en ese momento la b/squeda
termina. Pero como e"iste 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 ma0or.
#a b/squeda termina cuando encontramos el elemento o cuando el tamao del arreglo a e"aminar
sea cero.
encontrado GH falso
primero GH 3
ultimo GH N
mientras primero G? ultimo 0 no encontrado haz
mitad GH )primero I ultimo*94
si arreglo@mitadA ? valorRbuscado entonces
encntrado GH verdadero
en caso contrario
si arreglo@mitadA Q valorRbuscado entonces
ultimo GH mitad H 3
en caso contrario
primero GH mitad I 3
Se puede aplicar tanto a datos en listas lineales como en r,oles ,inarios de ,$s%ueda.
+os prerre%uisitos principales para la ,$s%ueda ,inaria son<
+a lista de,e estar ordenada en un orden especif0co de acuerdo al valor
de la llave.
He,e conocerse el n$mero de registros.
Algoritmo
1. Se compara la llave ,uscada con la llave locali.ada al centro del arreglo.
2. Si la llave anali.ada corresponde a la ,uscada fin de ,$s%ueda si no.
3. Si la llave ,uscada es menor %ue la anali.ada repetir proceso en mitad
superior/ sino en la mitad inferior.
4. )l proceso de partir por la mitad el arreglo se repite (asta encontrar el
registro o (asta %ue el tama!o de la lista restante sea cero / lo cual implica
%ue el valor de la llave ,uscada no esta en la lista.
)l esfuer.o m&imo para este algoritmo es de log2n. )l m0nimo de 1 * en promedio S
log2 n.

4.!.!7as1.
45s6ueda por =as,
#a idea principal de este mtodo consiste en aplicar una funci&n que traduce el valor del
elemento buscado en un rango de direcciones relativas. Bna desventaja importante de este
mtodo es que puede ocasionar colisiones.
funcion hash )valorRbuscado*
inicio
hash GH valorRbuscado mod numeroRprimo
fin
inicio GH hash )valor*
il GH inicio
encontrado GH falso
repite
si arreglo@ilA ? valor entonces
encontrado GH verdadero
en caso contrario
il GH )il I3* mod N
hasta encontrado o il ? inicio
'asta a(ora las t-cnicas de locali.acin de registros vistas/ emplean un proceso de
,$s%ueda %ue implica cierto tiempo * esfuer.o. )l siguiente m-todo nos permite
encontrar directamente el registro ,uscado.

+a idea ,sica de este m-todo consiste en aplicar una funcin %ue traduce un
conjunto de posi,les valores llave en un rango de direcciones relativas. Gn pro,lema
potencial encontrado en este proceso/ es %ue tal funcin no puede ser uno a unoC las
direcciones calculadas pueden no ser todas $nicas/ cuando 6R1 7: 6R27
5ero < T1 diferente de T2 decimos %ue (a* una colisin. K dos llaves diferentes %ue les
corresponda la misma direccin relativa se les llama sinnimos.

K las t-cnicas de calculo de direcciones tam,i-n se les conoce como <
T-cnicas de almacenamiento disperso
T-cnicas aleatorias
M-todos de transformacin de llave = a= direccin
T-cnicas de direccionamiento directo
M-todos de ta,la 'as(
M-todos de 'as(ing
5ero el t-rmino mas usado es el de (as(ing. Kl clculo %ue se reali.a para o,tener
una direccin a partir de una llave se le conoce como funcin (as(.


Fentaja
1. Se pueden usar los valores naturales de la llave/ puesto %ue se traducen
internamente a direcciones fciles de locali.ar
2. Se logra independencia lgica * f0sica/ de,ido a %ue los valores de las
llaves son independientes del espacio de direcciones
3. 8o se re%uiere almacenamiento adicional para los 0ndices.
Des)entajas
1. 8o pueden usarse registros de longitud varia,le
2. )l arc(ivo no esta clasificado
3. 8o permite llaves repetidas
4. Solo permite acceso por una sola llave
Costos
Tiempo de procesamiento re%uerido para la aplicacin de la funcin (as(
Tiempo de procesamiento * los accesos )FS re%ueridos para solucionar
las colisiones.
%a e*iciencia de una *uncin 1as1 depende de;
1. +a distri,ucin de los valores de llave %ue realmente se usan
2. )l numero de valores de llave %ue realmente estn en uso con respecto al
tama!o del espacio de direcciones
3. )l numero de registros %ue pueden almacenarse en una direccin dad sin
causar una colisin
4. +a t-cnica usada para resolver el pro,lema de las colisiones
%as *unciones 1as1 mas comunes son;
esiduo de la divisin
Medio del cuadrado
5liegue

HASHING POR RESIDUO DE LA DIVISIN

+a idea de este m-todo es la de dividir el valor de la llave entre un numero apropiado/
* despu-s utili.ar el residuo de la divisin como direccin relativa para el registro
6direccin : llave mdulo divisor7.

Mientras %ue el valor calculado real de una direccin relativa/ dados tanto un valor de
llave como el divisor/ es directoC la eleccin del divisor apropiado puede no ser tan
simple. )&isten varios factores %ue de,en considerarse para seleccionar el divisor<
1. )l rango de valores %ue resultan de la operacin 4llave Q divisor4/ va
desde cero (asta el divisor 1. +uego/ el divisor determina el tama!o del
espacio de direcciones relativas. Si se sa,e %ue el arc(ivo va a contener
por lo menos n registros/ entonces tendremos %ue (acer %ue divisor > n/
suponiendo %ue solamente un registro puede ser almacenado en una
direccin relativa dada.
2. )l divisor de,er seleccionarse de tal forma %ue la pro,a,ilidad de colisin
sea minimi.ada. UComo escoger este numeroV Mediante investigaciones
se (a demostrado %ue los divisores %ue son n$meros pares tienden a
comportase po,remente/ especialmente con los conjuntos de valores de
llave %ue son predominantemente impares. Klgunas investigaciones
sugieren %ue el divisor de,er ser un numero primo. Sin em,argo/ otras
sugieren %ue los divisores no primos tra,ajan tam,i-n como los divisores
primos/ siempre * cuando los divisores no primos no contengan ning$n
factor primo menor de 22. +o mas com$n es elegir el n$mero primo mas
pr&imo al total de direcciones.
Ejemplo;

Andependientemente de %ue tan ,ueno sea el divisor/ cuando el espacio de
direcciones de un arc(ivo esta completamente lleno/ la pro,a,ilidad de colisin crece
dramticamente. +a saturacin de arc(ivo de mide mediante su factor de carga/ el cual
se define como la relacin del numero de registros en el arc(ivo contra el numero de
registros %ue el arc(ivo podr0a contener si estuviese completamente lleno.

Todas las funciones (as( comien.an a tra,ajar pro,a,lemente cuando el arc(ivo
esta casi lleno. 5or lo general el m&imo factor de carga %ue puede tolerarse en un
arc(ivo para un rendimiento ra.ona,le es de entre el I2 Q * "2 Q.


HASHING POR MEDIO DEL CUADRADO

)n esta t-cnica/ la llave es elevada al cuadrado/ despu-s algunos d0gitos espec0ficos
se e&traen de la mitad del resultado para constituir la direccin relativa. Si se desea una
direccin de n d0gitos/ entonces los d0gitos se truncan en am,os e&tremos de la llave
elevada al cuadrado/ tomando n d0gitos intermedios. +as mismas posiciones de n
d0gitos de,en e&traerse para cada llave.

Ejemplo;

Gtili.ando esta funcin (as(ing el tama!o del arc(ivo resultante es de 12
n
donde n es
el numero de d0gitos e&tra0dos de los valores de la llave elevada al cuadrado.


HASHING POR PLIEGUE

)n esta t-cnica el valor de la llave es particionada en varias partes/ cada una de las
cuales
6e&cepto la ultima7 tiene el mismo numero de d0gitos %ue tiene la direccin relativa
o,jetivo. )stas particiones son despu-s plegadas una so,re otra * sumadas. )l
resultado/ es la direccin relativa. Agual %ue para el m-todo del medio del cuadrado/ el
tama!o del espacio de direcciones relativas es una potencia de 12.

Ejemplo;

COMPARACIN ENTRE LAS FUNCIONES HASH

Kun%ue alguna otra t-cnica pueda desempe!arse mejor en situaciones particulares/
la t-cnica del residuo de la divisin proporciona el mejor desempe!o. 8inguna funcin
(as( se desempe!a siempre mejor %ue las otras. )l m-todo del medio del cuadrado
puede aplicarse en arc(ivos con factores de cargas ,astantes ,ajas para dar
generalmente un ,uen desempe!o. )l m-todo de pliegues puede ser la t-cnica mas
fcil de calcular pero produce resultados ,astante errticos/ a menos %ue la longitud de
la llave se apro&imadamente igual a la longitud de la direccin.

Si la distri,ucin de los valores de llaves no es conocida/ entonces el m-todo del
residuo de la divisin es preferi,le. 8ote %ue el (as(ing puede ser aplicado a llaves no
num-ricas. +as posiciones de ordenamiento de secuencia de los caracteres en un valor
de llave pueden ser utili.adas como sus e%uivalentes 4num-ricos4. Klternativamente/ el
algoritmo (as( act$a so,re las representaciones ,inarias de los caracteres.
Todas las funciones (as( presentadas tienen destinado un espacio de tama!o fijo.
Kumentar el tama!o del arc(ivo relativo creado al usar una de estas funciones/ implica
cam,iar la funcin (as(/ para %ue se refiera a un espacio ma*or * volver a cargar el
nuevo arc(ivo.



"GTDS $A(A (ES%FE( E% $(-%E"A DE %AS C%.S.<ES

Considere las llaves T1 * T2 %ue son sinnimas para la funcin (as( . Si T1 es
almacenada primero en el arc(ivo * su direccin es 6T17/ entonces se dice %ue T1 esta
almacenado en su direccin de origen.

E2isten dos mtodos bsicos para determinar donde debe ser alojado H2 ;

Direccionamiento abierto.E Se encuentra entre direccin de origen para T2
dentro del arc(ivo.
Separacin de desborde 8Area de desborde:.E Se encuentra una direccin
para T2 fuera del rea principal del arc(ivo/ en un rea especial de des,orde/ %ue
es utili.ada e&clusivamente para almacenar registro %ue no pueden ser
asignados en su direccin de origen
%os mtodos mas conocidos para resol)er colisiones son;


Sondeo lineal

Wue es una t-cnica de direccionamiento a,ierto. )ste es un proceso de ,$s%ueda
secuencial desde la direccin de origen para encontrar la siguiente localidad vac0a. )sta
t-cnica es tam,i-n conocida como m-todo de des,ordamiento consecutivo.

5ara almacenar un registro por (as(ing con sondeo lineal/ la direccin no de,e caer
fuera del limite del arc(ivo/ )n lugar de terminar cuando el limite del espacio de
direccin se alcan.a/ se regresa al inicio del espacio * sondeamos desde a(0. 5or lo
%ue de,e ser posi,le detectar si la direccin ,ase (a sido encontrada de nuevo/ lo cual
indica %ue el arc(ivo esta lleno * no (a* espacio para la llave.

5ara la ,$s%ueda de un registro por (as(ing con sondeo lineal/ los valores de llave
de los registros encontrados en la direccin de origen/ * en las direcciones alcan.adas
con el sondeo lineal/ de,er compararse con el valor de la llave ,uscada/ para
determinar si el registro o,jetivo (a sido locali.ado o no.



)l sondeo lineal puede usarse para cual%uier t-cnica de (as(ing. Si se emplea
sondeo lineal para almacenar registros/ tam,i-n de,er emplearse para recuperarlos.
Doble 1as1ing

)n esta t-cnica se aplica una segunda funcin (as( para com,inar la llave original
con el resultado del primer (as(. )l resultado del segundo (as( puede situarse dentro
del mismo arc(ivo o en un arc(ivo de so,reflujo independienteC de cual%uier modo/ ser
necesario alg$n m-todo de solucin si ocurren colisiones durante el segundo (as(.

+a ventaja del m-todo de separacin de des,orde es %ue reduce la situacin de una
do,le colisin/ la cual puede ocurrir con el m-todo de direccionamiento a,ierto/ en el
cual un registro %ue no esta almacenado en su direccin de origen despla.ara a otro
registro/ el %ue despu-s ,uscar su direccin de origen. )sto puede evitarse con
direccionamiento a,ierto/ simplemente moviendo el registro e&tra!o a otra localidad *
almacenando al nuevo registro en la direccin de origen a(ora vac0a.

5uede ser aplicado como cual%uier direccionamiento a,ierto o t-cnica de separacin
de des,orde.
5ara am,as m-todos para la solucin de colisiones e&isten t-cnicas para mejorar su
desempe!o como<


1.E Encadenamiento de sinnimos
Gna ,uena manera de mejorar la eficiencia de un arc(ivo %ue utili.a el calculo de
direcciones/ sin directorio au&iliar para guiar la recuperacin de registros/ es el
encadenamiento de sinnimos. Mantener una lista ligada de registros/ con la misma
direccin de origen/ no reduce el numero de colisiones/ pero reduce los tiempos de
acceso para recuperar los registros %ue no se encuentran en su localidad de origen. )l
encadenamiento de sinnimos puede emplearse con cual%uier t-cnica de solucin de
colisiones.
Cuando un registro de,e ser recuperado del arc(ivo/ solo los sinnimos de la llave
o,jetivo son accesados.

2.E Direccionamiento por cubetas

@tro enfo%ue para resolver el pro,lema de las colisiones es asignar ,lo%ues de
espacio 6cu,etas7/ %ue pueden acomodar ocurrencias m$ltiples de registros/ en lugar
de asignar celdas individuales a registros. Cuando una cu,eta es des,ordada/ alguna
nueva locali.acin de,er ser encontrada para el registro. +os m-todos para el
pro,lema de so,recupo son ,sicamente los mismo %ue los m-todos para resolver
colisiones.


C"$A(AC.=< E<T(E S<DE %.<EA% I D-%E 7AS7.<J

He am,os m-todos resultan distri,uciones diferentes de sinnimos en un arc(ivo
relativo. 5ara a%uellos casos en %ue el factor de carga es ,ajo 6B 2.57/ el sondeo lineal
tiende a agrupar los sinnimos/ mientras %ue el do,le (as(ing tiende a dispersar los
sinnimos mas ampliamente a trav-. del espacio de direcciones.

)l do,le (as(ing tiende a comportarse casi tam,i-n como el sondeo lineal con
factores de carga pe%ue!os 6B 2.57/ pero act$a un poco mejor para factores de carga
ma*ores. Con un factor de carga > "2 Q/ el sondeo lineal por lo general resulta tener un
comportamiento terri,le/ mientras %ue el do,le (as(ing es ,astante tolera,le para
,$s%uedas e&itosas pero no as0 en ,$s%uedas no e&itosas.
4.' -5s6ueda e2terna.
4.'.1 Secuencial.
4.'.2 -inaria.
4.'.! 7as1.
$todo de ;ntercalaci&n 'imple.htm
$anejo de archivosR Captulo JJ8.htm
http!99FFF.itlp.edu.m"9publica9tutoriales9estructdatos49unidad8.htm
http!99FFF.itlp.edu.m"9publica9tutoriales9estructdatos49temab4J8R3.htm
http!99FFF.itlp.edu.m"9publica9tutoriales9estructdatos49temab4J8R4.htm
http!99FFF.itlp.edu.m"9publica9tutoriales9estructdatos49temab4J8R6.htm
http!99FFF.itcerroazul.edu.m"9estructura9BN;8.html
http!99FFF.lab.dit.upm.es9clprg9material9apuntes9o9
http!9943`.46^.8a.3J79searchPq?cache!d3flvbl2BCcY!FFF.lsi.upc.es9cvirtual9pbd9J4H
Cecursividad.pdfIb44complejidadIdeIalgoritmosIrecursivosb44Mhl?esMstart?37
http!99pinsa.escomposlinu".org9sromero9prog9recursividad.php
http!99cronos.dci.ubiobio.cl9cgpoo9documentos9librognome9glibHmemor0.html
http!99labsopa.dis.ulpgc.es9cpp9introRc9introcaa.htm
http!99msdn.microsoft.com9librar09spa9default.aspP
url?9librar09'P,9vbcna9html9vaconcreatingrecursiveprocedures.asp
http!99FFF.fisica.uson.m"9carlos9Nirvana9CComp9cursos9CC339lecture8.html
http!99FFF.monografias.com9trabajos379recursividad9recursividad.shtml

You might also like