Professional Documents
Culture Documents
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.
Recursi:idad anidada! %n algunos de los arg. de la llamada recursiva ha0 una nueva
llamada a s misma.
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.
#. ,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