Está en la página 1de 33
Capitulo 8 Analisis de algoritmos: concepto de eficiencia Analisis de algorit mos: concepto de eficiencia «MHI (E3_Objetivo En este capitulo se presenta e! concepto de eficiencia de un algoritmo, a fin de evaluar dite- rentes sciuciones de un mismo problema, Se trabala con dos cases de problemas que constituyen el nicleo de los ejemplos del ca- pitulo:algoritmos de busqueda y algoritmos de ordenacion de datos en vactores, i endlsis teérico de los tiempos de ejecucién y/o la memoria ocupada se acompafia con tuna variada ejempiticaciin, de modo que el lactor pueda analizar algunas soluciones concre- tas en Pascal Asimismo, se presentan casos de soluciones recursivas, mostrando las ventalas de su sim~ ‘licidad y claridad expuestas en el canituio 7 y, al mismo tiempo, las limitaciones en cuanto la eficiencia aecciadas con las implementaciones recursivas. =] 8.1 El concepto de eficiencia Hasta ahora se han desarroltado algortmos para expresar la solucién de problemas simples, sin analizar profundamerte cun “buena” es la solucion propuesta, 0 si existen alternatives “pejores" Pensar en la optirnizacién de un algartmo en alain sentido requiere enalizar previamente su eficioncia, es decir, la utilzacién que se hace desde el algoritmo de los recursos del sistema f- sico donde se efecuta (bdsicament, tiempo de ejecuctén en maquina requerido y cantidad de memoria utilized). Si bien es cierto que ai hablar de eticioncia ol mayor énfesis est puesto en el tiempo de eje- ccucién del algoritmo, en un sentido amplio, efciencia se refiers ala forma de administracién de todos los recursos disponibies en el sisterta, de los cuales el tempo de procesamiento es uno de ellos. Definicon Un aigoritmo es ecient si realiza una administracin correcta de los recursos de sistema en (LL eietase ea, 3 8.2 Anilisis de eficiencia de un algoritmo En este capitulo se analizarin, bésicamente, dos aspectos de la effciencia de un algoritmo: + Tiampo de ejecuciént Desde este punto de vista se considerardn més eficientes aquslos algoritmas que cum- plan con la especificacién del problema en el menor tiempo posible. En este caso, el re Curso a optimizar es el tiempo de procesamiento. A esta ciase pertenecen aquellas apii- caciones con tiempo de respuesta finito come, por ejemplo, la reserva de pasajas, ol ‘monitoreo de sefiales en tiempo real, e! control y disparo de alarmas, la transmisién de voz @ imagenes en tiempo rea, eto. + Administracién o uso de ta memoria Serén efciontes aqusllos algoritmos que utlicen las estructuras de datos adecuadas de manera de minimizar la meroria ocupada. Si bien el tiempo de procesamiento no se de- ja de lado, en este punto se consideran los problemas donde el énfasis esta puesto en el volumen de ia informacitin a manejar en la memoria (oor ejemplo, manejo de bases de datos, procesamniento de imagenes en memoria, reconacimiento de patrones, ete} Tee 0 83 Anilisis de algoritmos seguin su tiempo de ejecucién 8.3.1 EQué medir? Para poder medir la eficencia de un algoritma, desde el punto de vista de su tiempe de ejecu- cién, es fundamental contar con una medida del trabajo que realiza. Esta medida permitira comparar los algoritmos y seleccionar, de todas las posibles, la mejor implementacion, Bésicamente, en los algoritmos se tlenen dos operaciones elementales: las comparaciones de valores y 'as asignaciones. Se comienza con el andlisis de cada algoritmo, en base al nd ‘mero de comparaciones y asignaciones involucradas. Naturalmente luego (segin el procasa- dor donde el algortmo se ejecute) se deberd tener en cuenta el tiempo de cada clase de ope- racién, Se considera la tarea de caleuar el minimo de tres nimeros a, » yc y se analizan cuatro for- mas de resolvere: Método 1 if bem then a if cem then m (bers) af (eeza) metodo $ af (aexb) and (ac=e) then w= 3 else if beso then @ else m Qe a ‘Analizando la eficiencia relativa de los cuatro métodos puede observarse at + El método 1 realiza des comparaciones y, a! menos, una asignacién. Puede verse que si las dos comparaciones son verdaderas, 38 reaizan tres asignaciones en lugar de Une. ‘+ El método 2 utiiza también dos comparaciones y una sola asignacién. Es importante re~ marcar que el trabajo de un algoritme ¢e mide por la cantidad de operaciones que reali- ayy no por la longitud del cédigo. ‘+ El método 3 realiza seis comparaciones y una asignacién, ya que aunque las primeras dos comparaciones den come resultado que a es el minimo, las otras cuatro también se realizan, ‘+ El método 4, si bien requlere una Gnica asignacién, puede llegar a hacer tres compara clones. Dado que la diferencia entre 2 y 3 0 6 comparaciones puede parecer poco importante, se dis- Cute a continuacién una modificacién del problema: Halla el men (alibéticaments) de tres strings © cadenas en jugar del minim de res n= imeros, donde cada uno des stings contenga 200 caracteres. Para comprender atin mejor la situacion se supone que el lenguaiano proves un mecanismo para compararls drectamento, Sino que debe hacers otra po era ‘Se puede ver entonces, cue hacer des comparaciones en lugar de tres 0 sels es importan- te, puss se convertiran en 400, 600 0 1200, dando una idea del incremento potencial 8 impor- tants en el tiempo de ejecucién. En este momento, sien lugar de hallar et menor de 3 niimaros 0 3 strings, se requiere hallar ‘el minimo den nimeros 0 n strings, con n grande, es importante ver la calidad de la solucién ‘algortmica propuesta, en el sentido de la posibllidad de generalizar la solucién de 3 elementos an elementos. Por ejemplo, la generalizacién del métado 3 implica comparar cada numero con los restan tes, fo cual leva a realizar n(n-1) comparaciones, mientras que el método 1 solo compara el n ‘mero buscado una vaz con cada uno de los n elementos y haciendo de esta forma (n-1) com paraciones, Se puede ver que el método 3 requiere de mucho més tiempo que el métado 1 ya que rea- liza n comparaciones por cada elemento. Como resultado “intuitive” de este andlsis, et método 1 aparece como al mas fil de im- pplementar y generalizar. Sie identifica la unidad intrinseca de trabajo realizada por cada uno de los cuatro métodos (que en el ejemplo seria la comparacién de dos nimeros), ¢s posible determinar cules son los ‘métodos que realizan trabajo supertiuo y cudles los que realizan al trabajo minimo necesario para llevar a cabo la tarea pedida El método 4 no es un buen métedo en particular, reo sirve para Hustrar un aspecto impor- tante relacionado con el andlisis de los algoritmas. Cada unv de los otros métodos presenta un ‘numero igual de comparacionas independientemvente de los valores de a, b yc. En el método 4, el nimero de comparaciones puede varia, dependiendo de los datos, Esta diferencia, se describe diciando que el método 4 puede realizar dos comparaciones en ‘I major caso, y tres comparaciones en el peor caso. En general, se tiene interés en el comportamiento del algoritmo en el peor caso 0 en el ca- ‘0 promedio. En la mayorta de las aplicaciones no es impertante cudn rapido puede resolver el problema frente a los datos organizados favorabierente, sno ocurre frente a datos “adversos" (aso peor) o en el caso estadistico de “datos promedio". Por ejempio, si se desea encontrar el minimo de tres niimeros distintos, hay seis casos di {erentes correspondientes a los seis érdenes relatives en que pueden aparecer los tres niime ros, en los dos casos donde a es el minimo, el método 4 realiza dos comparaciones y en los otros cuatro casos, reliza tres comparaciones. De esto se deduce que si todos los casos son Iguelmente probables, el método 4 realiza 8/3 comparaciones en promedio. 8.3.2 Programas eficientes ‘A partir de un algoritmo especficado eficientemente, se pusden obtener programas eficientes. Para elo es uit observar algunas pautas simples relacionadas con fa eficiencia del cédigo: *+ No repetir céiculos innecesaros. + Por ejemplo, puede escribirse: aot, yim Wart) + 172-2) + laa) + es) fen ugar de xt A) + UQrHtE-2) +1112 -) + RE -4) no sob para ahorrar oédigo, sino porque la expresién 2°x't sélo se calcula una vez. * El case anterior se ve agravado si la expresién que se recalcula est dentro de un lazo repetitive, Suponiendo un lazo que se repite 1000 veces, la ejecucion reterada de 2°x"t significa 4.000 operaciones redundantes. en lugar de: ys20; for 21 to 2000 do ey + T/ (RtReK A) ys que se evita calcular xx" dos mil veoes. Resuita il salvar (quarar lo resultados interme que se usan en os cdiculos posterores. xx); for a: begin 1 to 2000 a pit yp; and requere una Gnica muttiliacion dentro del azo (oooh Los ejemplos anteriores muestran que no necesariamente los cédigos mas compactes son los rds eficientes. 8.3.3 Tiempo de ejecucin de un algoritmo Hay dos formas de estimar el tiempo de ejecucién de un algortmo: 1) Realizar un andiisis toérico: se busca obtener una medida del trabajo realizado por el al- {goritmo a fin de obtener una estimacion teorica de su tiempo de ejecucién. Bésicamen- te, se calculan el nimero de comparaciones y de asignaciones que requiere el algoritmo, Los andilisis similares reatzados sobre ciferentes soluciones de un mismo problema per- miten estimar cua! ¢s la solucién més efciente 2) Realizar un andlisis empirico: se basa en la aplicacién de juegos de datos diferentes tuna implementacion del algonitmo, de manera de medir sus tiempos de repuesta, La api- cacién de ios mismos datos a dstintas soluciones del mismo problema presupone la ob- tencién de una herramienta de comparacion entre ellos. El andlisis empirico tiene la ven- taja de ser muy facil de implementar, psro ro tiene en cuenta algunos factores como: WES * La velocidad de la maquina, esto es, la ejecucién del mismo algortme en computa- doras distntas produce diferentes resultados. De esta forma no es posible tener una mecida de referencia, * Los datos con los que se ¢jectte el algaritmo, ya que los datos empleados pueden ser favorables a uno de los algoritmos, pero pueden no representar el caso general, Con lo cual las conclusiones de la evaluacién pueden ser eréneas. Por lo tanto, es valioso realizar un andlisisteGrico que permita estimar el orden del tiempo de respuesta, que sirva como comparacién relativa entre las diferentes soluciones algortmicas, sin depender de los datos de experimentacién, Con ese fin se introduce la siguiente definicisn: el tiempo de ejecucion Tin) de un algoritmo ‘80 dice "ce orden fn)" cuando existe una funcién materatic f(n) que acota a Tin Caign Tin)=O(#(n)) st existen constantes © ¥ ne tales que Tio) = ¢ T(n) cuando nena. La definici6n anterior es una forma de establecer Un orden relative entre las funciones del tiem o de ejzevci6n da los algoritmos T1(n} y T2(a) Sagiin las funciones matematicas que las aco- ten (H(¢)y 12) se puede obtener una relacion entre Tt y T2. Por ejemplo, siT1(n) = O(n) y T2(p) = O14"n'n) para n>5, resulta claro que Ts es més efi- ciente que T2 ara n>5. ‘Otro aspecto a analiza’ 2s a velocidad de crecimiento. Por ejemplo, si se compara la fun én Tin=1000n con f(n)=n*, aunque 1000 8s mayor que n* para valores pequeries den, nF cre ‘ce més répido, con 'e cual n¥ podria ser eventualmente la funcion mas grande. En este caso, esto ocurre para n>=1000. La primera definicion establece que eventualmen- te hay algcn punto ny a partir del cual cfr) e8 2] menos tan grande como Tin), e ignorande los factores constantes, f(n) es como minieno tan grande como Th). En el ejemplo, Tin) = 1000n, fn) = nf, no=1000 y ct. También se hubiera podide uilizar no=10 y =100, Con io cual es posible afimar que 1000n = Of’ (orden n-cuadrado). esumiendo. al decir que Tin}=Ofn), se esté garantizando que a funcién Tin) no crece mas rapido que fin, decir que fn) es un limite superior para Tn). Femple 63 1 crece més ripido quem, por fo tanto, s2 puede amar que n? = O(n"). #(n) = a" y gin) = 2n? crecona la misma velocidad, por fo tanto ambas expesiones, F(m)=019(n)) ¥ 9(n)=0(#(n)) son verdaderas. Intuitivamente, si g{n) = 212, entonces g(n)=@in4);, 9(n)=0(n3) y g(n)=0(n2) son todas técnicamente comrectas, pero abviamente la titima es la mejor respuesta ya que es la cota su= petior més cercans a g(). Vohiendo al problema, para calcula el tempo de gjecucién de un algoritmo se analiza el si- uiente algeritmo. ‘Se presenta aqui un fragmento de programa que calcula Econ 3. function sum(_n: integer ): integer; var j, sunaParcial: integer; begin {1} sumaParcial := 0; 42) for j ss 1 ton do {3} sumaParcial := sunaParcial + j*)*45 {4} sum i= sunaParcial; ends ands de este programa es simple. Las declaraciones no consume temp. Las lneas {1} y (4) implican una nidad de tempo cade una. 1 tinea {8} consume 4 unidades de tiempo cada ver (dos multplicacion asionacin) y es eecutada n veces dando ut otal de 4n unidades. ‘alia (2) tiene un costo acto de inicaiarj, testear si jan inrementar jE costo thal es 1 por la iniciazacién, n+ por toss los testes yn nor odos los increments, lo que dt 2n+2. Weneten) Si se ignora el custo dela invocachn y retro de la funcié, el att es de 6+. Por 0 tanto, se dce que esta funcion es de O( una sua y una Como puede apreciarse lz apicacién de este tipo de andlsis a cada segmento de cédigo es una farea totamente impracticable. Sin embargo, hay una cierta cantidad de consideraciones que _Bueden hacerse a fin de reducir la complajcad de andliss sn afectar la respuesta final. Por ejemplo, la iea (2} as obviamente de O(t) no importa lo que haya en su interior, os al- {ge que se ejecuta n veces, Lo misme ocurre con la linea (1), 8s insignificante respecto de n, Existen, por fo tanto, ciertas reglas a tener en cuenta para faclitar esta tarea sa 8.3.3.1 Reglas Generales Regla 1: Para lazos incondicionales. El tiempo de ejecucién de un iazo incondicional es, alo sumo, el tempo de ejecucién de la Ssentenclas que estén dentro del lazo, incuyendo testeos, multiplcada por ia cantidad de ter raciones que se realzan, Regla 2: Para lazos incondicionales anidados. ‘Se debe realizar el andlsis desde adentro hacia afuera. | tiempo total de ejecucién de un Dloque dentro de lazos anidados es el tiempo de elecucién del bloque mutipicado por et [Producto de los tamarios de todas los lazos incondicionales. Rogla 3: rt - then - Els ado un fragmento de cédigo de la forma if condicton then $1 else 52 {tiempo de ejecucién no puede ser superior al tiempo de! testeo mas el max(t,t2) donde tT es el tiempo de ejecucién de S1, y 12 el ampo de ejecucion de S2. Regla 4: Para sentencias consecutivas. Si.un fragmento de codigo esta formado por dos blogues uno con tiempo T(r] y otro alr, il tiempo total es el maximo de lov dos anteriores, 2s dacic SiTH() = Offa) y Tale) = O(Ginp, T3ln) + TA) = max Off), OLIN) ) Analizando un poco mas esta Ultima afirmactén: Por definicion, Tun) = OfK) y Te(n) = O(g(n), de donde existen cuatro constantes cy, co, My ¥ Me tales que Ty(n) = ex(n) para nan, y Ta) ® exgin) para nan,. ‘Sea no = max(ny, na, entonces, para nen, TxA) = ein) y Tan) = e2gle). de donde Tu(n) + THM) = efi) + c29(n, ‘Sea cy=max(cr, ¢9), entonces, Tin) + Tee) = afin) + esata) = 69 (f(a) + gie)) = es max( fn), gp) ) = max fin), (7) Para c=2es y nang A modo de ejemplo, se analiza el siguiente fragmento de cédigo formado por un bloque de Oe) seguido de otro de Of) dando como resultado un fragmento de Oi") for j = 1 ton do {algo para hacer de (1) ; for j:=1 to n do for ki=1 ton do (algo para hacer de 0(1) >; ‘Se puede ver que mediante la utiizacion de estas ragias el resuitado final puede ser so- breestimado, pero nunca subestimado, = ——— rr te 1 8.4 Anilisis de algoritmos segein su aprovechamiento de memoria Si bien la evoluclén y ta aisminucién dl costo del hardware parece indicar que la memoria 23 Un recurso cada vez menas criico, existen muchas apicaciones en las cuales ain es impor- tante su aprovechamiente, Desde oste punto de vista, a seleccién de la estructura de datos a utilizar y la forma en que ‘se maneje su contenido determinaran la eficiencia del agortma, _] 8.5 Eficiencia en algoritmos recursivos La recursividad os una herramienta muy poderosa que puede dar soluciones ciaras a proble- mas complejos. Hasta ahora se he Intantaco escribir algortmos recursives sin analiza la ef- lercia de fa solucién obtenida con e! simple objeto de aprender el concepto de recursién. La recursividad tiene algunas deeventajas desde el punto de vista de eflciencia debico a + Eloverhead ‘sobrecarga) de tiempo y memoria asociado con la lamada a subprogremas. (Nétese que la recuri6n por definicién involucra un nGmero de autoinvocaciones) * La ineficiencia inherente de algunos algoritmos recursives. Davinci verdadero uso de la recursividad es como ura heramienta para resolver problemas ara os cuales no hay una solucin tertiva sencila En estos casos la recursividad permite obtener una expres clara del algrtmo en base la dafinicién det arcblema original ‘A continsacdn se analiza ol problema doles conejos(Helman, 1987) con el fin de mostrar es tos conceptos de ineiclensa: Function conejos(n: word) : {on es un entero positive ) begin ifn <= 2 then conejos := 1 alse Conejos := Conejos{n-t) + Conejosin-2); nora; FEE Osea se caleua, cor serplo, Cones)? ee.) ee] | ES] cmecidiaee) eater [Gere] coneo |) Senie@ |) coniomn | Eee.|[ oor |[ eee | amen ae Laer LS Sree |[ exe | Como se puede vere problema fundamental de asta func es que fos mismos valores son cal ulados una y tra vez. Por sjemp, Conejs(3) es calulado ds veces y Conejos) tres voces (Guando n es grande, a cantcad de veces que se calcula lo mismo crece considerablemente, ese al ejemplo anterior, hay algoritmos recursives que son muy'eficientes y en particular més eficientes que las soluciones no recursivas. En lo que sigue del capitulo se discutirdn les solu Clones de busqueda y ordenackin de datos, en las que as soluciones recursivas seran muy eft lentes. Asimismo, en el tratamiento de arboles y grafos que se verd en el capitulo 9, wl lector fencontraré que las soluciones de varios algoritmos resuitan naturalmente recursivas, {5 8.6 Estimando et tiempo de ejecucién de un algoritmo recursivo En el caso de los pracesos recursivos, no es posible ordenar al trabajo a realizar de modo que Se utlicen solo evaluaciones y@ reaizadas. Lo que se debe hacer ahora es asociar a cada pro. t Ta o a sinst ‘Supanlonds que n>2, se puede desarrola Tin-1) par obtener Tio) = 26+ Tin-2) sie Esto es int) =¢ + Ti0-2 como so puede ver al susttuirn por n-t en (1). As Bes, 2 posible reemplazar T(a-1) con c + Tn-2) en la ecuacién Tin) = + T(n-t, Después se puede usar (1) para desaroliarTin-2), con io que se obtiene: Ta) =3¢+ Tin-3) sid _y 28 soceeivamente En general, Ta) =e + Tine) simi Por iim, cuando l=n-1, se obtiene: Tn) =c(o) + T(t) =e (tel) +d 1G (2) se concuye que Zo es O(n. Es important abservar que on este ansis s8 ha supues- {tu que fa mutiplicacién de dos enters es una nperacién de tiempo O(), esumiendo, se puede ver que el método general para resolver una ecuacién de recurensi, consist en reemplazar en forma repetida los términos Tk) del ad cerecho de fx ecuacién, hasta obtener una expresién donde Fro aparece, Por otro lado, cuando la recursin es utlizada por la caracteristica del problema no como un ‘simple reemplazo a Ia iteracién, el calculo del tiempo de ejecucién puede ser un poco més compe. 1 8.7 Algoritmo de bisqueda 8.7.1 Introduccion Los humanos han recolectaco informacién desde mucho antes que las computadoras apare- cieran. Esto s2 ve elempilicado por los datas de los censos, las registros de libros de las be biotecas, los precios y las istas de Inventarios en un comercio o las fichas de fos alumnos ‘egresadios de una Universidad; toda esta informacién y mucha més es aimacenada con agin propésito especitic. Ee Dada una coleccién de elementos, es posible extraer dos tipos de informacién: ‘+ Informacién relativa al conjunto de datos de dicha coleccién + Informacién detallada de algin ter en particular Volviendo a fos ejemplos mencionadas en el pérrafo anterior, la distribucién por edades de la poblacién de! pais, el nimero de libros de la biblioteca o el vaior del inventario actual de una fempresa son ejemplos del primer tipo; en cambio, la edad de una persona o el 6aN de Un libro de la biblioteca o el valor de un tem de un comercio son ejemplos de! segundo. En los casos en que se requiera informacién particular de un item de la coleccién, este de~ be ser ubicado y extraido de la misma, Definicion proceso de ubicar informacion particular en una coleccién de dats es wnacido como algn- to de bisqueda, Por lo general, se est familarizado con dlstintas formas para buscar informacion. No es lo mis- ro buscar un ndmero de teléfono en la guia telefSnica que buscar una carta on un mazo de Cartas y ambos difleren de la manera en ue se intenta encontrar la pisza que faita para resol- ‘ver un rompecabezas, Como muestran los ejemplos anteriores, la manera de buscar a informacion depends dela forma len que los datos de la ccleccion se encuentren organizados. Como conclusion, eordenando nuestra Informacion adecuacamenta es posible mejorar nuestra capackad y eficiencia de busqueda. ‘Como ejemplo se puede pensar en cémo cambiaria la hisqueda de un nimero en la guia telefénica siesta no estuviera orlenada alfabéticamente, sino por el orden temporal en que los teléfonos fueron conectados. En un método de busqueda tipico se cuenta con unalista de tems que se representardn por aft], aft], y 6s de interés saber cuando un determinado elemento x partanece la coleccién. En caso {que x pertenezca ala lista, sera importante conacer valor de jal que x = all, dicho indice sera de ran utlidad 8 se piensan modifica los valores del tem x enlalista (por elemplo, modiicar el nom- bre de una persona que ha sido ingresado incorectarente) o acceder ala informacién (al como un ‘numero de teléfone) de x en otralista b(t)... bf] asociada a aft, .. fn] por algun entero En todos los casos, las métodos de biisqueda consisten en focalizar un dato que tiene una propiedad particular (or ejerrpla, una estructura con un componente igual a x) y en caso de encontrar, retornar alguna informacién relaclonada con el tem (por ejemplo, su posi. A continuacién, se desarola la bisqueda de datos en colecciones organizadas como vectores. Se utlizarén métodos diferentes teniendo en cuenta s los datos del vector aparecen ordenatios, como ‘ccurre con la guia telafonica, o desordenades, come ocurre con las cartas de un mazo de caras. 8.7.2 Busqueda Lineal ‘Cuando se debe buscar un elemento dentro de un vector sin tener informacion sobre fa mane= +a on que este cio se encuentra organizade, una focrna de proceder es comenzar desde al principio de la estructura, analizando los elementos que contiene une a uno hasta encontrario (hasta legar al final. Este tipo de busqueda es conocida como busqueda lineal ya que procede linealmente (en forma secuencial a través del vector. En esto punto, donde se asian implementando y analizando los diferentes aigoritmos de 'uasqueda son de interés todos los detalles de implementacion, Sin embargo en el momento de Ltlizar uno de estos métodos, estos detalles piercen importancia y solo interesaré fo que el al= ‘goritme hace, y no cémo lp hace. Con este crterio, es posible pensar en los algoritmos siguien- tes, como pertenecientes a bibliotecas intercambiabjes que se lamarn busquedae, busquedat, ete, dentro de las cuales Nabré. un método de busqueda cocificado de una manera uniforme ‘como busqueda(a,n, x, |) donde ‘+ aes un vector que contiene n elementos * xe al tem a buscar ‘+ 95 un incice cuyo Valor es calcuiado por el método de busqueda utlizado de ls siguien- te manera: x = af] six partenace al vector a y| = 0 en caso contrario En lugar de decid @ prior el tipo de datos sobre los cuales se han de aplicar estos algoritmos, se utilzardn las siguientes declaraciones a fin de dejar este toma para una etapa posterior. { maxima long.de la Lista } { tipo al cual pertenecen los elem.gel vectar } const maxen type tipoelen indice = 6..maxlen; Vector = array[1..aaxlen] of tipotlem; ‘Un primar intento de codiicar una busqueda lineal dard un algoritmo que examina sucesiva~ ‘mente cada elemento de la estructura inicializando (‘setsando") el valor del indice j cada vez ‘que encuentre el valor de x en a, 0 inilalzando el valor de j en 0 si nunca lo encontrd. Esto podria representarse a través del siguiente procedimiento: Ejempio 87 Precondlcén © nce maxlen Poscondiin: ‘| tal que x =a] six es alguno des elementos de + J =0-caso contraria [a { pisquedae ; busqueda { (version ineficien Procedure buscar( a: tvecto neal ce x entre aft], ..., aio } | r clén de items } a: indice: do elenentes de a} x Jem; ( item’ buscar } var j + Indice }; { indice de x } var k: Anaaeas 1 ton do xeatk) then} 2s ki (tin de Ta busqueda) Esta busqueda es clararente ineficiente, Se puede ver que se recorre e vector comoleto aunque x s2a el primer elemento. Adems el vector a est pasado como un parémetro por valor, esto Se debe a que el valor del mismo no debe sef modificado por el procedimiento. Esto titimo @s co recto pero ene el inconvenients que este tipo de pasaje de parémetros implica la construccién ‘de una copia de a, necho que ademas de consumir memoria (es importante tener en cuenta que Sieltamaiio del vector es granda, puede resultar una operacién prohibitiva)insume tiempo, A continuacién se presenta una segunda versién del método de biisqueda lineal que pasa cl vector como parametro de entrada, salida para shorrar tiempo y etorns el valor de tan pron- to como sea posible: Poseondicidn ‘jt que x =a] sx 8 alguno de os ele +] = 0-caso contra 8 dea {oOsqueds’ : pusqueda Lineal de x entre aft], ..-, ain) ) Procedure buscar( var a: tvector; { colaceién'de tess ) n: indice; { cantade elementos de a } to tipoeisn; {Sten a buscar } var}: indice}; { indice ex var ks wore; | begin Vocal (<= n) and (x © afk] } a0 is ee ty (iony tren | 20 tise jk; end; (fin de 1a busqueda | TO Es comiin que ademas de desear saber si un elemento pertenecs o no a una coleccién, sea de interés incorporaro a la misma en caso de que no pertenezca. Con este objetivo, se desarrolia {a tercera alternativa del método de bisqueds lineal: Poscondicién: + | talque x =af + = Wejon + 1 51x no perteneca al vector © alejon+ tl =x {bosqueda2 + busqueda lineal de x entre aft], s+» alo!) [ineorpora x al vector si no pertenece} procedure buscar(var a: tvectors {eoleccién Je items} var ni indice; {eant.de elenentos d2 a} x tipotlen; {item a buscar) var j: indice ); (indice oe * } {begin alavty ean wnite (x © af)] ) do piety af) ($n) then nen tf eng} (fin de 1a busqueca) ‘Se puede observar que este itime eédigo comienza agregando el elemento buscado al final el vector, de esta forma puede reducir la cantidad de preguntas de cada iteracién a la mitad ‘aque la condicién que verfcaba si el vector habia terminado no necesita ser probada nueva- frente, ya que ahora el dato a buscar seguramento exists. Esto redundaré en un algoritme més tficiente que el anterior, dado que la cantidad de consultas realizadas se reduce practicamen- tea la mitad, pero tiene como contrapartda una precondicién mas estricta que antes, dado que ‘ahora n debe ser menor que maxlen como una forma de garantizar que el vector tendra espa- cio para reciir un componente nuevo. Elitem ubicado al final det vector en este timo algoritmo es conocido como “centinela” ya que es quien evita que el lazo no se repitaindefinidamente, 8.7.3 Busqueda binaria Cuando los tems del vector se encueritan ordenados de manera creciente, la bUsqueda lineal po- dia terrinar tan pronto como se haya encontrado el elemento buscado 0 cuando se haya encon~ trado uno ce mayer valor. Sin embargo, existe otra estrategia que puece apiicarse en estos case. Ez La busqueda binaria sobre un vector oidenado se basa en la eotrategia de “divide y vence- ris” y aplica el mismo crterio que el que se uilza para encontrar el cero de una funcién continua, En una bisqueda binaria se compara el tem buscado con el que se halla en el medio del vector. Sos dos elementos son iguales, la bisqueda ha terminado. Si el elemento buscado es. menor que el que se halla en el punto medio del vector, se continda la busqueda en la primera rmitad det vector, en caso contrario se continia sobre la Segunda mitad. E! hecho de que el vec- tor esté ordenado es lo que permite ignorar el 5096 de los datos con una Gnica comparacién, Se continia de esta manera, restringiendo el andlisis a porciones cada vez mas pequefias, {el vector. El proceso termina cuando se encuentra al elemento buscado (cuando coincida con lun punto medio} © cuando la porcién del vector sea tan pequetia que ya no contenga elemen- tos en cuyo caso se podré conciuir que et elemento ro pertenece al vector. Pocono: + nc maen + all] Procedure buscar( vara: tvector; {coleceién ‘de tens} i indices” {eantsde elementos de a} 1: tipotien; {ites a buscar} var}! indice 1; {indice de x} var pei, ult: sndsea! (limites. de la busqueda) edie: indices {punto nedio} begin yi; { aun 90 encontrado} pea sty {oisqueds Sobre el tie i ni (rector compievo:} odio := (pri + ult) div wmile (prisuit) and (x<>a{mediol) do begin if x’ posicion tnen begin if posicion then westein(nroelen, no encontrado *) else writeln(nrvéles," erréneanente encontraco en’, posicion); end end; tionpoFinal := GetourrentTine; writen; Westeln('Tsenpo Pronedio de busqueda = °,tiempotnicial, ©", Tienporinal,” ”, (Téesporinal-Tiesporaicial) /long:8:6) ; end. ~Wigmigme Para aralizar los distintos algortmos de busqueda es ncesari inci a unidad Pascal corres pondiente (desde busqueda® hasta busquedas). Este programa mide ol tempo que necesita un algoritmo para encontrar todos os elementos del vector y lo divide por la cantidad de elernen- 108 que contione obteniendo de esta forma el tiempo promedio. Para hacer esto, se utiiza i funcién GetcurrentTime que retoma la cantidad de milsegun- dos transcurrides; esta funcién no pertenece al Pascal esténdar, con lo cual et lector deberé adaptaria al compilador que esté utlizando. La Tabla 8.1 muestra fos tiempos promedios (on milsegundos) necesarios para cada algo~ ritmo para hellar un elemento dentro de un vector de 1.000, 3.000 y 5.000 enteros utlizanco ‘una AT 686 de 100 Mhz. Como era de esperar, el themge promedio de cada versién de la busqueda lineal crece fi- realmente con n, es deci, el tiempo necesito para hallar un item en un vector de 5.000 ele~ rmentos es casi cinco vaces lo que tarda para hallario en un vector de 1.000, Por titimo, e! método empirica aplicado en este ejemplo para comparar algoritmos muestra ‘que, el tiempo en of método de busqueda binaria crece con n mas lentamente que en la bis- queda neal, Esto se lustifica mediante e! andlisis tedrico que aparece @ continuacién. Sin em bargo, es importante recordar que para poder aplicar este métoco, los elementos del vector de~ bben ser ordenades, ‘Algoritmo i=g000_| naSon0 Bisqueda lineal nefciente (bisquease) | _ 1.500 3000 | 65s Bisqueda ial (ocsquedat) 900 2306 | 3.928 ‘Bisqueda nel oo centinela(oisqueda2) | 850 10 | 3076 Bisqueda binarla(BUequedaa) on a En realidad, se esperaba una mejora del 50% pero se puede ver que solo loga al 4076. 20u8 Tue lo que ocuri6? El problema esta en que el Borland Pascal maneja de una manera més ef- ciente los lazos tipo far que los wie. De aqui que la ventaja que se pensaba tener reducien- {0 el numero de comparaciones se ve teducida por un incremento det trabajo en cada pasada. Por dltimo, el método empitice aplicado en este ejemplo para comparar algoritmos muestra ‘que ol método de bésqueda binaria tiene una velocidad de crecimionto mucho menor que los lineales, Esto se vera justiicado mediante e! andlisis teérico que aparece a continuacién, Sin ‘embargo, es importante recordar que para poder aplcar este método, los elementos del vec- tor deten astar ordenados, 8.7.4.2 Anélisis Tedrico Para enaiizar un algoritmo teGricamente, se debe contar el nero de veces que este realizaalgin ‘paso esencial. Como los algoritmos de busqueda deben comparar elementos, se analzard al n= ‘mero de comparaciones expresado como una funcién de la cantidad de elementos del vector. A continuacién se ealiza al andlsis para ¢! peor caso y el caso promedio de una busqueda binaria. AAndlisis del peor caso en una busqueda binaria. Para determiner el peor caso de una busqueda binara es necesario contar ol nimera de items tn el vector que pueden ser encontracos con a lo sumo m comparaciones, es deci, examinan- do a lo sumo m elementos. En caso de sor posible realizar una Unica pregurta solo sera posible hallar un elemento, és te serd el que se halla en el punto medio del vector. Sia esta pregunta se fe pueden agregar dos ms, serd posible encontrar dos elementos més, al que se encuentra en la posicién 1/4, siendo n la cantidad de elementos del vector, y el que se halla en la posicién dni, En general, cada prueba adicional permite encontrar el dable de elementos de los obteni- dos hasta el paso anterior. Fesumiendo: on i prueba se encuentra 1 tem con 2 pruebas més se encuentran items més <- se tiene un vector de 3 items con 3 pruebas més se encuentran 4 items mas. se tiene un vector de 7 items an m pruebas més se encuentran 2-1 ems més\engo un vector de 2n-t Roms eo anterior se deduce quo la busqueda binaria permite hallar cualquier elemento dentro de lun vector de 2-1 elementos utlizando alo sumo m comparaciones. Dicho de otra forma, s una ista contiene n items, la bisqueda binara utiizard en ol peor ca- ‘50m comparaciones para hallalo siendo m el menor entero tal que aten Resolviendo esta desigualdad para m se puede hallar que aranet © malogein+t) donde logts ese ogeritmo on base 2 do x. Finalmente, m = [logei+1)] donde (x] presenta el menor entero que es mayor 0 igual que x De este andlsis se obtiene que la bisqueda binara requiere, en el peor caso, un tiempo cal= ‘culado a través de una funcién logartmica contra el tiempo calculado mediante un medolineal requerido por la busqueda lineal, esto es, a bissqueda binaria utiiza un tiempo proporcional al loge(n+1), donde n es la cantidad de elementos del vector, mientras que la busqueda lineal ti- liza un tiempo proporcional an, ‘Medida de los requerimientos de tiempo de los algoritmos de bisqueds, a Tabla 8.2 muestra que existen diferencias notables en los recursos requeridos por los algo- rltmos con tiempos de ejecucién que crecen de forma proporcional a n. Los algoritmos que tie nen requerimientos de tiempo calculadas en forma logaritmica son muchos més eficientes que los algoritmos con requerimientes de tiempo lineal. ‘Aungue un algortmo iogaritmico realice mayor trabajo que otto lineal por cada paso sobre los datos, siempre sera mas eficiente para valores grandes de n (esto se puede ver en al algo ritmo da bisqueds binario 0 dicotérnico donde por cada punto a analizarreaiiza mas trabalo ue el lineal pero dato que se aplica a menor cantidad de datos, resulta ser el més eficiente). En la Tabla 8.2 se puede ver que las funciones logerltmicas cracen en forma més lenta que la lineales. De la misma manera, las lineales crecen en forma mas lenta que las cuadraticas y stas que las exponenciales. Finalmente, los slgortimos exponenciales son totalmente ineicientes aun para valores chicos den Tasa de Crecimiento | | N=10 rato | a=1000 Toga Toazin a 36 Ww neal 10 woo [4.000 ‘Oszarica ioo__| ¥0:000 | ¥:000,000 Exponencial: 2 1.04 = a = tablea2 Anélisis del caso promedio de la busqueda binari Para poder analizar la cantidad de comparaciones promedio realizadas por la bisqueda bina- ‘ia es necesario contar al nimero de comparaciones necesarias rara encontrar cada elemento fen un vector de longitud n y promediar el resultado. ‘Se supone por simplicidad que n = 2"-1. Haciendo una extensién del andisisreaizado para 1 peor caso es posible legar a la Tabla 8.3. Nr exacto de] de demertan que pueden] NV Toal de prucbas para [Comparaciones | ser encontrasos encontrar todos los items 1 1 at De donde el numero total de pruebas requeridas para encontrar todos los items del vector 6s: (1x1) + 12) + (Bxd) +. Fam Para expresar esta suma s como una funcién de n es posible escribir: 2) + xd) +. + (met) 2m 2 Rastando s de 2s se 2btiens Bae 2- d= Bee mee Dado quen=2"-121+244+..42" Se lega a que s = m2" -n, 010 que es lo mismo s = (nt loge (n+) «9 Por fo tanto, el nimero de comparaciones requeridas para encontrar un elemento en un vector de longitud n= 2°- 1 es s/n 0 loggint) ~ 1 + (logelnet)/n) cl cual es apenas una fraccién de una comparacién més chica que o! némero de pruebas re- ‘queridas en ol peor caso. Refiexionando sobre ol andlsis realizado, se observa que es posible utilizar el andisis teéri- cco para extrapolar las estimaciones del comportamiento de un algoritmo de manera de poder apiicartas a casi ‘bados. Por ejemolo, la bisqueda binaria en un vector de 12.000 ele- ‘mentos es aproximadamente 44 veces mas répida que utiizando un método de busqueda Ii- real. Esto se puede ver en el andlsisteérico ya que 5.000 (promedio de comparaciones en la busqueda linea) es 44 veces mayor que el loga(10.000-t) |A pair de los desarrollo anteriores, se puede conclu que el peor caso es mis faci de caloular quo 1 caso promedi, ya que este ultimo implica tener idea de todas las pruebas a tener en ‘cuenta lo que generzimante concluye en expresiones mas complejas. | 8.8 Algoritmos de ordenacién Ena primera parte de este capitulo se comprobé que la organizacién de la informacén permi- te realizar busquedas mas eficientes. Por ejemplo, el orden alfabético dela guia telatnica per- nite hallar répdamente un nomero de teléfono; en cambio si el orden fuera crecierte por nd ‘mero de teléfono, sera facil saber quién tiene un numero dado. En ambos casos, la trea puede ‘ealizarse més efcientemente dado et orden inicial entre los elementos de la estructura, Definicién proces pore cual, un grupo de elementos se avede ordenar se conoce como algortmo de ordenacin, TE Los algoritmos de ordenacién han sido muy estudiados, particularmente por sus aplicaciones. A continuacién se presentan algunos algoritmos de ordenacién en vectores que si bien son ‘muy sencillos de interpretare implementar son ineficientes. En una etapa posterior se analiza- ran otros que son mas complejos y eficientes. 8.8.1 Consideraciones generales Los algoritmos de ordenacién mas sencilos buscan intercambiar los elementos o llevarios al lugar adecuado de manera ce dejar la estructura ordenada. Como forrna de unificar la codificacién de los algoritmos de ordenacié, se lamard a cada uno ordenar(a,n), donde a es un vector de n elementos. Los algoritmos de ordenacién serdn ubicados en distintas bibliotecas ordenart, ordenar2, ftc., con lo cual, seré necesario referenciar la biblioteca correspondiente para poder utlizaro ‘Se supone que cada biblioteca conoce las sigulentes deciaraciones: Cada const maxlen = . { mixin longitud de 1a lista } type tipoelen { tipo al cual perteneces 108 elenentos el vector } indice = 0, .naxlen; tvector = array[1..maxlen] of tipoelem; 8.8.2 Método de seleccién Este es et algoritmo de ordenacién mds sencilo. Para ordenar un vector de n elementos, ft), «af, ‘busca el elemento menor segin el erterio adoptado y lo ubica al comienzo. Para mantener la dimensién del vector, se intercambia con aft]. A continuacién se busca el segundo elemento ‘menor del vector y $2 intercambia con a[2). Continda asf sucesivamente tuscando al préximo ™menor y lo coloca en su lugar, hasta que todos los elementos quedan ordenades. Para ordenar un vector completo es necesario realizar n-1 pasadas por el vector. En la ésima asada, toma el i-6simo menor y lo intercambia con al, Luego de n-1 pasadas, el elemento n= ‘Tha sido ubicado en su lugar y el elemento més grande queda acomodado automséticamente, La Figura 82 presenta el funcionamiento de este método. ———_—— E Eaters) its et nein tena soos trim yPlon ait pe inet co GEBrE) S Fguaae El algcrtmo podria codifcarse de la siguiente forma: {Grdenart: Ordena el vector a por el método de seleccién } Procedure Ordenar ( var v: tvector; { vector a ordenar } i indice }; { cantidad de elenentos ) var 4, J, pt indices { indices auxiliares } item’: tipolen; { elemento del vector’) begin for i:=1 to at do begin { busca el minino vip] entre vit], ...) vIN] > foes for j = a6 ton ao af vid 1 < vt p | then p:i; {antercambia vis] y vit iten i= vt Ty veel se vidy; vt i | i= items {ahora v{t] <=... <= vid] y adends, vfAl <= vfj7 con s vt 31d then begin { intercambiar elenentes ites i= vt J 1; Medd ve set ds vi Jet] 2 tem; end; fanora v{i] <= ... <# viol y vif] <= v{s] con texj vt it} then begin { intercanbiar elementos } stem = v0 4 15 vo) = vba 1s vi Jet js etany hupoanbio := True; ends { anora vil} <= iieg tp until( (2 < 2) or not Hubocanbio 5 ent vin} y vis] <= VEL} con teay<4 aa a=) Pees a estas modificaciones, como se vera més adelante, este método no es precisamente de Jos més efciente 8.8.4 Método de insercién. Este método ordena el vector de entrada insertarido cada elemento afl entre os it anteriores, {ue ya estén ordenados. Para realizar esto comienza a partir del segundo elemento, suponien= do que el primero ya esta ordenado. Si los dos primeros elementos estan desordenados, los, intercambia. Luego, tora el tercer elemento y busca su posicién correcta con respecto a los dos primeros. En general, para el elemento |, Busca su posicion con respecto a los i+t elemen- tos anteriores y de ser necesario lo inserta adecuadamente. La figura 84 presenta el comportamiento del método, sue OGCETET ETE] smonate rons S[ETETE1e] vetoes vues STSTST sos eis soa se Figura 84 El cédigo que aparece en el sjamplo 8.14 muestra la implamentacién en Pascal del proceso. Ordena el vector @ por el métogo de insercién } Procedure Orgenar (var v: ‘vector; {vector a ordena” } ni: indice ); { cantidad de elenentas } indice; { indices auxiliares } sien: eipoelon @lenento dol vector} hubotaraio: boolean; { indica si huso cambios} begin for i:=2 ton do begin ‘item i= v[i}; j't= ity { apunta al primer elemento 2 comparar } wnile (J50) and (vl j ] > item ) 0 begin’ VEGM Je vid]; ($e corre 1 lugar @ 1a derecha } yyy eng; VE JS | se item; { Anserta el item } ol 8.8.5 Analisis de los métodos de ordenacién elementales Los algoritmos anteriores ordenan an forma creciente. El mejor caso es encontrar el vactor or denado y el peor caso es que el vector esté ordenado en orden inverso. Con el fin de medir el tiempo promedio de cada uno de los algoritmos anteriores y dado que 10 es posible medir al tempo que cada uno emplea para ordenar vectores en todos ios posi bles érdenes iniciales, se medira el tiempo que tarda en Ordenar un vector cuyos valores inicia les fueron asignads al azar. Para generar un vector con valores al azar se usardla funcién Random (n) que genera un i mero al azar entre 0 y n-1, de la siguiente forma: Procedure AlAzar( var v: tvector; ni indice 15 {asigna av valores enteros positivas de manera aleatoria © randon} var i,j? snaiee; Aten: tipotien; begin randomize; {para comenzar 1a generacién do nuneros al azar} for i:=1 ton ao VEL] = Random n) + 45 end; LUtiizando todo lo visto hasta ahora, el programa que mide el tiempo de ejecucién de un méto~ do de ordenacién quedaria at Program Tieapo0rdenacion; Uses wincrt, WinProcs, Ordneart; Procedure AlAzar( var vi tvector; a: indice 15 {asigna a V valores enteros positivos de sanera aleatorta o randon} var j: indice; begin randomize; {para conenzar la goneracién de nimeros al azar} for j:=1 ton 0 VIL i Randoa( ny + 15 ends Procedure cieck( var v: tyector; ni indice ) var ‘tiespotniesal, {{ Cosenza la ordenacsén } senpoFinal: longint; { Fin ga la ordenacion } J dneice begin Rienpotnicial := GetcurrentTine; ordenar( v, n); enpoFinal = SetcurrentTine; writeln('Tieapo =", tiempoFinal - tiempotnicial) ; i= 2; while (Jean) and (vEj-1}<*vE)1) 60 hej; if Jon then writeln( ‘Vector Ordenado') else writeln( "Vector DESORDENADO 11111 end; var}: integers vi tvector} inaic begin { Primer prueba: Vector pre-ordenado | for J:=1 to n do Mind I 5 vwesteln: writeln(-ordenando un vector pre-ordenada'); Check! v, ays { Segunda prueba: Vector en orden inverso } for zt ton 0 VOL is meyers weiteln; weiteln( Ordenanco un vector en orden inverso * Cheeks vn); { Tercer’urueba: Vector en orden random } Alazar( vy); writeln; writeln( ‘Ordenando un vector desordenado *); Check( vy, ena: ‘Si 0 utliza este programa para medir tiempos para los cuatro algoritmos anteriores (cambian do la biblioteca cada vez para poder referenciar el método correspondiente), s8 obtendran re- suttados comparativos notables, ‘A continuacion 9@ musstran los resuitados de ejecutar programa para vectores de 500 y 1.000 elementos con lferentes drcenes inicales. La Tabla 8.4 presenta el tiempo en milisegue dos para orcienar un vector de 800 elementos para los tres algorit os citados. La Tabla 8.5 pro-

También podría gustarte