Está en la página 1de 194
" ALGORITMOS + a1 ety. ae) my. eke MLL TABLA DE MATERIAS RESENTACION INTRODUCCION DE. LOS TRADUCTORES PROLOGO: |. ESTRUCTURAS FUNDAMENTALES DE DATOS Introduceibn Coneepio de tipo de datos Tipos dlementaes de datos Tipos elementals nermalizados Tipos subsampo Lrenructur tray Eh esteuctura repstro ‘Warantes dels extracts registro La estuctura conjunto (st) Representacion de as etrcturas array, registro y conjunto 110.1. Represenacin de os arrays 1102, Represeniacln de las esructras registro 4103. Represenactn de as connntos itructur fichero secuencial 7. Operadoreselomentaesdefcheros 2. Floheros com suberructre Testor LIV. Un programa para edicin de fichros Berccios Referencias 2 ORDENACION 21. Introducién 22. Ondemteon de srrays EL" Ordenacon pr insercn directa 23.2. Ondenactn por selceiin directa 223. Ordenactn por msercambi directo 234, Ordonaton por iterel con inermentosdecrecentes 33S. Ordena epi sn rb 234. Ordenacn por partcian 225, Obtenctin del medina 2258. Comparacidn de Tos metodo de ordenacion de arrays 2a, Grdenasion e ichers scucnciales SE Método de mesla directa 352. Mecca naral 253, Merctaequbrada mitiple 2394. Ondonaion potfsca 235. Disrbucin de on tramos inca Biecicion Rerencias vn TANLA DE MATERIAS J. ALGORETMOS RECURSIVOS 4, neoducion 1h Chane uza a recursion 1) Won jemplos de programas recusivos Li Algortimos de evueta ata (0 1 problena ets satrinoniosestables “Ti frablema del ssleceién Optima Heresios esorencas 4. PSTRUCTURAS DINAMICAS DE INFORMACION 4.1. ‘ipo recursvos de datos 1h Punteros o referencias AX. Use Uncles ENT Operaciones basins ‘Lltasordenadas 9 lstasreorgantzables ina apleactn: ordenaciontopotigion ictus bol ‘Defnconesv conceptosbiseos Operacioes bisieas con betes Bnaroe inisqued'eincerctin en drboee Morrado on iroles Anais del suede inserciomensirboles “Arboles equibrador 447) Insrcin'en abolesequlibrados 4S. Borrado em srboesequitbrodoe 49, Arboles de bisquedsfprimoe 4210, “Presentaciin de esrctaras dbo 48, Abols multicaming PST Arboles B 132. Artoter 8 binarios 446, Trinstonmaciones de claves ashing») AG. Elecclin del fncion de ansformaciin 452 ‘Manejo de colsiones 423, Anas del Método de transormaciin de claves Eercicion sferencas S._ PSTRUCTURAS ¥ COMPILADORES DE LENGUAIES SL. Definicié y estructura des lngusjes SI Anis defenses SiC Comstrucegn de un grafo sintetico Sa, ‘Comtrvcetin de un snalizador para una sintaxis dada SS. Construccion de un programa anaizador diigo por tabla ‘0! Unteadoctor de BNF en etructuras d= datos para divigirsnaizadores enauate de prograacton PLO SA Unltnalzader intueticn para PLIO S| Tratamiento de erroressntactioos S10) Ua'peocenidor PLD SI Generseion de ebdizo AreNDICES AHL CONJLNTO DE CARACTERES ASCHL 1 DIAGHAMAS SINTACTICOS DE PASCAL ANAS, PRESENTACION Debido a la complejidad de los temas y al proceso de cambio constante en et campo de la informdtica, las publicaciones en este sirea oscilan habitualmente entre Jos simples manuales de programacicn y la monografia excesivamente especializada, tno siendo, en cambio, ficil encontrar textos adecuades para la ensehanza de pro- sramacién que atinen modernidad, generalidad » profundidad en el tratamiento, com funcionalidad didietica. Un texto que cumple las condiciones anteriores, como lo demuestran las siete caliciones en menos de tres aitos que se han Hevado a efecto de su version inglesa, sel presente libro del profesor Wirth, que incorpora fos desarrollostiltimos, tanto en lo referente a la gama de algoritmos que describe, como a su metodologia de ceomstruceién. La Facultad de Informatica, que sigue una linea de apovo a ta creacién de una uve auuténticamente cientifica de la informitica en nuestro pais, es consciente de ta ‘inportancia que tiene este libro tanto para la consulta de las profesionales como ura texto de enseftanza de programacién en las centrox universitarios ¥, por ello, tha dhudado en impulsar la iniciativa de los profesores Angel Alvarez Rodriguez v toxé Cuena Bartolomé de esta Facultad de realizar su version castellana, conside- ‘auto la indudable calidad de esta publicacion RAFAEL PORTAENCASA, DECANO DE LA FACULYAD DE INFORMATICA DE MADRID 1 ESTRUCTURAS FUNDAMENTALES DE DATOS 1.1. INTRODUCCION Los modernos computadores digitales fueron inventados con la idea de facilitar y acelerar eélculos complicados y onerosos de tiempo. En Ia mayoria de las aplicaciones, su capacidad de almacenamiento y acceso a grandes masas de informacién juega un papel dominante y, por ello, se considera ésta su carac- teristica primordial, es decir, su capacidad para realizar célculos aritméticos ha egado a tener escaso relieve en muchos casos. En todos estos casos, la gran masa de informacién que es necesario procesar representa, en cierta forma, una abstraccién de una parte del mundo real. La informacién utilizable por el computador consiste en una seleccién de datos dela realidad, precisamente el conjunto de datos que se considera relevante para el problema en estudio, y a partir del cual se cree que pueden obtenerse los resulta- «los deseados. Los datos representan una abstraccién de la realidad en el sentido tie que ciertas propiedades y caracteristicas de los objetos reales se ignoran por- {gue no interesan para el problema conereto que se estudia. Por ello, una abstrac- cidn es, también, una simplificacién de la realidad. Puede tomarse como ejemplo el fichero de personal de una empresa. Cada cmpleado se representa (en forma abstracta) en este fichero por un conjunto de slatos de interés bien para ka empresa o para sus procesos contables. Esta infor- tnatcion puede incluir datos de identificacién del empleado, por ejemplo, su nom- Inve y sueldo. Pero, seguramente, no contendra datos sin interés tales como el color del pelo, peso y estatura. ‘Al resolver un problema, se uilice © no el computador, es necesario elegir una ubstraccién de la realidad, es decir, definir un conjunto de datos para representar li situacién real, Esta eleccién debe estar guiada por el problema a resolver. A con- tinuacidn, debe seleccionarse la forma de representar esta informacién, Esta » ESTRUCTURAS FUNDAMENTALES DE DATOS segunda eleccién debe hacerse en base al instrument con que va a resolverse el brobiema, por ejemplo en base a las posibilidades coneretas que ofrece el com= utador. En muchos casos, estas dos etapas de diseiio no son totalmente inde vendientes una de otra. La cleceidn de la representacién de los datos es a menudo bastante dificil y ho est determinada exclusivamente por los instrumentos disponibles. Deben lenerse siempre en cuenta las operaciones a realizar con los datos. Un buen ejem- blo ilustrativo de esto es la representacién de los mimeros que son, a su vez, abs- traeciones de propiedades de objetos a caracterizar. Si la adici6n es Ja Gnica (0 al menos predominante) operacién a realizar, una buena forma de representar el ‘nlimero 1 es escribir n barras. La regia de adicién, con esta representacién, es real- ‘mente obvia y muy sencilla. La numeracién romana se basa en el mismo principio vencillo y las reglas para sumar son igualmente simples para nuimeros pequefios. in cambio, la numeracién arabe requiere reglas que estan lejos de ser obvias (para mimeros pequefios) y por tanto deben set aprendidas de memoria. Sin ‘embargo, la situacién se invierte cuando se considera la suma de grandes nimeros © la multiplicacién y division. La descomposicion de estas operaciones en otras tuxis simples es mucho mas facil en el caso de la numeracién drabe, debido a su principio sistematico basado en el distinto peso posicional de los digitos, Es bien sabido que los computadores usan una representacién interna basada con digitos binatios (bits). Esta representacién no es viable para las personas de- bido al nimero, frecuentemente elevado, de digitos que son necesarios pero, 1 cambio, es muy adecuada para los circuitos electrénicos porque los dos valores 1y | pueden representarse en forma conveniente y fiable por la presencia o ausen- via de corrientes eléctricas, carga eléctrica y campos magnéticos, A partir de este ejemplo, puede verse también que el problema de representa- ‘iGn,a menudo, abarea varios niveles de detalle, Dado el problema de representar, hor ejemplo, la posicién de un objeto, la primera decision puede conducir a la ‘teccién de una pareja de nimeros reales que sean, por ejemplo, sus eoordenadas vartesianas 0 polares. La segunda decision puede llevar a una representacién on coma flotante, donde cada nimero real se describe por un par de niimeros nleros que representan una fraccién fy un exponente e al que se eleva deter- ‘minada base (por ejemplo, x = f+ 2*). La tercera decisién, basada en el conoci- Iniento de que los datos se almacenariin en un computador, puede conducir a una ‘wpresentacién binaria posicional de los ntimeros enteros y la decision final podria wr representar Los digites binarios por la direccidn del flujo en un dispositive ‘nsipnctico de almacenamiento, Evidentemente, la primera decision en esta ca- slena esti prineipalmente influida por el planteamiento del problema y las si- yatirutes son cada vez mas dependientes de la herramienta a utilizar y su tecno- luni. Asi pues, dificilmente podra pedirse a un programador que decida sobre lu firma de representar los niimeros que deben emplearse 0, incluso, sobre las acteristicas del dispositive magnético de almacenamiento. Estas «decisiones sle bajo nivel» pueden encomendarse a los disefiadores de equipos que tienen a st slisposicidn ka mis completa informacion sobr fa tecnologia actual, con la que Intmopuccion 3 pueden adoptar una decision sensata que, en general, seré aceptable para todas, (© casi todas) las aplicaciones en que intervengan nimeros. En este contexto adquiere significado el concepto de lenguajes de programa- cin, Un lenguaje de programacion representa un computador abstracto capaz de entender Jos irminusailizads en este Fenguaje, que pueden ser mas abstracy tos que los de los objetos utilizados por la maquina real. De esta manera, el programador que utiliza este tipo de lenguaje de «alto niveb estaré fiberado (© impedido) de tener que considerar cuestiones relativas a Ia. representacion 4c los nimeros, caso-de-que el niimero sea un objeto elemental de este enguaje 1a importancia de utilizar un lenguaje que ofrezca un conjunto conveniente de abstracciones basicas, comunes a Ia mayoria de los problemas de proceso de datos, reside principalmente en la fiabilidad de los programas resultantes. Es ini ficil diseiar un programa razonando sobre los conceptos familiares de nigmeros, conjuntos, sucesiones y repeticiones que razonando con bits, «pala tras, y saltos de secuencia, Desde luego, un computador real representard todos los datos, ya sean niimeros, conjuntos o sucesiones como grandes masas de bits. Pero esto carece de importancia para el programador, mientras no tengs que pre jocuparse de los detalles de representacion de las abstracciones que ha elegido y pueda estar seguro de que la representacion elegida por el computador (0 el com- pilador) es adecuada para sus fines. Cuanto més préximas son las abstracciones a un computador dado, més facil fe resulta al ingeniero o téenico de implantacién del lenguaje ia eleccién de fa forma de representacién, y mis alta es la probabilidad de que una eleecién Gnica sea adecuada pata todas (0 casi todas) las aplicaciones posibles. Este hecho de- termina limites definidos al grado de abstracci6n a realizar a partir de un com- pputador real dado, Por ejemplo, no tendria sentido incluir objetos geométricos, ‘como elementos bisicos de datos, en un lenguaje de uso general, ya que su ade- ‘atada representaci6n dependera, en forma importante, debido a su inherente com- plejidad, de Ins operaciones a realizar con tales objetos. La naturaleza y frecuencia Uc estas operaciones, sin embargo, seran desconocidas para el diseRador de un lenguaje de uso general y de su compilador y, por tanto, cualquier cleecién que sdopte puede no ser apropiada para alguna de las posibles aplicaciones. Las consideraciones anteriores han determinado en ese libro la elecein de la jn a utilizar en la descripei6n de fos algoritmos y sus datos. Por un lado, ‘© quiere utilizar nociones familiares en matemiticas, tales como nimeros, con- juntos, sueesiones y similares, més que entidades dependientes del computador tales como secuencias de bis, Igualmente interesa utilizar una notacién para la sie se conozca la existencia de compiladores eficientes. Tan inadecuado es util- var lenguajes fuertemente orientados a la miquina y, por tanto, fuertemente de endientes de ella, como deseribir los programas en una notacion abstracta «tue dje pentlicntes de resolver fos problemas de repr Lt lenguaje de proses encontrar un compromise entre ambos extremos y se utiliza a To largo de todo este libro [12 y ES} Fste Kenpuaic xe ha implantado satsfactoriamente en varios 4 ESTRUCTURAS FUNDAMENTALES DE DATOS computadoresy © hs comprobado que st notacén es Io sufcentementeprd- Xima a las méguinas eistentes como para que las caracteristics elegidas J 50 representacin, pucdan explicarse en forma tara, El lengua © tambien sul: tenet pio oor eae part a ALGOL. come pra las leecione enplicadat gut pueda eplicse,igualment? Men pa de estos lenguajes. " a 1.2. CONCEPTO DE TIPO DE DATOS En matematicas se acostumbra clasifiear las variables de acuerdo con ciertas caracteristicas importantes. Se hacen distinciones claras entre variables ldgicas, reales y complejas, o entre variables que representan valores individuates, con- juntos de valores, conjuntos de conjuntos, o entre funciones, funcionales, con- juntos de funciones, y asf sucesivamente, Esta nocién de clasificacin es impor- tante en igual medida, sino mas, en proceso de datos. Se adoptara de aqui en adelante el principio bisico de que cada constant, variable, expresién o funcién es de un tipo determinado. Este tipo caracteriza csencialmente el conjunto de valores al que pertenece una constante 0 sobre el ‘que puede tomar valores una variable o expresién, o cuyos elementos pueden ser uenerados por una funcidn En los textos matematicos el tipo de una variable se deduce, generalmente de lu forma de escritura, sin tener en cuenta el contexto; esto no es factible en los Programas, ya que, normalmente, s6lo hay un tipo de escritura utilizable en los ‘quipos de proceso de datos (alfabeto latino), Debido a esto, la norma comin mente aceptada es que et tipo asociado se manifieste explicitamente en una decla- racién de la constante, variable o funcién y esta dectaracién preceda en el texto «la tilizaci6n de cada constante, variable o funcién. Esta norma es especialmente ‘oportuna sie tiene en cuenta que un compilador tiene que elegit la representacién dal objeto en la memoria del computador. Evidentemente, la capacidad de me- tmoria asignada a una variable debe decidirse de acuerdo con el tamatio del eampo dle valores que la variable puede adoptar. Si esta informacién es conocida por el compilador, puede evitarse la Hamada asignacién dinmica de memoria. Esta «© muy frecuentemente la clave de una ejecucién eficiente de un algoritmo. Por tanto, las caracteristicas principales del concepto do tipo que ve utiliza «to largo de este texto, y que estén incorporadas en el lenguaje de programacién PASCAL, son las siguientes [1.2] Un tipo de datos determina el conjunto de valores al que pertenece una onstante, © que puede tomar una variable o expresién, o que pueden ser generados por un operador 0 funcién. 1 po del vor identifeado por una constant, variable o expres deicve dest forma ode su desaraion sn neestad de Gecuttrdl proceso, CONCEPTO DE TIPO OE DATOS 5 3. Cada operador 0 funcién presupone argumentos de un determinado tipo y produce un resultado también de un tipo determinado. Si un operador ‘admite argumentos de varios tipos (por ejemplo, se utiliza + igualmente para nimeros enteros y reqlés), el tipo del resultado puede determinarse a partir de reglas especificas’ det lenguaje. Por tanto, un compilador puede utilizar esta informacién sobre tipos para comprobar 1a compatibilidad y observancia de normas de las distintas cons- trucciones de un programa, Por ejemplo, puede detectarse, sin ejecutar el progra~ ima, la asignacién de un valor de tipo boolean (logico) a una variable de tipo aritmético (real). Este tipo de redundancias en el texto de un programa es muy Util en el desarrollo de los mismos y debe considerarse la principal ventaja de los hhuenos lenguajes de alto nivel sobre los lenguajes en cédigo de maquina (0 en- sambladores). Evidentemente, los datos acaban representandose por un gran hniimero de digitos binarios, independientemente de que el programa haya sido concebido inicialmente en un lenguaje de alto nivel, utilizando el concepto de tipo, o en un lenguaje ensamblador que no lo tenga en cuenta. Para el computador, la memoria es una masa homogénea de bits sin estructura aparente. Pero es, precisamente, esta estructura abstracta, la ‘nica que permite a los programadores reconocer significado en el mondtono paisaje de la memoria de un computador La teoria presentada en este libro y el lenguaje de programacion PASCAL cspecifican ciertos métodos de definicién de tipos de datos. En la mayoria de Tos casos se definen nuevas tipos de datos en funcién de otros definidos previa- mente, Los valores de tal tipo son usualmente agrupaciones de valorés compo- nentes de los tipos constituyentes definidos previamente y se dice que estan estruc- jurados. Si solamente hay un tipo constituyente, esto es, si todos los componentes son del mismo tipo, entonces éste se denomina tipo base. EI niimero de valores distintos que pertenecen a un tipo T se lama cardina- lidad (o cardinal) de 7. La cardinalidad proporciona una medida de la cantidad dle memoria que se necesita para representar una variable x de tipo T; y esto iilimo se expresa de la forma x: T. ‘Como los tipos constituyentes, a su vez, pueden también estar estructurados, pueden construirse verdaderas jerarquias de estructuras pero, obviamente, los Compouentes filtimos de una estructura deben ser atémicos. Por esto, también tes necesaria una notacion para introducir tales tipos elementales, no estructura los. Un método directo es el de enumeracién de los valores que van a constituir lipo. Por ejemplo, en un programa que trate figuras geométricas planas puede introducirse un tipo elemental llamado forma cuyos valores pueden designarse con los identificadores: rectdngulo, cuadrado, elipse, circulo. Pero ademas de ‘estos tipos definidos por el programador debe haber algunos tipos normalizados (o estindar) que se Taman tipos predefinidos: incluiran frecuentemente los vulores munéricos y légicas. Si existe un orden entre los valores individuales ef (ipo se dice que esti ordenado 0 que es un escalar. En PASCAL se supone que todos los tipos no esteucturados estén ordenados; en el caso de enumeracion 1s USTRUCTURAS FUNDAMENTALES DE DATOS explicit, tos valores se suponen ordenados segin la secuencia de enumeracién Con este instrumento es posible definir tipos elementales y construir agru hhacinnes, tipos estructurados, hasta el grado de complejidad que se desee. E |i. prictiva no es suficiente tener s6lo un método general de combinar los tipos vomciuyentes en una estructura. Teniendo en cuenta los problemas pricticos ule representacion y utilizacién, un lenguaje de programacién, de uso general, ‘leh ofrecer varios métodos de estructuracién de datos. Mateméticamente pueden «1 todos equivalentes; se diferenciardn en los operadores utilizados para cons- tii sus valores y para seleccionar componentes de estos valores. Los métodos Inisieos de estructuracién presentados aqui son el array®, el registro, el conjunto vel fichero secuencial. No se definen habitualmente estructuras mis compli vichis como tipos «estaticos»; éstas son, més bien, generadas «dindmicamenter Jurante la ejecucién del programa en la cual pueden variar de tamaiio y de forma, Vales estructuras son el tema del capitulo 4 e incluyen listas, anillos, arboles y patos finitos genéricos. tas variables y 10s tipos de datos se introducen en un programa para ser utii- zulos en proceso. A este fin debe disponerse de un conjunto de operadores, Tal ‘amie suesde con fos tipos de datos, los lenguajes de programacién ofrecen un ‘ierlo nimero de operadores elementales normalizados (atémicos) y un niimero ue métodos de estructuracién, de forma que pueden definitse operaciones com: blvias en funcién de los operadores elementales. La composicién de operaciones we vonsidera, a menudo, la tarea fundamental del arte de programar, Sin embar- 10, en To sucesivo, se pondri en evidencia que una apropiada composicién de los datos es igualmente fundamental y esencial 4s operadores bitsicos més importantes son la comparacién y la asignacién, lecir, la comprobacién de igualdad (y de orden en el caso de tipos ordenados) y la instcuecién que obliga a la igualdad, La diferencia fundamental entre estas «lox opvraciones se pone de relieve mediante la distincién clara en su notacién 1 lo largo de este texto, aunque, desgraciadamente, esta distincién aparece oscu- ‘evidsten lenguajes tan amptiamente usados como el FORTRAN y PL/I que uti- lizan el signo de igualdad como operador de asignacién. Comprobacién (test) de igualdad: x = y Asignaciba a x xi=y Vutos operadores fundamentales se definen para Ia mayoria de los tipos de tater, pero ay que advertir que su ejecucién puede involucrat una cantidad por tnte de estuerze de proceso si los datos son extensos y altamente estruc- Hinde Adeuras del test de igualdad (u orden) y el operador de asignacion, existe "at heen de eats pitas iil de enconteartnKérmino castellano sews esa tas vy Lv ipl gles qu por rl oy uiiemennte fai nth ‘IPOS ELEMENTALES DE DATOS 7 tuna clase de operadores fundamentales, definidos implicitamente, llamados operadores de transferencia. Estos aplican unos tipos de datos en otros, Son particularmente importantes en relacién con los tipos estructurados. Los valores cstructurados se generan a partir de sus valores correspondientes por los lamados. ‘cunsiructores y los valoses goinponentes son extraidos de los valores estructarados ‘mediante los llamados gelectores. Constructores y selectores son, asi, operadores de transferencia que aplican los tipos constituyentes en los estructurados y reci- procamente, Cada método de estructuracién tiene su pareja particular de cons- tructores y selectores.que se diferencian claramente por su notacién. Los tipos de datos clementales estandarizados también requieren un con- junto de operadores primitivos normalizados. Asi, junto con los tipos de datos normalizados de niimeros y valores logicos tambien se introducen las operaciones vonvencionales de aritmética y légica proposicional, 1.3, TIPOS ELEMENTALES DE DATOS En muchos programas los nfimeros enteros se utilizan cuando no estin inv lucradas propiedades numéricas y cuando cada entero representa una eleccién centre un pequefio niimero de alternativas. Para estos casos, se introduce un nuevo \ipo elemental, no estructurado, definido por enumeracién del conjunto de todos los posibles valores Cy, Cy «+5 & type T= (ene ay 1a cardinalidad de T es eard(T) ~ n. UsepLos {ype forma ~ (retangulo,cuadrado, clipe, cru) tape color — (rojo, amar, nerde) type sexo — (mascalna,femenina) (pe boolean = (alse, re) (ore dlasemana © (heres, arte, mercle, jueves, lens, sabato, domingo) type nioneda = (pesra, franco, marc, Wray doar, lr, rile, cruzer, yen) type destino = (flr, purgatora, ciel) {ape veicuo — (ren, autos, automorll,barco, avon) type graduacion = (soldado, cabo, sargento, teniente, capitan, comandante, coronel, general) ene bie ~ cmt, ovale, poem, ain type esetura ichero, array, registro, conhnt) tip conlctar” (uml descorgaa, pena, deselncad) La definicién de Liles Lipos introduce no sélo un nuevo identificador de tipo 18 ESTRUCTURAS FUNDAMENTALES DE DATOS sino también el conjunto de identificadores que designan fos valores de este nuevo Lino, Estos identificadores pueden ser usados como constantes a lo largo del programa con lo que aumenta de una manera considerable su inteligiblidad. Si, por ejemplo, se introducen las variables s, dh gy. var 5: sexo var d: diasemana var g: graduacion var b: boolean cs posible escribir las siguientes asignaciones = masculino domingo ‘comandante true sae vidlentemente estas instrucciones son mucho mas informativas que sus cortes- pondientes en cédigo numérico: srelo dis resullantes de suponer que las variables s, d, g y 6 estuvieran definidas como de lipo integer y que, a las constantes de los tipos anteriores, se hubiera hecho co- responder el niimero natural indicativo de su situacién en el orden de enumera- iin, Ademés, un compilador puede controlar el uso indebido de operadores arit- ‘mélivos con tales variables, definidas como no numéricas, asi como sucede en la instruceion, siasdl Sint embargo, si se considera un tipo como ordenado, es razonable introducir funeiones que generen el predecesor y el sucesor de su argumento. Estas se deno- ‘minan predx) y suee(x). El orden de los valores de T se define por la regla fi 0} (as) i+ Lunt (aft) = 2) VG = NY: ‘ethen «no esté este elemento en a> Puede realizarse uha’ variante de este programa utilizando la ténica del ventinela apostado al final del array. El objetivo de este centinela es permitir ‘una simplifieacién de la condicién que sefiala el final de la iteracién. var a: array[1..N + 1) of T; i: =0;a[N + 1]: = 35 (1.16) repeat i: = i+ 1 until afi] = x; if > N then uno estd este elemento en a» 1a asignacién a[N + 1]: =x es un ejemplo de actualizaciin selectiva, es de- iv, de-alteracién de un componente particular de una variable estructurada. in condiciOn esencial que se verifica, cualquiera que sea el niimero de veces que ww repita Ia instrucci6n i: =i + 1, es abl # x, para f= teeta esto en ambas versiones (1.15) y (1.16), Esta condicién se denomina por ello un invariante del ciclo la biisqueda puede, desde luego, acelerarse considerablemente silos elementos stim ya ordenados. En este caso el método de trabajo mas usual es el de division tepetida en partes iguales del intervalo en que debe buscarse el elemento. Este iétedo se conoce con el nombre de biisqueda binaria 0 de biseccién y se muestra vw (1.17). En cada iteracion se divide en partes iguales el intervalo entre los in- lives i yj. El mimero necesario de comparaciones es, por ello, como mucho Hop, (VD bali Ns repeat k: = (j + /) div 2; fx > alk] then: =k + else j: =k until a{k] =x) VG>D aan In este caso la condiciOn invariante a la entrada de la instruccién repetitiva es il athl Persona (winth”, ‘cHnus’, Fecha (18,1,1966), varon, soltero) Complejo 2 Fecha f 2008 9 it i oo a0 Zi ams 1973 1a] «| 1966 Fig. LA Restos de los tipos comme, fecke y persona {Los identificadores s,, ... Sq introducidos mediante una definicién de tipo ‘wpisteo, son los nombres dados a las componentes individuales,del tipo, y se nuulizan como selectores de registro aplicados a variables con esta estructura. ud una variable x: T su componente i se designa por i ® 1) ESTRUCTURAS FUNDAMENTALES DE DATOS {La actualizaciOn selectiva de x se leva a cabo utilizando la misma notacién a la tmuierda de una instruccién de asignacién: vu donde x; es un valor (0 expresién) de tipo 7, Dadas las variables registro. 2: Complejo Ji Fecha : Persona los si jentes son selectores de componentes de 2, f yp’ zim (Ge tipo real) f- mes (de tipo 1.12) P-apeltido (e tipo alfa) P-nacimiento (de tipo Fecha) > nacimiento - dia (de tipo 1. 31) Lleol del tipo Persona musta fimo un componente de un tipo regio poe sesso ver estar extuctrad. As, ps fos selectors pueden encadenarse Nat talmente fos diferentes tiposeatuctrantes pueden utiliarse de manera que unos formen parte de otro, Por ejemplo, el componente de un array aque a0 ver forma parte de una variable regs r se denomiva reali}, yl componente con nombre de selector s del elemento i de un array estructurado on forma de registro, se designa por: ° ali]-s HI producto cartesiano se caracteriza por contener todas las combinaciones de lementos de los tipos que fo constituyen: pero hay que hacer notar, a efectos de aplicacién practica, que no todas son «legales», es decir, significativas. Por ciemplo, el tipo Fecha definido anteriormente, contiene los valores (31,4,1973) y— 29,2,1815) «que son, ambos, fechas de dias que nunca tavieron lugar. Por tanto, la defini ile este tipo no refleja la situacién real, pero es suficientemente aproximada lectus prieticos, y corresponde al programador ase irarse de que los valores LA ESTRUCTURA REGISTRO 21 carentes de significado no se produzcan durante la ejecucién del programa. ‘A continuacién se presenta una parte de un programa que muestra cémo utilizar las variables registro. Tiene por objeto contar el nimero de «Personas» representadas por la variable,array a, que son simultaneamente femeninas y solteras, $ var a: array.” 'N] of Persona; ‘contador: integer’ contador : ~ 0; (1.22) for i: = 1to N do if (a{i] sexo = hembra) A ali] ecivil = soltero) then ‘contador : = contador + 1 lin este caso Ia condicién invariante del ciclo es: contador = C(i) en donde C(A ¢s el miimero de personas solteras, femeninas, que forman parte lol subconjunto ay, 4 tra forma de’ escribir Ia iltima instruccién utitizando una construcci6n slonominada instruceién with es: fori: = 10 N do with afi] do if (exo = hembra) /\ (ecivil ~ soliero) then 4.23) contador : = contador + 1 111 significado de with r do s es que los nombres de los selectores de tipo de la va~ niable r pueden usatse sin prefijo, dentro de la instruccién s, referidos ala variable La instruceién with, por ello, sive tanto para abreviar el texto del programa, como para evitar la doble evaluacién de la direcci6n de memoria de la parte tudexada a{i) Tn un ejemplo, més adelante, se supone que (posiblemente para agilizar su Imnsqueda) ciertos grupos de personas en el array a estin conectados entre ellos, 11a informacién de conexién se representa por un nuevo componente en Ia estruc- tuna del registro Persona denominado enlace. Los enlaces conectan registros en ‘aden de forma que el siguiente y el precedente de cada persona pueden encon- varie ficilmente. Esta técnica de enlace tiene la interesante propiedad de que vermite recorrer la cadena en ambas direcciones almacenando un s6lo niimero cw cada registro, Esta técnica funciona de la forma que se indica a continuacion, ‘Ne supone que los indices de tres elementos consecutivos de la cadena son hs 1s fn fay 1. Como valor pata enlace del elemento k se clige ines — n~t. La Forint de recorrer ka eadena hacia adelante se determina calculando ix) a partir ig cn fa Forma, 2 ESTRUCTURA FUNDAMENTALES DE DATOS ines = x + aly] -enlace Fu cambio, la forma de recorrer la cadena hacia atrés, se determina calculando iy ca partir de x = igor e y= fen la forma: ins = x ~ aly] enlace ‘Como ejemplo se incluye la forma de enlazar las personas del mismo sexo, en la Vabla 1.2. Nombre Sexo Eales 1 Caroting 2 2 Antonio v 2 3 Tine H 5 4 Roberto v 3 Sulkin v 3 © — Genovevs 5 7 Raimundo V 3 8 Maria H 3 5 Ane u 1 fo Matias v 3 ‘Tabla 12. Array on elementos deltipo Perana Las estructuras registro y array tienen en comin la propiedad de que ambas son estructuras de acceso directo, El registro es més general en el sentido de que hho requiere que los tipos que lo forman sean idénticos. En cambio, el array pre- settla mayor flexibilidad al permitir que sus selectores de componentes sean va- lores computables (representados por expresiones), mientras que los selectores de componentes de un registro deben ser identificadores fijos, declarados en Ta lefinicién de tipo de registro. 1.8. VARIANTES DE LAS ESTRUCTURAS REGISTRO En fa prictica es a menudo conveniente y natural considerar dos tipos de datos como variantes del mismo tipo. Por ejemplo, et tipo coordenada del pirrafo \crior puede considerarse como la unién de sus dos variantes de coordenadas, cartesianas y polares, que estén constituidas, respectivamente, por a) dos longi- tudes y 5) una longitud y un angulo, Para identificar la variante adoptada por tuna variable, se introduce un tercer componente denominado discriminante de ‘ipo © campo indicador. type Coordenada record case clase: (Cartesiana, polar) of Cartesiana: (x, y: real); VARIANTES DE LAS ESTRUCTURAS AFGISTRO 23, polar: (r: real; @: real) end Aqui el nombre del discrimisiante es clase, y los nombres de las coordenadas son x, y en el caso de valofes cartesianos 0 r, @ en el caso de polares. El conjunto de valores designados por el tipo Coordenada es la unin de los cortespondientes a los. dos tipos “Ty = Gaye realy Ty = (real; @: real) sat niimero cardinal es la suma de los correspondientes a T, y T,- Sin embargo, muy frecuentemente no se unen dos tipos enteramente distintos sino, mis bien, tipos con algunos componentes comunes. Esta es la situacion que so origea af trmino estructura registro variante. Un ejemplo lo consttuye el Lipo Persona definido en el pacrafo anterior en el que las caracteristcas relevan- ies registrar en un fichero dependen del sexo de la persona. Por ejemplo, para sn hombre, su peso y la tenencia 0 no de barba pueden ser de interés en deter- tninadas situaciones, en cambio, para una mujer pueden considerarse sigifica- lavas tres medidas caracteristcas (sin embargo, su peso puede ser confidencial) 1be las consideraciones anteriores resulta la definicién de tipo siguiente: type Persona = record apellido, nombre: alfa; nacimiento: Fecha: civil: (soltero,casado, viudo, divorciado): case sexo: (varon, hembra) of varon: (peso: real arbusio: boolean): hembra: (tamato: array I .. 3] of integer) end 14s forma general de la definicién de un tipo registro variante es ic record 5, Thi. 8en! Tet case 5,37 en tnaiTy (a2) | tat Cea! Taatened S| 24 ESTRUCTURAS FUNDAMENTALES DE DATOS Low w,y sy Son los nombres de selectores de componentes cuyos tipos son Ti, Tiy y-s, evel nombre del campo discriminante cuyo tipo es T,. Las constantes ¢y,---5 ‘em designan valores del tipo (escalar) T,. Una variable x de tipo T consta de los Fee MS BS ES sty solo si el valor de x + 5, = ¢4. Los componentes x sy, Sy constituyen Ii parte conan de todas las m variantes. Por consiguiente, debe considerarse un error importante de programacién cl uso de un selector de componente x 5,4 (I< h < m) cuando xs, # ce y (con referencia al tipo Persona definido anteriormente) conduciria a consultar si una seftora tiene barba o (en el caso de actualizacién selectiva) a obligarle a renerla La ulilizacién de registros variantes debe hacerse, por tanto, con sumo cui- duo y la mejor forma de hacerlo es agrupar las operaciones correspondientes a ‘cua variante en una instruceién selectiva, Hamada instruceién case, cuya estruc- furs ex una imagen de la de definicion del tipo registro variante case x.5, of e255 a (125) cat cad ‘4 representa las instrucciones correspondientes al caso de que x adopte la forma dle la variante k, es decir, se selecciona su ejecucién solamente cuando el campo iscriminante x-s, toma como valor ¢y. Por tanto, es relativamente facil po- nerse a salvo de errores en el uso de nombres de selectores comprobando que cule Sy contiene como selectores tinicamente 1 parte de programa siguiente tiene por objeto calcular Ia distancia entre dos puntos 4 y Bdados por las variables a yb del tipo registro variante Coordenada. Ll proceso de ealculo difiere segin las cuatro combinaciones posibles de eoorde- nas pokires y eartesianas (ver Fig. 1.4, UA ESTRUCTURA CONJUNTO (SET) 25 1} Fig. 14 Coordenucas polares y cartesianas, case a - clase of Cartesiana: case b clase of Cartesiana: d: = sqri(sqr(a x — b+ x) + sqrta-y ~ b+ yk Polar: d: = sqrt(sgr(a +x — b«r + cos(b @)) + sqr(a-y — br sin(b 9) end; Polar: case b- clase of Cartesiana: d: = sqri(sqr(ar + sin{ag) ~ b+ x) + + sqr(a-r + cos{a +) — b-y))s Polar: d: = sqri(sqr(a-r) + sqr(b- 1) —2ea-reb-rscosta-g —b-9) end end 1.9, LA ESTRUCTURA CONJUNTO (SET) {La tercera estructura fundamental, ademas del array y el registro, es la estruc- ra conjunto (set). Se define de la siguiente forma: tnper = sto 7. | 126) {os valores posibles de una variable x del tipo T son conjuntos de elementos de ». Hl conjunto de todos los subconjuntos formados por elementos de un conjun- i Th, se denomina canjunto potencia 0 conjunto de las partes de To. El tipo T, iver Kanto, es el conjunto potencia de su tipo base Ta Vinaetos: type entser = set of 0. . 30 type charset ~ set of char type estadocinta = set of excepeion HL segundo ejemplo se basa en el conjunto normalizado de caracteres definido por el tipo char; el tercer ejemplo se basa en un conjunto de condiciones de excep- Hin _que pueden definirse mediante un tipo escalar 24. FSTRUCTURAS FUNDAMENTALES DE DATOS type excepcion = (descargada, manual, paridad, desalinewda) los distintos estados excepcionales en que puede encontrarse una cin magnética. Dadas las variables es: entset es: charset 1: array [I . . 6] of estadocinta pueden construirse y asignarse a ellas, valores de los distintos tipos, por ejemplo, ile ha forma siguientet: es: = {1,4,9, 16, 25] ese PH] 13]: = [manual] tS]: = (1 116]: = [descargada . . desalineada} ‘Aqui el valor asignado a ¢[3] es el conjunto constituide por el elemento Unico nunual; a 1{5] se asigna el conjunto vacio, significando que la quinta unidad dle cinta vuelve al estado operacional (no-excepcional), mientras a 1{6] se asigna el conjunto de las cuatro excepciones. 11 cardinal de un tipo conjunto T es card(T) = 264 a.2n Esto puede deducirse ficilmente a partir del hecho de que cada uno de los card(T,) clementos de T, puede representarse por uno de los dos valores «presente» 0 «auusenite» y de que todos los elementos son independientes unos de otros. Eviden- femente, es esencial, para una implantacion eficiente y econdmica, que el tipo hnase sea no s6lo finito sino razonablemente pequetio, Lox operadores elementales que se definen en las estructuras de tipo con- junto son los siguientes interseccién de conjuntos unién de conjuntos diferencia de conjuntos pertenencia a un conjunto Bite Jas operaciones de interseecién y unién de conjuntos se llaman frecuente- inente producto y suma de conjuntos, respectivamente, Las prioridades de los ope= viravismente ts wna eomvencional se tilan corey om agar de Haves pau hs ‘Seren las ive pr tint emcatiew eT pein LA ESTRUCTURA CONJUNTO (SET) 27 radores de conjuntos se definen de acuerdo con el siguiente criterio: el operador de intersecci6n tiene prioridad sobre los de unién y diferencia que, a su vez, tienen prioridad sobre el operador de pertenencia; este iltimo se considera un ‘operador de relacién. A continuacién se presentan ejemplos de expresiones con conjuntos y sus equivalentes con paréntesis explicitos: reste (rete ros*t = 1-6) rostt=(-stt xis $f = xin (st) El primer ejemplo que se presenta de aplicacién de Ia estructura conjunto sel programa de un analizador lexicogrifico («scanner») sencillo de un compi- ludor. Se supone que el objetivo de este analizador es traducir una secuencia dle caracteres a una secuencia de unidades de texto del lenguaje a compilar, lNamadas «piezas» 0 simbolos. Bl analizador se representard por un procedimiento ‘que cada vez que es llamado lee un mimero suficiente de caracteres de entrada ppara generar un nuevo simbolo de salida. Las reglas particulares de traduccién son: 1. Bl conjunto de simbolos de salida esta formado por los elementos identifi cador, numero, menoroigual, mayoroigual, tomaelvalorde, y otros que corres ponden a varios caracteres aislados tales como +, —, #, ete. >. El simbolo identificador se genera al leer una secuencia de letras y digitos que comienza con una letra. 4. El simbolo numero se genera al leer una secuencia de digitos. J. Los simbolos menoroigual, mayoroigual y tomaelvalorde se generan al leer los segmentos, parejas de caracteres, < =. > =, 5. Los blancos y finales de linea se saltan. Se cuenta con el procedimiento batsico read(x) que extrae el cardcter siguiente Vecuencia de entrada y lo asigna Ia variable x. El simbolo de salida resul- tunte ve asigna a una variable global llamada sym. Ademis, estan las variables hale id y num cuyo objetivo resulta evidente en el programa 1.2 y ch que re- hweventa el carcter de la socuencia de entrada en fase de anilisis. $ designa una Iwlicacién del conjunto de caracteres sobre el de simbolos, es decir, un array “Ic simbolos con un dominio de indices formado por caracteres que no son ni unto ni letras. EL uso de conjuntos de caracteres demuestra cOmo un analizador Ie sicogrifieo puede programarse independientemente del orden que exista entre tin caracteres que forman tos textos. 11 segundo ejemplo consiste en la eonstruccién de un horario escolar. Se nnpone que Mf estudianes han elogido entre NV asignaturas, Debe construirse 20 ISTMUCTURAS FUNDAMENTALES DE DATOS n horario de forma que se programen determinadas asignaturas para ser expli- ‘caddy alt misma hora sin que haya conflictos [1.1]. va th lar «vm: simbolo fd: vecord 0, maxk; a: array [1 .. maxk] of char end procedure analizador; oh char saltar blaneos} while ch“ do read(ch); Woh in (A°..°Z°) then with id do Dein sym : = idemtficador; k : = 0 repeat if k < maxk then bogink: = k + Isalk]: = oh end ; reaikeh) vatil—(¢h in FAP end else if chin [0° .°9") then begin sym : = numero; num : = 0; repeat num: = 10 + mum + ord{eh) — ord(0'); read(ch) aon (chia [0°. “9D *>"] thea begin ch! : = ch read(eh); if ch = "the i <<" then sym : = menoroigual else >" then sym > — mayoroigual else sym read ch) end else sym: S{eht] ebse begin {otros simbolos} svm: Sek: reudoh) end send fanaizador} Programa 1.2. Analizslr lexicoriico («Scanner»), = tomaelvalorde LA ESTRUCTURA CONJUNTO (SET) 29, type asignatura = 1 ...Ni estudiante =1.. M; seleccion = set of asignatura; var s: asignatura; 1: estudiante; * 7 ‘matricula: afray (estudiante] of seleccion; Conflicto: array [asignatura of seleccion; {Determinacion de los conjuntos de asignaturas confictivas ‘a partir de las-asignaturas en que se matricula cada estudiante} for s: = 1 to N do conflierols): = (1 for i: ~ 110 Mao for s: = 1 to N do if sin matricula i] then conficto|s|: = conflicto{s| + matrieula{i] (1.28) (Obsérvese que s in conflicto[s] es una consecuencia de este algoritmo.) En general, la construceién de un horario es un problema combinatorio muy ulficil, donde debe tomarse una decisién teniendo en cuenta muchos factores y con abundantes restricciones. En este ejemplo se simplificara el problema de forma dréstica sin plantearse Ia busqueda de una solucién de horario realista En primer Iugar se constata que para obtener clases simulténeas aceptables x preciso basar las decisiortes en el conjunto de datos obtenidos de las matriculas individuales de los alumnos, es decir, en la enumeracién de asignaturas que no puedan explicarse simultineamente, Por ello, se programa en primer lugar un hroceso de reduccién de datos basado en las siguientes declaraciones y en et convenio de que los estudiantes se numeran de 1 aM y las asignaturas de 1 a N. La tarea principal ahora consiste en construir un horario, es decir, una lista ale sesiones, cada sesién formada por una seleccién de asignaturas que no estin ‘on eonflicto, Del conjunto de todas las asignaturas se eligen subconjuntos de wsinnaturas aceptables, no conflictivas, suprimiéndolas de una variable con- jnito denominada remanente, hasta que este conjunto de asignaturas remanentes suede vacto. var ke: integer: remanente, sesion: seleccion: horario: array [I ...N'] of seleecion; ke: =:0; remanente: = [1...N}: while remanente + [ ]do Ce) begin sesion : ~ siguiente seleccion aceprable; remanente : ~ remanente — sesion: ki kt Ishorario[ke] : = sesion {W) ESTRUCTURAS FUNDAMENTALES DE DATOS REPRESENTACION DE LAS ESTRUCTURAS ARRAY, REGISTRO Y CONJUNTO 31 {:C6mo se realiza una «siguiente seleccién aceptable»? Al iniiar el proceso { pws clogire cualquier asignatura del conjunto de las remanentes. Subsiguien- teaente le eleociga de nuevos candidatos puede estar restringida al conjunto dk ssipaturasremanentes que no entran en conficto con las iicalmente selec . Ente conjnto se llamara de prueba, Cuando se investiga un candigato ; «lt conjunto de prueba, se constata quesueleccibn depende de que la intersecci6n ‘cl confnto de esignaturas seleecionado y el conjunto de las que entran en con- Nivto con el candidato esté o no vacta. Esto conduce a la siguiente elaboracion ste lu wsiruccin esesion: = siguiente selecion aceptabley Hheanac Cardinalidad var 9, © asignatura; prueba: seleecion; begins: = 1; while —(s in remanente) dos: = + 1s 1 sesion : == [8]; prueha : = remanente ~ conficto(s] fore: ~ 110 Ndo ey if Fin prucba then begin it conficio[t]« sesion ~ [then sesion : = sesion + [t] Tipos components individualmente “Todos ideticos wo Tous idéntcos de tipo exalt 7) Acceso a lor Test de pertenencia os Fundamentals g end ‘componente s ud Hvidentemente esta solucién para seleccionar sesiones «aceptables» generar 5 horarios no necesariamente Optimos en algin aspecto especilico. Puede darse i: ‘italian caso no afortunado Ia circunstancia de que el nlimero de sesiones resul- lanes sea tan amplio como el de asignaturas, incluso aunque fuera posible pro- zrumar eiertas clases simultémeamente, Ninguno Tabs 1.10. REPRESENTACION DE LAS ESTRUCTURAS ARRAY, REGISTRO Y CONJUNTO fT Deeteraiia array record end set of Te 4a exencia del uso de abstraceiones en programacién es que un programa puede concebirse, comprenderse y verificarse en base a las leyes que rigen aquéllas Y que no es nevesario preocuparse de Ia forma en que se implantan y representan en smn determinado computador. De todas formas es una ayuda para el éxito let programador la comprensién de las técnicas de uso mas gencralizado para iar los conceptos bisicos de las abstracciones de programacién, tales vomo las estructuras fundamentales de datos. Es una ayuda en ef sentido de tune capacita al programador para tomar decisiones sensatas sobre el diseiio | lel programe y los datos teniendo en cuenta no s6lo las propicdades abstractas ste lay estructura sino tambien ks de su realizacién eonereta en los conyputade- Resh Conjunto v USIRUCTURAS FUNDAMENTALES DE DATOS rey, leniendo en cuenta las capacidades y limitaciones de un determinado compu- tudor HI problema de la representacién de datos es el de definir una apficacién de la ‘estructura abstracta sobre la memoria del computador. Las memoria de los com- uludores son, en primera aproximacion, arrays de celdas de almacenamiento inulividual denominadas palabras. Los indices de las palabras se Haman direc- var memoria: array (direccion of palabra a3 {Lox cardinales de los tipos direceion y palabra varian de unos computadores a ‘olvos, La gran variabilidad del cardinal de la palabra es un problema. Su loga- tino se lama tamara de fa palabra, porque es el niamero de bits que contiene una weld de memoria. 1.10.1, Roprosentacién de los arrays, Una representacién de una estructura array es una aplicacién del array {¢absiracto), eon componentes de tipo 7, sobre la memoria, que a su vez es un array ‘con eomponentes de tipo palabra, Ul array debe aplicarse de tal forma que el calculo de diecciones de sus com- ponents sea lo més simple (y, por tanto, eficiente) posible. La direceién o indice tle memoria f del componente j del array se calcula por la funcién de aplicacién lineal imi,tins (1.32) en donde i, es la direcci6n del primer componente y s es el nimero de palabras squte «ocupa» cada componente. Dado que la palabra es por definicién la unidad tle memoria mas pequeiia a Ia que puede accederse individualmente, es muy ble, evidentemente, que s sea un niimero entero, en el caso mas sencillo +L Sisrno es entero (que es el caso normal) se redondea, habitualmente, hasta cl entero mayor mas préximo [s], En este caso, cada componente det array ‘octyst Js] palabras y, por tanto, [s] — s palabras no se usan (ver Figs. 1.3 y 1.6), Hate redondeo det ntimero de palabras necesarias hasta el entero més pr we Ihuna juste, El factor de «utilizacion de memoria», u, es el cociente de la can- tid minima de memoria necesaria para representar una estructura y la cantidad, eabnente ulilizada Foal me ‘Como la hora deimplantar se iendea que el factor de utilizacién de memoria sea lov muy prodxime posible a 1, y dado que el acceso a zonas parciales de kas pala- AEPRESENTACION DE LAS ESTRUCTURAS ARRAY, REGISTRO Y CONJUNTO. 33 ‘abstracto 3223 f=3 Fig, 1.6 Representacion del ajuste de un no utizedo registro, bras es un proceso farragoso y relativamente ineficiente, hay que Hegar a un compromiso, Para ello, deben hacerse las siguientes consideraciones: |. El ajuste disminuye Ia utilizacién de memoria. >, La omisién del ajuste puede necesitar el acceso ineficiente a zonas parciales de Ia palabra. 1. Bl acceso a las zonas parciales de la palabra, puede dar lugar a que aumente cl programa compilado y, por ello, contrarrestar cl beneficio obtenido por Ia omisién del ajuste. De hecho, las consideraciones 2 y 3 son frecuentemente tan dominantes que los compiladores ajustardn siempre automaticamente. Se observa que el factor ide utilizacién sera siempre u > 0,5, sis > 0,5. Sin embargo, si s < 0,5, el factor dle utilizacién puede incrementarse de manera significativa almacenando mas ‘Ne un componente del array en cada palabra, Esta tecnica se denomina empaque- luulo, Si se empaquetan n componentes en una palabra, el factor de utilizacion ves (ver Fig, 1.7), we ey 34) LI. t B 1g. 1.7 Finpnunetade de ses omponcntes ex una palabra Mt ISIRUCTURAS FUNDAMENTALES DE OATOS Par luveri ‘aceeder al componente / de un array empaquetado es preciso caleular la dela palabra en que esta localizado y su posicién & dentro de fa palabra. j= idivn k= imod n= i— jen (135) Vn la mayoria de Tos lenguajes de programacién el programador no tiene con- ol sobre fa representacién de las estructuras abstractas de datos. Sin embargo, lcheria ser posible indicar el deseo de empaquetar, al menos en los casos en que ‘uuepa mas de un componente por palabra, es decir, cuando pueda conseguirse ‘una ganaaneia en economia de memoria de factor 2.0 superior. Se adopta el con- venio de indicar este deseo de empaquetar, precediendo el simbolo array (0 record), ent la declaracién, por el simbolo packed. Harve type alfa — packed array (1. . n] of char stu posibilidad es particularmente valiosa en computadores con palabras grandes y con accesibilidad a campos parciales de la palabra relativamente ade- cada. La propiedad evencial de este prefijo es que de ninguna forma cambia cl significudo (0 validez) de un programa, Esto significa que la eleecion de una representacién alternativa puede indicarse facilmente con la garantia implicita tle que el significado det programa permanece invariable. Hl coste de acceso a los componentes de un array empaquetado puede redu- cirse dristicamente si todo el array se empaqueta (0 desempaqueta) al mismo tiempo, La raz6n es que puede hacerse un barrido secuencial eficiente sobre todo cl array, sin que sea necesario evaluar una complicada funcién para cada com- ppanente individual. Por ello se postula la existencia de dos procedimientos norma Iizulos pack y unpack, definidos de la forma que se indica a continuacién. Se wuponen las variables u:array {a..d]of T p: packed array [b.. c] of T slonle ub © designa la secuencia de un tnico componente, x; se denomina secuencia ntvaria She Oye ted OV = Oy Jn) son secuencias RBI Oly Km Pee TaD at) ces ln eomeatemacion de xe y. Si Gry se -sG) €9 na secuencia no vacia, primers) — x, 42) slesigni ef primer elementos de SEY Cy eos ae eM Secneneia Hey UA ESTRUCTURA FICHERO SECUENCIAL 39 resto(x) ay eed (1.43) cs la secuencia x sin su primer componente, Por tanto, se verifica la relacién invariante 3 €primero(x)> & = x «assy La introduceién de eStas notaciones no significa que se vayan a utilizar en pro- gramas reales para ser ejecutados en computadores reales. De hecho, es esencial ‘que la operacién de coneatenacién no se use en forma generalizada, y que la mani- pulacion de secuencias se limite a la aplicacién de un conjunto de operadores cuidadosamente seleccionados, que aseguran una cierta disciplina de utilizacién, pero que, a su vez, se definen a partir de las nociones abstractas de secuencia y concatenacidn. La eleccién cuidadosa del conjunto de operadores de secuencias capacita a los implementadores para encontrar representaciones adecuadas y cficientes de las secuencias en cualquier tipo de memoria; esto garantiza que el mecanismo asociado de asignacién dinémica de memoria sea lo suficientemente simple como para que el programador pueda trabajar sin preocuparse de los de- talles. ara poner en claro que la secuencia que se va a introducir como estructura basica, esta asociada con un conjunto restringido de operadores, que fundamental- mente permiten slo el acceso estrictamente secuencial a componentes, esta es- tructura se denomina fichero secuencial 0, para abreviar, simplemente fichero. En forma totalmente andloga a la empleada para definicién de los tipos array y conjunto, un tipo fichero se define por la formula type T = file of T, (1.45) ‘que expresa que cualquier fichero de tipo T consta de cero o mas componentes de tipo Ty Eyemros type texto = file of char type mazo ~ file of tarjeta Lo principal del acceso secuencial es que en un momento dado sélo puede acce- dlerse de forma inmediata a un tinico, y especificado, componente de la secuencia. Fste componente corresponde a la posicién en ese momento del mecanismo de rnoceso. Esta posicién puede cambiarse, por los operadores de fichero, normal- ‘mente al componente siguiente 0 al primera de toda la secuencia, Para expresar, 1 manera formal, la posicion de un fichero, se consideraré un fichero x Ji) (SiIHUGTURAS FUNDAMENTALES DE DATOS cunu si estuvieta dividido en dos partes, una, xp, a su izquierda y otra, xp, ast dorecha, Lividentemente Ja ecuacién x x1 & Xp (46) expos una relaci6n invariante. ‘Unu segunda, y muy importante, consecuencia del acceso secuencial es que los process de construccién e inspeccién de una secuencia son distintos y no pueden inevclese en cualquier orden, Asi, un fichero se construye aiiadiendo repetida- tnieite componentes (a su extremo final) y puede, subsiguientemente, inspeccio- tise secuencialmente, Por ello, es habitual considerar que un fichero puede en- ‘contrarse bien en estado de ser construido (escrito) 0 bien en estado de ser inspec- rondo (Ieido). Ta ventaja del acceso estrictamente secuencial es particularmente notoria, ios ficheros van a estar situados en dispositivos de almacenamiento intermedi, to decir, si se presentan transferencias entre distintos dispositivos. El método de ‘neceso secuencial es el tinieo en el que las complejidades de los mecanismos nece- sarios para tales transferencias pueden ser ocultadas con éxito al programador. Tu particular, es posible la aplicacién de simples técnicas «huffering» (memorias ampén) que garantizan por si solas el uso Sptimo de los distintos recursos dis jvonibles en equipos complejos de proceso de datos. Liaisten algunos dispositivos de almacenamiento en los que el acceso secuencial ces realmente el tinico posible. Entre ellos estin evidentemente todas las clases dfecintas, Pero, incluso en los tambores magnéticos y discos, cada pista constituye ‘un dispositivo de almacenamiento que permite tinicamente el acceso secuencial, 1H acceso estrictamente secuencial es la caracteristica primordial de todo dispo- sitive mavil, y también de algunos otros no méviles 1411.1, Oporadores elementales de ficheros ‘A continuacién se formula la nocién abstracta de acceso secuencial mediante tun cinnjunto de operadores elementales de fichero, wtilizables por el programador. Se elincn a partir de los conceptvs de secuencia y concatenacién. Hay un opera ‘Jor pura iniciar el proceso de generacién del fichero, otro para iniciar ta inspec~ ‘idin, o(ro para afladir un componente al final de la secuencia y otro para avanzar li inspeceién al componente siguiente. Los dos tiltimos se definen de forma que incluyen una variable implicita auxiliar que representa un «buffer. Se supone {auc este Gltimo se asocia autométicamente a cada variable fichero x, y se le de- ina por x}, Bvidentemente, si x es del tipo T, xf es del tipo base de T, Ty. 1. Construceién de kr secuencia vacia, La operacién rewrite) (ayy LA ESTRUCTURA FICHERO SECUENCIAL 1 cquivale a la asignacion xed) Esta operacién se realiza para escribir sobre la secuencia en curso, x, ¢iniciar proceso de construecién de una nueva secuencia, y corresponde al rebobi- nado de una cinta, 2. Extension de una'setuencia, La operacién puts) (1.48) corresponde a la asignacion = x & “> xt : primero(x) sta operacion se utiliza para iniciar el proceso de lectura de una secuencia, 4. Paso al componente siguiente. La operacién set(x) (1.50) equivale a las asignaciones simulténeas xy = xy &Cprimero(xo)> Xp! = resto) xt! = primerotresto(xe)) Obsérvese que primero(s) s6lo esti definida si s ++ <>. Lox operadores rewrite y reset no dependen de la posicién del fichero previa a su ejecucidn; vuelven a situar o fichero, en cualquier caso, en su posicién origen. 4) USIHUCTURAS FUNDAMENTALES DE DATOS ‘Cuando se inspecciona una secuencia es nevesario estar en condiciones de re- conocer ef final de la misma, porque, de otra forma Ia asignacién ats = primero) ari: una operacién no definida, Alcanzar el final del fichero es evidente- inente sindnimo de que la parte a la derecha, xp, esta vacia. Por ello se introduce predicado eoftx) = xp = <>. as pata signiticar que se alcanza el fin del fichero (end of file). La operacién gei(x), hor tanto, sélo puede ejecutarse si el predicado eof(x) es falso. 1n principio, es posible expresar todas las operaciones sobre ficheros en fun- cin de cuatro operadores bisicos. En la préctica, sin embargo, es frecuente ‘eombinar ki operacién de avanzar la posicién del fichero (ger © put) con el acceso tn la variable buffer, Por ello, se proponen dos nuevos procedimientos; ambos pueden expresarse en funcidn de los operadores basicos. Sea v una variable y € niu expresion de tipo T,, componente del fichero, De acuerdo con esto read(x, ¥) es sindnimo dey: = xt; get(x) wwrite(x, €) es sinénimo de xt : = e; pux) 1a ventaja de utilizar read y write en lugar de get y put reside no s6lo en su breve- dnd, sino también en su simplicidad conceptual. Ya que, de esta forma, es po- sible ignorar la existencia de la variable buffer x}, cuyo valor algunas veces est indefinido, La variable buffer puede, sin embargo, ser util para cuando se quiere inspeccionar el componente siguiente sin tener que avanzat la posicién del fichero. Tas condiciones previas para la ejecucién de los dos procedimientos son reoflx) para reads, ») eofix) para _—_write(x, e) Al leer, el predicado eof{) toma el valor verdadero tan pronto como se ha leido cl iltimo elemento del fichero. Estas consideraciones estin elegantemente incor- poradas en los dos esquemas de programas que se indican a continuacién para la consiruccién y proceso secuencial de un fichero x. Las instrucciones Ry S y el predicado p!son pardmetros adicionales de los esquemas, LA ESTRUCTURA FICHERO SECUENCIAL 43 Useribir el fichero x: rewritel2); rnile » do co PP begin RCo) writeCx.0) es _| (1.52) Leer el fichero x: reset(x); | hile —eof(x) do begin read(x,0); S() end «.s3) 1.11.2, Ficheros con subestructura En la mayoria de las aplicaciones, los grandes ficheros requieren cierta clase de subestructura, Por ejemplo, un libro, aunque puede considerarse como una secuencia tinica de caracteres,se subdivide en capitulos y parrafos. El objeto de sla subestructura es proporcionar algunos puntos explicitos de referencia, ‘algunas coordenadas para facilitar la orientacién en la larga secuencia de infor- tnacion. Algunos de los dispositivos fisicos de almacenamiento facilitan la repre- sontacién de estos puntos de referencia (por ejemplo, las marcas de cinta) y son capaces de situarse en ellos con mayor velocidad que cuando se inspecciona toda la informacién situada entre estos puntos de referencia, De acuerdo con la notacién seguida hasta ahora, la forma natural de introducir ‘un primer nivel de subestructura es considerar el fichero como una secuencia de componentes que a su vez son secuencias, es decir, como un fichero de ficheros. Suponiendo que los componentes tiltimos (0 unidades) son de tipo U, las subes- tructuras son, por tanto, de tipo T = file of U ¥ el fichery completo es del tipo T= fileof T 1s, evidente que de esta forma los ficheres pueden construirse con patticiones imbricadas hasta el nivel que se desee. En general, un tipo 7, puede definirse por la telacion recursiva T~file of Tey T= Assan VTi, U, Vales Ficheros se denominan frecuentemente ficheros multinivel, y AM UstWUCTURAS FUNDAMENTALES DE DATOS: tun componente de tipo 7 se denomina segmento de nivel i. Un ejemplo de fichero tnultinivel es un libro, en el que Tos niveles de segmentacién corresponden a capi- Tiler partidos, parrafos y lineas. Sin embargo, el caso mas general es el ichero ‘can un tinea nivel de segmentacién. i fichero segmentado de un iinico nivel no es idéntico en absoluto a un array ste ticheras, ya que el nimero de segmentos es variable y el fichero sélo puede Ntemerse por su extremo final. Continuando dentro de la convencién de no fuidin wiilizada hasta ahora, y suponiendo un fichero definido por x sfile of file of U «tsp segment accesible en el momento de proceso, x el componente 1 et leo dicho momento. De acuerdo con esto puts) y ges} 56 re ase omponene uniaro y pus) get) designa Tas operaciones de twtr yavaovar al sepmento siguiente Haan gisetadon estan implantadosprctcamenteen todos os dis hosted dc aacenamientosalas en cntas magnetics. Sa sepmentacén D0 do oa carats bisiea de permit solamente acceso scuencal bien aN nar o Ben por mvanimos de salto mas 8pilO— 8S ray dnponives de almacenamiento —nowblemente os dics y ae iene habiuamente un numero de pitas cada una de as cuales sem prplamenteun dspostvo secuenil que normalments es demasiado ore eimacnar en fichero compet. Por cle, 1s fihero en dico se ex aie a arias int y UenennnformaciOn de contol aproptda para ase ee care pitas Obviamentc el puto igen deca pia conse Toe ore al deeemento la que puede accdetse an mis dirstamente ae tgs en cualquier soporte extctamente secuenal. Una tabla dei Fe cnerori principal oda ular, por eempo para drs eed nd comienzan los segments nda 5 Tong (er Figs a 1.10), tabla da indices mm) ‘ Weocomoeg cop eco coe eo tig. 1.40 Licher ined con eines seementos jones anteriores eondugen a Tos Hamados ficheros indexados ars consider ox de acceso directo). Realmente tos tam= (Hamuados también algunas veees fiehero LA ESTRUCTURA FIGHERO SECUENCIAL 45, bores y los discos estin organizados de forma que cada pista contiene muchas marcas fisicas en las que puede empezar la lectura o escritura. Por ello, no es preciso que cada segmento ocupe una pista completa, ya que de esta forma resul- taria una utilizacién muy pobre del almacenamiento disponible, silos segmentos son cortos para la longitud.de'pista, El tramo de almacenamiento entre marcas consecutivas se denomina segmento fisico (0 sector) en contraste con el segmento Iogico que es una entidad ‘significativa en la estructura de datos del programa Evidentemente cada segmento fisico alberga como méximo un segmento ldgico, y cada segmento l6gico.ocupa como minimo un segmento fisico (incluso si est ‘yacio). Debe tenerse en cuenta que aunque se denominan ficheros de «acceso dlirecto», al tiempo medio para localizar un segmento, llamado tiempo de laten- ia, es Ii mitad del tiempo de una vuelta del Los ficheros indexados conservan la caracteristica exencial de que la eseritura se realiza secuencialmente a partir del diltimo elemento. Por ello, son particular- mente titiles en aplicaciones en las que se producen pocos cambios. Estos cambios se realizan, bien ampliando el fichero, o actualizindolo y volviendolo a copiar ‘vompleto. La inspeccién de Tos datos puede realizarse de forma mucho més rapida y selectiva mediante el uso de las tablas de indices. Esta situacién es tipica en los llamados hancos de datos Los sistemas que permiten la actualizacién selectiva de partes interiores det tichero son generalmente de utilizacién dificil y poco fiable, ya que los nuevos clomentos de informacién deben tener el mismo tamaiio que los antiguos que reemplazan, Ademas, en aplicaciones que afectan a grandes masas de datos, Ia sictualizacién seleetiva no es recomendable, habida cuenta de la regla basica tle que ante cualquier fallo, ya sea debido a un programa erréneo, o al mal fun~ cionamiento del equipo, debe existir un estado de los datos al cual pueda volverse nara poder repetir el proceso que fall, Por ello, la actualizacién se lleva a cabo hormalmente de manera completa, de forma que el fichero antiguo se sustituye por la nueva copia actualizada, s6lo después de que se ha llevado a efecto una verificaciOn que establezca que el nuevo fichero es valido. A efectos de actualiza- ‘ign la organizacién secuencial es con mucho la mejor desde el punto de vista de hiabilidad. Debe preferirse a otras organizaciones mis sofisticadas de grandes is de datos, que pueden ser més eficientes, pero que, a menudo, producen rrdida total de los datos enando falta el equipo de proceso. 1113. Textos los ficheros cuyos componentes son de tipo char juegan un papel especial- incite importante en ef célculo y proceso de datos: constituyen el elemento de itacto entre los eomputadlores y los usuarios humanos, Tanto la entrada legible roporionada por los programadores, como la salida legible que representa los treailkidos ealeulados, estin constituides por secuencias de caracteres. Por ello, neste tipa de datos debe cirsele un nombre normalizado: |W LSTRUCTURAS FUNDAMENTALS DF DATOS type text — file of char | a comunicacién entre un proceso en el computador y su autor humano se es- tublece, Finalmente, mediante un elemento puente (interface) que puede represen lune por dos ficheros de textos. Uno de ellos contiene la entrada (input) al proceso, y ol olro los resultados procesados llamados salida (output). Por ello, se supondrit In existencia de estos dos ficheros en todos los programas, siendo su declaracion var input, output: text Tiniendo en cuenta la hipétesis de que estos ficheros representan los dispositivos nnormalizados de un equipo de proceso (tales eomo la lectora de fichas y la impre sora) se supondré que el fichero input es s6lo para lectura y el fichero output s6lo para eseritura ‘ado que ambos ficheros se utilizan predominantemente, se considerard que si el primer pardmetro de los procedimientos read y write no es una variable i el valor input © output por defecto. Avanzando en esta Tinea, se un dos procedimicntos normalizados con un niimero arbitrario de argu- 108. Los convenias de notaciin de estos procedimientos se resumen dela forma siguiente: read(xl,...,.xn) equivalente a read(input, x1, ..., xn) write(xl, ... xn) equivalente a write(owput, x1, .- xn) read(f, x1,..., xn) equivalente a begin read(f, x1); ... ; read(f, xn) end write(J, x1, ..., xm) equivalente a begin write(fx1);... 3 write(f, xm) end Los textos son ejemplos tipicos de secuencias con subestructura. Las unidades usual de subestructura son capitulos, parrafos y lineas. Una forma corriente de representar estas estructuras elementales en los ficheros de texto es utilizar ca- racteres especiales de separacién. El cardcter blanco es el ejemplo més conocido, pero pueden utilizarse separadores similares para marcar los finales de linea, hnirralo y capitulo. Por ejemplo, el e6digo ISO de amplia difusién (incluyendo su version americana ASCH) contiene varios elementos de esta clase llamados ruracteres: de control (véase Apéndice A). En este libro se ha rehusado la utilizacién de caracteres especificas de separa- ciOn, y kt definiciOn de un método de representacién de las subestructuras, En su lugar se considera un texto como fichero formado por secuencias de secuencias xe curaeteres, que representan las lineas. También, se limita el analisis a un nivel ‘inieo de subestructura, es decir, la linea. Sin embargo, en vez de considerar los textes como ficheros constituides por ficheros de caracteres imprimibles, se eonsideran como ficheros de earacteres, introduciendo operadores y predica- los aicionales para sue munipulacién, es decir, para marear y reconover las LA ESTRUCTURA FICHERO SECUENCIAL 47 lineas, El efecto de ellos se comprenderti mejor si se supone que las lineas estin weparadas por caracteres (hipotéticos) de separacién (no pertenecientes al tipo ‘huar)y su mision se considera que es la insercidn y reconocimiento de tales sepa~ tiulores. Los operadores adigionales son os siguientes: nviteln(f) Afiadir-ung marca de linea al final del fichero /. readin) Saltar caracteres en el fichero f hasta el siguiente inmediato a la proxima marca de linea. olf) Funcién .booleana. Verdadera, sila posicién del fichero ha avanzado hasta una marca de linea; falsa, en otro caso (se st pondré que si eoln(f) es verdad ft = blanco). ‘Con esta base, es posible formutar dos esquemas de programa para escribir ¥ Teer textos, semejantes a los de «escrituray y «lecturay de otros ficheros [véase (1.59) y (1.53)]. Estos esquemas se basan en un fichero de texto fy prestan la slobid atencién a la generacién y reconocimiento de la estructura de linea. Sea K(s)una instruccién que asigna un valor a x (de tipo char) y define las condiciones 1'y 4 con significados «éste era el tltimo cardcter de la linea» y «éste era el iltimo ‘anivter del fichero». Sea U una instruccién a ejecutar al principio de cada linea leida, S{3) tna instruccién a ejecutar para cada caricter x del fichero, y V una juecién a ejecutar al final de cada linea. seritura de un texto f. begin RC); write 2) Ce end ; write) end Vestura de un texto f rese(J); hile —eof(/) do U; | | ahile —eoln(f) do (155) begin read( f,x); S(x) | end | | V5 readin(f) | | en | AN. ESTRUCTURAS FUNDAMENTALES DE DATOS ay casos en que la estructura de lineas en un texto no representa informacion ielovante alguna, La hipétesis realizada sobre el valor de Ja variuble «buffer» al tcncontrar una marca de linea [ver definicion de eoln(f)] permite utilizar, en vslix casos, un esquema de programa més simple. Obsérvese que de acuerdo ‘can la definicién de eodn cada final de linea se presenta como un cardcter blanco while — eof) do begin read, x); SCX) (1.56) end Hin fa mayoria de los lenguajes de programacién se acostumbra admitir 10s de tipo integer © real para los procedimientos de leer y escribir. argu stn generalizacién seria inmediata si los tipos integer y real se definieran como lunnays ale caracteres cayos elementos designaran los digitos individuales de los tniunieros. Los lenguajes fuertemente orientados hacia las aplicaciones comerciales Ne uclaptun realmente a tales definiciones, y requieren una representacién de los Intieros a partir de los digitos decimales de acuerdo con el sistema numérico de- ‘imal. La ventaja importante de presentar los tipos de datos integer y real como fin ales es que estas especificaciones detalladas pueden omitirse y que un xjuipo de proceso puede usar diferentes representaciones de los mimeros que sean hnnacho mis adecuadas para sus propésites. De hecho, los sistemas orientados ha- cia cfleulo cientifico invariablemente eligen la representacién binaria que en mu thos aspectos es superior a la representacion decimal. {isto implica, sin embargo, que un programador no puede suponer que los intneros se leen 0 escriben en ficheros de texto sin que medien operaciones de ‘conwcrsidin, Es eostumbre esconder estas operaciones de conversién en las instruc ciones de lectura y eseritura con argumentos de tipo numérico. El programador profesional, sin embargo, es consciente de que tales instrucciones (Hlamadas insirucciones E]S 0 1/0) incorporan dos funciones distintas: transferencia de datos entre diferentes dispositivos de almacenamiento y transformaciones de la tepresentacién de los datos, Estas iltimas pueden set muy complejas y costosas en tiempo. Vin los capitulos siguientes de este libro, las instrucciones de lectura y eseritura dle argumentos numéricos se utilizarin de acuerdo con las reglas del lenguaje tle progeamacion PASCAL. Estas reglas permiten controlar el proceso de trans Tormacidn, mediante un determinado tipo de especificacién del formato. La espe- cificacin de formato indica el ritimero de digitos que se desea para el caso de ins- trutcciones de escritura, Este ndmero de caracteres, también llamado «amplitud de ‘ampon, se eseribe inmediatamente después del argumento de la forma siguiente write fox) iL arpument v va eseribitse en el Fichero fst valor se convierte en una SeeteN- LA ESTRUCTURA FICHERO SECUENCIAL 49 «ia (Como minimo) de n caracteres; si es necesario, los digitos iran precedidos por un signo y un nimero adecuado de blancos. No es preciso dar més detalles para comprender os iiltimos ejemplos de programas de este libro. A coptinuacidn se incluyen dos ejemplos de conversién dle Ta vepresentacién de, un/niimero (Programas 1.3 y 1.4), con el propésito de inner de relieve la costosa complejidad de tales operaciones, que normalmente cstin implicitas en las instrucciones de escritura, Estos dos procedimientos representan la conversién de alimeros reales desde la representacién decimal a tuna representacién «interna» arbitraria, y viceversa. (Las constantes en las cabe~ ceras se determinan por las propiedades del formato de nimeros en coma flotante «lel computador CDC 6000: exponente binario de I! bits y mantisa de 48 bits. La, funcidn expo(x) designa el exponente de x.) Programa 13 Lectura de un mimero rel procedure leerreal (var f: texto; var x: real); lee un monero real x del fichero f} {las constantes siguientes dependen del sistema} const 148 — 281474976710656; {= 243} limit =” $6294995342131; {= 148 div 5} 2=27; {= ord(0')} fim 1 = 3 { maximo exponente } lim 2 = —292; _{ minimo exponente } type posine = 0. 323; sar ch: char; y: real; a i, e: integer; sss: boolean; {signos } ion ten(e: posint): real; { = Wee, 0 then begins: = true: get Ds oh = ft begins: = false; ich = *4 then begin ger); ch end end; it-V(ch in [0 “9° then Dregin mensaje (*piciv0 €sPeRADO"): halt; end; a: = 0;e: =0; repeat if a < limic then a: ~ 10 +a + ord{ch) — zelsee: =e +1 gee(f)s ch: = fT twat (hin [0° -*9°))s if ch =". then begin { leer fraccion } ger f); ch: = fs while chin [0". 9°] do begin if a < limit thea ft begin a: = 10 + a + ord(eh) — 2: e-1 end; get(f); ch: = ft ead end: itch ~*E then begin {leer factor de escala} gei(f); ch: ~ ft: ich begin ss : cad else begin ss : = false; if ch — hegin gei(f); oh : = ft end ids while ch in [0° 9°] do if i < limit then begin i: = 10 i + ord{ch) — 2 end; ged fick: fT end: Wssthene: ¢ feces 6 44 LA (Continwaciow LA ESTRUCTURA FICHERO SECUENCIAL 51 fe < lim 2 then begin a: =0;e:=0 ‘end else ife> limi then bhi message (NUMERO DEMASIADO GRANDE”); halt end (0 c48 then y:—((a + 1) div 2) « 2.0 else y ifs then y: = ys ite <0then x >= y/ten(—e) else ite + 0 thenx : = y « ten(e) else x: while (/T =" °) A eof(f)) do ger: end {leerreal|, Programa 13. (Continuacién) Programa 14 “Esribi un nimero re procedure escribirreal (var f: text; x: real: n: integer); meri mer vel x conn craters coma lane decal {las siguientes constantes dependen de las condiciones de la representacion dle mumeros reales en coma flotante} const 48 ~ 281474976710656; {= 2 «# 48; 48 — tamaiio de la mantisa} 2=27; {ord'0)} (ype posint 323; {rango del exponente decimal} var c,d, e, €0, el, €2, 1: intege function ren(e: pasini): real; { 10 #* €,0 10 then beginx: = x/l00;e: =e +1 end end else begin e: = (e + 1) = 77 div 256; x: = ten(—e) # x; if <0.1 thea beginx: = 10.0*x;e: =e = 1 end end; fo. sx < 10} casenaf —{ redondeo } xin + 0SE MR x +05B— 11 125 135 143 15 Programa 14 (Continwacisn) LA ESTRUCTURA FICHERO SECUENCIAL 53 ix > 1.0 then beginx: =x#O1;e:=e +15 end: 1 = trune(x, 48); [22 trune(x a(2 +048))} ¢: = 10 ec;ds= cain 43; write ford +,2).°2)5 fori: ~ 2t0.n do: begin c: = (¢ — d-# 148) + 10; d: write(f,chr(d + 2)) end; write(f,"E);e: =e 1; ie <0 then begin write(f, "se: = —e end else writeJ," +"); el: = e + 205 div 2048; 2: ~ e ~ 10 sel; 6: = el» 205 div 2048; el: = et — 10» 0; write J, che) + 2), chr(el + 2), chr(e2 + 2)) cad cud {eseibireat} Programa 14 (Continuacion) 111.4, Un programa para edicion de ficheros ‘Como ejemplo de aplicacion de estructuras secuenciales se plantea el siguiente Jwablema que, ademas, sirve para mostrar un método de desarrollo y explicacién, He programas, Este método se ama de refinamiento gradual {1.4, 1.6] y se uti- hound para explicar muchos algoritmos a Io largo de este libro. 11 problema es desarrollar un programa que edite un texto x en la forma de ‘wu texto y. Editar se utiliza aut en el sentido de borrar o reemplazar determinadas ens 0 insertar otras nuevas. La edicién esti dirigida por una secuencia de mnvaucciones de edicién tepresentadas por un texto normalizade lamado input Me ly forma siguiente: I,m, Insercibn de un texto después de la linea m. B.m.n. Borrado de las lineas m hasta 7. m,n, Reemplazamiento de las lineas m a n, F Fin del proceso de edicién. ‘alu insiruecion se eseribe como una Tine en el fichero normalizado input, al ‘he sw deviontina Fichero de instedexiones. ny m son niimeros de linea, decimales, (Mt FSTRUCTURAS FUNDAMENTALES DE DATOS y los textos a insertar deben seguir inmediatamente a las instrucciones J, R. La lista de instrucciones se termina por una linea en blanco. Se supone que las instrucciones de edicién se producen para nimeros de tinea extrictamente erecientes, Esta regla sugiere, de forma inmediata, un proceso srrucaciaf del texto de entrada x, Estd claro que el estado del proceso debe carac- {ctizarse por la posicién en cada momento del texto x, definida por et niimero sle a linea que se esté considerando en cada instante. Supdngase ahora que el programa de edicién se va a utilizar de manera inter- sctiva y que, por ello, el fichero de instrucciones representa, por ejemplo, los datos ‘que se originan en la consola de un terminal. Con esta forma de operacion es muy interesante que el operndor reciba alguna clase de informacién de comprobacién. Una informacién til y apropiada es el texto de Ia linea en la que el proceso se situs como consecuencia de la iiltima instruccién, Esta linea se denominara ine en curso. Una consecuencia importante de esto altimo es que esta linea ulche representarse explicitamente por una variable, en la que se almacena transi toriamente después de Ieerla de x, y antes de escribirla en y. Esta técnica se de- homina-de «mirada adelante». El programa de edicién puede formularse de la forma siguiente: rogram editor (x, », input, output): var ino: integer; {numero de la linea en curso} westmerr [beeen cae) x, yitext jeer instruecion; repeat interpretar instruccion; as escribir linea; leer instruceion ‘until instruccion = *F* end beg ‘A continuacién se procede a especificar con més detalles varias de las instruc: ciones. Al refinar leer instruccion e interpretar instruccion se observa que las ins- trucciones de edicién planteadas constan de tres partes: el cédigo de instruccién y dos parémetros, Por ello, se introduce las tres variables codigo, m y n para ‘comunicacién entre ambas rutinas. var codigo, ch: char; m,n: integer Heer instruceién: readtcodigo, ol ich ~ *, then read(m, ch) else m : = Ino; (1.58) Woh —* then read(n) else n : = m: LA ESTRUCTURA FICHERO SECUENCIAL 55 {sta formulacién capacita para aceptar instrucciones con 0, 1 6 2 parémetros vustituyendo apropiadamente por valores por defecto los no especificados. Iterpretar instruccién: copiar, if codigo ~ ‘I" then begin ponerlinea; insertar; end else if codigo = *B” then saltar else (1.59) if codigo = °R’ then begin insertar; saltar; end else if codigo = *F* then copiarresto else Error lin una segunda etapa de refinamiento se expresan las instrucciones, copiar, unvertar y saltar utilizadas en (1.59), en funcién de operaciones que afecten exclu svamentea lineas, es decir, en funcién de zraerlinea y ponerlinea. Su caracteristica ‘omnes la estructura repetitiva. Copiar sirve para copiat lineas de x a y, empe- ‘aumuo por la linea en curso y terminando en la linea m. Saltar lee lineas de x, on copiarlas, hasta la linea 2. Copiar: while Ino < mao begin ponerlinea; ‘raerlinea; end Saltar: while Ino 0: var ij, ks Integers aiarray[l ..] of 7; xT Programa A: b= hs Ns repeat k= (i+ j) v2; afk] < x then i: = ketse j until alk] = 3) VG> 1) Programa B: hah pew repeat k's = (1+ J) aiv2; ix < afk] then j: — k— 1; ifa{k] < xtheni: = k +1 vil > 7 Programa C: fie 5 repeat k= (i+) aly 25 fx < ff] then j :— k ee until? = J Nota: Todos los programas deben terminar con afk] = x si tal elemento existe y con afk] ++ sino existe ningtin elemento con valor x: 1.14, Una compatia organiza una encuesta para determinar el éxito de sus productos: ‘Sus productos son discos y cintas con éxitos musicales: los éxitos mis populares deben estar incluides en una lista de éxitos (hit parade). La poblacin encuestada se va a di- vidit en cuatro categoria segin sexo y Xl (por ejemplo, menores o iguales a veinte Hos.y mayores de veinte alos). A ead person see pide que déel nombre de cinco exi- (os, Los Exitos se idemtitiean por fos niimeros IN (por ejemplo N30). Los res lads de tn encuestn ve represent por a fiero siguin REFERENCIAS 59 typeexito = 1..N; ‘sexo = (masculino, femenino); respuesta record apellido, nombre: alfa edad: integer eleccon: array [1 .. Sof exito end; var encuesta: fle of respuesta Por tanto, cada elemento del fichero representa un encvestado ¢ incluye Su apellide, nombre, sexo, edad y sus cinco éxitos elegidos en orden de preferenca. Este fichero es la entrada a un programa que, se supone, calcula los siguientes resultados: 1 Lista de éxitos en orden de popularidad. Para cada uno se lista el miimero del xito yel nimero de veces que ha sido mencionado en la eneuesta. Los éxitos que no han sido mencionados en la encuesta se omiten de la lista 2. Cuatro lstasdistintas con los nombres y apellidos de todos los encuestados que hhabian mencionado en primer lugar, uno de los tres éxitos mis populares en su categoria Las cinco listas deben ir precedidas por titulos adecuados. REFERENCIAS Dau, 0. 3, Buwstea, E,W. y Hoare, C. A, R., Structured Programmog (Nueva ‘York Academic Press, 1972), pig. 155.65, Hoare, C. A. R., «Notes on Data Structuring», en Structured Programming, Dahl, Dijkstra, and Hoare, pig, 83-174, hinaiss, K. y Winn, Na «PASCAL, User Manual and Reports, Lecture Notes it Computer Seience, Vol. 18 (Berlin: Springer-Verlag, 1974), Wari, N., «Program Development by Stepwise Refinement», Comm, ACM, 14,n.° 4 (1970), pi. 2 io LSIRUCTURAS FUNDAMENTALES DE DATOS bs ‘dThe Programming Language PASCAL», Acta Informatica, Iyn.° (1971), vig, 15463, ir « «On the Composition of Well-Structured Programs», Computing Surveys, 6. ne 4 (1974), pig, 247-59. 2 ORDENACION 2.4. INTRODUCCION E] objetivo principal de este capitulo es aportar un conjunto extenso de ejem- los que ilustren el uso de las estructuras de datos presentadas en el capitulo wnlerior y mostrar cémo la estructura de los datos de base influye profundamente ‘1 Tos algoritmos que llevan a efecto una tarea dada, Los procesos de ordenacién ituyen también un buen ejemplo de cémo una tarea puede desarrollarse ‘ediante algoritmos muy distintos, cada uno con ciertas ventajas e inconvenien- tes, que deben ser valorados unos respecto de otros, segin la aplicacién parti lar de que se trate. Generalmente, se considera ordenar como el proceso de reorganizar un con- junto dado de objetos en una secuencia especificada. Fl objetivo de este proceso vs facilitar Ia bisqueda subsiguiente de los elementos del conjunto ordenado, ‘Como tal, es una actividad fundamental que se realiza universalmente. Los ob- wlos ordenados aparecen en las guias de teléfonos, en los ficheros del impuesto wire la renta, los indices de libros, bibliotecas, diccionarios, almacenes y casi en lovdas partes en que hay objetos que deben buscarse y recuperarse. Incluso a los hitios pequefios se les ensefia a poner sus cosas «en orden», y se les enfrenta con, cwerlas formas de ordenacién mucho antes de que aprendan nada de aritmética De aqui que la ordenacién sea una actividad fundamental y relevante, par- hicularmente en proceso de datos. {Qué otra cosa va a ser mas féeil de ordenar sane los datos! A pesar de todo, el interés de tratar los procesos de ordenacién, vw es libro se centra en las, aiin més fundamentales, téenicas utilizadas en ta vunstruceion de algoritmos, Existen pocas ténicas que no se relacionen en salyuna forma con los algoritmos de ordenacién, En particular, este tema es idéneo part mostrar unt gran diversidad de algoritmos, todos con el mismo objetivo, muchos siendo Sptimes en algin aspecto, y la mayoria de ellos presentando (62 ORDENACION ciertas ventajas sobre los otros. Es por ello un tema ideal para hacer patente la nnevesidad del andlisis del funcionamiento de algoritmos. Ademds el caso de orde- macion es muy adecuado para mostrar c6mo pueden obtenerse ganancias muy znificativas del rendimiento mediante el desarrollo de algoritmos sofisticados, ‘aunque se disponga de otros métodos mas sencillo 1 influencia de la estructura de datos en la eleccién de un algoritmo —fend- ‘meno omnipresente— es tan profunda para los problemas de ordenacién que los tni:todos se dividen en dos categorias: ordenacién de arrays y ordenacién de fiche~ rv (secuenciales). Ambas clases se denominan a menudo ordenacién interna y externa, ya que los arrays se almacenan en la memoria interna rapida, de acceso aleatorio, del computador y los ficheros se colocan convenientemente en alma- tcenamientos externos» mas Ientos basados en dispositivos mecinicos (discos y cintas), La importancia de esta distincién se hace evidente en el ejemplo de ‘ordenacién de tarjetas numeradas. Estructurar las tarjetas segin un array se ccorresponde con extenderlas todas delante del encargado de ordenarlas de forma ‘que cada tarjeta sea visible y accesible individualmente (ver Fig. 2.1) Fig. 2.4 Ordenaciin de aerays Fn cambio, estructurar las tarjetas segtin un fichero implica que de cada mon- 6n solamente es visible la tarjeta superior (ver Fig. 2.2), Esta restriccién tiene una influencia evidente en el metodo de ordenacion a utilizar, pero es inevitable si el intimero de tarjetas a extender supers el que cabe en la mesa disponible. Antes de comenzar, se introduce la notacién y terminologia que se va a utilizar 1 lo kargo del capitulo. Se suponen dados los items articulos: ‘Ordenar consiste en pernuutar estos items IWTRODUCCION 63 le forma que dada una funcién de ordenacién f se verifique: Alen) < Se) <--- < flan) en Fig. 22. Ordenacin de Ficheros, Normalmente, la funcién de ordenacién no se evalia segin una regia determinada Ale caleulo, sino que se almacena como componente explicito (campo) de cada item, Su valor se denomina clave del item, Por tanto, la estructura registro es pparticularmente idénea para representar los elementos aj. A tal fin, se define tipo item, que va a ser utilizado en todos los algoritmos de ordenacién que jiguen: I | Re item — record clave: integer: | {agui pueden declararse los otros componentes} | (2.2) [ee < otros componentes, representan los datos de interés acerca de los items ‘ue forman parte de la coleccién; la clave sirve exclusivamente para identificar caskt articulo, En lo que se refiere a los algoritmos de ordenacién que se van a Ivatar, sin embargo, la clave es el aiaico componente de interés y no es preciso Ictinir ninguno de los dems. La eleccién de tipo integer para la clave es, en cierta (orm, arbitraria. Evidentemente, puede utilizarse también cualquier tipo en ef ‘ye pueda definirse una relacién de orden total. ‘Un método de ordenscién se denomina estable si el orden relativo de los ar- ticulos con ht misma glave no se altera por el proceso de ordenacién. La estabi- 4 GRDENACION lidad es deseable, a veces silos items estan ya ordenados de acuerdo con otras claves secundarias, es decir, con propiedades no reflejadas por la propia clave primaria. ste capitulo no debe contemplarse como un tratado exhaustive de las tée- hieus «le ordenacién. Mas bien, se presentan en él ejemplos muy detallados de ulus Wenigas seleccionadas. Para un tratamiento més profundo del tema de ‘urdenacién, el lector interesado puede acudir al excelente compendie de D. E. Kinatly [2-7] (ver también Lorin [2-10. 22, ORDENACION DE ARRAYS La principal condicién a imponer a los métodos de ordenacién de arrays es | utilizacion econ6mica de la memoria disponible. Esto implica que las permu- laciones de items, con vistas a su ordenacién,deben realizarse utilizando el espacio ‘cupado por el array (ordenacién in situ) y que los métodos que transportan aarticulos de un array a hacia un array resultado 6 son intrinsecamente de menor interés. Teniendo restringida la eleccién de métodos entre las muchas soluciones pposibles por el criterio de economia de memoria, se clasi Estos, segtin su eficiencia, es decir, su evonomia de tiempo. Una buena medida dde eficiencia se obtiene en base al niimero C de comparaciones de claves y M de ‘movimientos (transferencias) de items, Estos néimeros son funcién del numero 1 de asticulos a ordenar, Aunque los buenos algoritmos de ordenacién necesitan lel orden de n- log m comparaciones, se estudian inicialmente varias técnicas seneillas de ordenacion denominadas métodos directos, que tequieren del orden de r? comparaciones de claves. Hay tres buenas razones para presentar los mé- lodos directos antes que otros algoritmos mis rapidos. 1. Los métodos directos son especialmente adecuados para poner de relieve las earacteristicas de los principios de ordenacién més usuales. >. Sus programas son cortos y faciles de entender. Hay que recordar que tam- bién los programas ocupan memoria. 5. Aunque los métodos sotisticados requieren menos operaciones, éstas nor malmente son mas complejas en detalle; consecuentemente los métodos irectos son mis répidos para n sufietentemente pequefiv, aunque uo deben usarse para valores grandes de 7 {Los métodos de ordenacién in situ, pueden clasificarse en tres categorias prin- cipsiles de neuerdo con el método de base que utilizan: 1. Ordenacién por insercién, 2. Ordenacién por seleveién \. Ordenacién por intereambio, isto (ees prineipios bisicos seri objet ek Joque sigue. {men y compar ORDENACION DE ARRAYS 65 Los programas operan sobre Ia variable a, cuyos componentes s¢ ordenarin in situ y se referirén a los tipos de datos item (2.2) indice, definidos de la forma poo eee oo 2.2.1. Ordenaci6n por insercién directa Este método se usa generalmente por los jugadores de cartas. Los items (cartas) estin divididos conceptualmente en una secuencia destino ai, ....dr-1 y una secuencia origen aj, ..., dy. En cada paso, empezando con i = 2, ¢ incre- mentando i de uno en uno, se toma el elemento f de la secuencia origen y se trans Tiere a la secuencia destino inserténdolo en el sitio apropiado. Clivesinicinkes 44 3$ 12867 a2 4 5 po 2 9 8 oF oF in} bh 4s «@ ind 2 hw ss ins 2 55 i=6 2 4 ie? age eal ina ot ie) as Tabla 2.1. Proceso tpi de ordenacin por insreién directa FI proceso de ordenacién por insercién puede verse en un ejemplo de ocho wvimeros elegidos aleatoriamente (tabla 2.1). El algoritmo es for i: = 2tondo begin x: = afi]; ‘dinsertar x en el sitio adecuado en ay... a> ead Vn ol proceso de encontrar realmente el sitio adecuado conviene alternar com- paraciones y movimientos, es decir, «dejar caer» x, comparandolo con el immediato precedente aj: como consecuencia, se inserta x 0 se mueve aj a st slerecha, y se continita con el inmediato por la izquierda, segiin el mismo proceso. ‘ nbserva que hay dos condiciones distintas de terminacién de este proceso de sid os ‘encuentra un item a) cuya clave es menor que la de x. sanz el extreme izquicrda de kt secuencia destino, 1 ORDENACION [Este caso tipico de una repeticién con dos condiciones de terminacién permite aplicar la conocida técnica del centinela. Se aplica ficilmente situando como cen- fincla dy — x (obsérvese que esto debe hacerse extendiendo el campo de variacién dlcl indice de a de 04 n). El algoritmo completo se formula en el programa 2.1. Programa 2.1. Ordenacidn por insrcin directa procedure inserciondirecta: begin x: = ali}; a10): = x3) while x clave < aj) clave do begin af +1]! = aly: =J— 1s end; ay+ 1] cad cad Anélisis dela insercién directa. El ndamero de comparaciones entre claves. C, cen el paso de caida ies, como maximo, i ~ 1 y, como minimo, 1, y—suponiendo {que todas las permutaciones de las » claves tienen igual probabilidad— como media i/2. El nimero de movimientos M, (asignaciones de items) es C, +2 (incluido el centinela). Por ello, los nimeros totales de comparaciones y movi- mientos son Mau =2(n—1) Myoa = Yon? +92 — 10) 4) =r +3n—4) EI niimero de comparaciones y movimientos minimo se presenta cuando los items estin ordenados de origen, el méximo se presenta si estan inicialmente ‘en orden inverso. En este aspecto I ordenacién por insercién se comporta de forma realmente natural. Es evidente que el algoritmo antes descrito es un proceso ‘eslable de ordenaci6n: no modifica el orden de los items con la misma clave. EI algoritmo de insercién directa se mejora ficilmente si se observa que la secuencia de destino @,,..,4)-1 en la que debe insertarse el nuevo articulo tnt ya ordenada. A tal fin puede utilizarse un método mas rapido para determinar fl lngar_de insereidn. Obyianiente, este método es el de busqueda binaria que uiranca del elemento central de la Secuencia de destino y continia por biseccién hasta encontrar ef punto de inservin, El algoritmo moditicado de insercién se « insercién binarla y sparove en ol Programs 2.2. ORDENACION DE ARRAYS 67 Programa 2.2. Ordenacin por insercién binata procedure insercionbinaria; var iy jy i2, de, m: indice: x: item: begin - fori: —2tondo begin x: = afi); it: = L;de while iz < de do begin m fiz + de) div 2; fx ali) - clave then beginx: = al — 1]; aU — 1]: =alsal/l: = x cod end nd {urbujo} Uste algoritmo admite ficilmente algunas mejoras. El ejemplo de la Tabla 2.3, muestra que las tres Giltimus pasadas no tienen ningin efecto en el orden de los 1 OnDENACION clementos por estar éstos ya ordenados. Una técnica obvia para mejorar este hivoritmo, €s controlar si se ha producido algin cambio en una pasada. Es nece- writ, por tanto, una ditima pasada sin operaciones de intercambio para deter~ tminar que ol algoritmo puede aeabar. Sin embargo, esta mejora puede a su vez humicntarse si se controla, no s6lo el hecho de que se ha producido un cambio, sin también la posici6n (indice) del sltimo intercambio, Esta claro, que todos lis paves de items adyacentes por debajo de este indice, k por ejemplo, estin orde- hhadas, Las pasadas subsiguientes pueden por ello terminarse en este indice, {in tener que llegar al limite inferior i, predeterminado. El programador avisado, Sibservari, sin embargo, una asimetria peculiar: una sola burbuja, mal situada en CLextiemo «pesado» de un array, por otra parte ordenado, se situard en posicién ‘correcta en una tnica pasada, pero un item mal colocado en el extremo «ligero» se whunde» hacia su posicién correcta a un ritmo de una posicién por cada pa- sad, Por ejemplo, el array 12 18 42 44 55 67 94 06 seria ordenado por el método de la burbuja mejorado en una tinica pasada, en eumbio, el array 94 06 12 18 42 44 55 67 ovesitaria siete pasadas, Esta asimetria antinatural sugiere una tercera mejora: fa altcrnancia en la direccién de dos pasadas consecutivas. El algoritmo resul- ante se denomina adecuadamente método de la sacudida: su forma de funcionar ne ilustra en la tabla 2.4, aplicado a las mismas ocho claves utilizadas en la tax kr 2.3 Programa 28, Ondenscién por el mitodo de la suid procedure sacuida: var j,k, i2, de: indice; x: item: igi 2ider=mki=m epeat for j: — de downto iz do if a{j—1} -clave > a{j] .clave then begin x: = afj— 1]; alj—1]: = abi); abil: = k =i end; e=k+l for j: ~ iz to de do alj— V1 slave > alj] .elave then bexin: al thalé Ws alflsatfls x hk i end de kt atthe = wd verulit ORDENACION OE ARRAYS 73 e203 a 4 4 de-8 8 7 7 4 mae ' “pCO » [oe 4 per 2 2 54 vt us ie a few | 2 pee | a ow | a Les | a Lin wel ss ote le 2 @ sor Lem me ‘Tabla 24, Ejemplo de apicacin del método de a sacudida Analisis de los métodos de la burbuja y de la sacudida, El niamero de compara- ciones en el algoritmo de intercambio directo es C=4er =n) @.10) y los niimeros minimo, medio y maximo de movimientos (asignaciones de items) Mee =, Mus = 40? — 1), Mae =H? —n) G.I) El analisis de los métodos mejorados, particularmente el de la sacudida, es complejo. EI minimo nimero de comparaciones es Cuie =n ~ 1. Para el método ‘ie a burbuja mejorado, Knuth llega a un niimero medio de pasadas proporcio- hala n k,n y ua mimero medio de comparacianes proporcional a Hn? —n(ka + Inn)). Pero se observa que todas las mejoras antes descritas to afectan al niimero de intercambios; solamente reducen ef niimero de dobles comprobaciones redundantes. Desgraciadamente el intercambio de dos items «una operacién generalmente més costost que una comparacién, Por tanto, las habiles mejoras introducidas tienen un efecto mucho menos profundo de lo que intuitivamente podria esperarse. Ute anailisis demuestra que la ordenacién por intereambio, incluidas sus leves, incjoras, os inferior a ht ordenacién por seleccién o por insercién; de hecho, el inélodo de kt burbuja tiene eseasas razones que 1o hagan recomendable como no sea st chocante nombre. KI método de kt sicudida se utiliza con ventaja en los cctsios en que se sabe que los articulos estin casi ordenados —lo que es raro en la prteties, Puede demostrarse que la distancia media que cada uno de los n items debe evorrer en un proceso de ordenacién es n/3 lugares. Este resultado aporta una clave para buscar métodos mas efectivos. Todos los métodos de ordenacion di- tects mueven, esencialmente, cada item una posicién, en cada paso elemental, Por tanto, nevesariamente requieren del orden de n? de tales pasos. Cualquier iniciora debe basarse en el principio de mover los items una distancia mayor en cet paso. ‘A continuacién, se presentan tres métodos mejorados, uno por cada método hisivo de ordenacién: insercién, seleccién ¢ intercambio. 2.2.4, Ordenacién por insercién con incrementos decrecientes 1D, L. Shell propuso en 1959 un método de insercién directa mejorado. El étode aparece aplicado al ejemplo ya utilizado de ocho items (ver tabla 2.5). Fin primer lugar, se agrupan y ordenan por separado, los items que distan cuatro posiciones. Este proceso se denomina ordenacién de cuatro en cuatro. En el snplo de ocho items cada grupo tiene dos items. Después de este primer paso srupan los items que distan dos posiciones y se ordenan por separado. Este proceso se denomina ordenacién de dos en dos. Finalmente en la terceta pasada se ordenan los ftems de manera normal, es decir, de uno en uno. Puede preguntarse a primera vista si la necesidad de hacer varias pasadas ide ordenacion cada una de las cuales afecta a todos los items, no introduciré mas trabajo del que ahorra. Sin embargo cada pasada de ordenacién sobre una lista fects a relativamente pocos articulas o bien estos estan ya bastante ordenados y comparativamente se requieren. pocas reorganizaciones. ‘Obviamente el método produce como resultado un array ordenado, y es bas- tunte evidente que cada pasada se beneficia de tas anteriores (dado que cada ‘ordenacién de i en i combina dos grupos ordenados previamente en el proceso ‘de 2i en 29, También es obvio que cualquier secuencia de incrementos es acepta- ble siempre que la tiltima sea de uno en uno porque en el peor de os casos, la iltima pnsada realizaria toda la ordenacién, Sin embargo, no es tan evidente que el mé- oulo de incrementos decrecientes produzca resultados mejores con incrementos distintos de las potencias de 2. Por tanto, el programa se desarrolla sin fliar una secuencia especifica de in- terementos, Los ¢ inerementos se denominan, Iayha, vom las condiciones, ORDENACION DE ARRAYS 75 Cada ordenacién de A en h se programa como un proceso de insercién directa empleando la técnica del centinela para la condicién de terminacién en la biis- ciueda de la posicién de insercién, Es evidente que cada pasada de ordenacién necesita situar su centinela pro- pio y que el programa pats determina su posicién debe ser lo més sencillo po- sible, Fl array a debe extenderse, por tanto, no solamente con un componente ‘{0] sino con fy componentes, de forma que su declaracién es ahora: a; array[—hy 1] of item: 1 algoritmo, para 14, se describe mediante el procedimiento shell (2-11) lol Programa 2.6. RRR RSS Ia ondenacin de 4 on 4 produce ee Og 0 tt ee, la xdenacién de 2 en 2 produce a en en ee RR RRR fa ordonscion de 1 en 1 produce Se ee fon Gr os ln2S. Uns ordenacion por insercin con incremenios deerecienes Programa 2.6. Ordenscidn por el método de Sel procedure shell; const 4; var i,j, ky 8: indice; x: items m: 1 beneeay (1 1] f integer begin A[L] |= 95 h(2]: — 5: h13): = 35 ALS} form: = 1 todo begin k : = Alm]: s: =—K; (posieion del centinela} fori: k + 1tondo begin x: = ali]: j: = iki 5 = Othen §: = —k; ss =s + lyals}: = x while x .clave < alj] clave do begin al +k]: = alii: ~j—k end: aj kl: x Anilisis del método de Shell. El andlisis de este algoritmo plantea algunos problemas mateméticos muy dificiles, muchos de los cuales todavia no estin resueltos, En particular, no se conoce qué secuencia de incrementos produce sl mejor resultado. Un hecho sorprendente es que, sin embargo, no deben ser unos miiltiplos de otros, Esto evitara ef fenomeno, evidente en el ejemplo pre- seitiado anteriormente, de que cada pasada combina dos cadenas que, previa- meate, ao habian estado relacionadas. Realmente, es deseable que haya inter- ‘cin lo més frecuentemente que se pueda, y se cumple el teorema siguiente: Si una secuencia esti ordenada de k en k y se ordena de i en é continga ordenada de k en Knuth 2) prseniaevdencis de que una eleecibn razonable de ineremen- tl secuenci een en orden inet) 1 4.18,40, 21 en donde yes = 3h, +I h= Ly #= logs — 1. También recomienda fsscuenc oe en donde hy-) = 2hy + 1,he = Ly t= [log n] — 1. Para esta diltima, el andlisis ‘muatemitico evalia el esfuerzo computacional para ordenar n elementos por el método Shell, como proporcional a n', Aunque es una mejora significativa vvon relaci6n a n?, no se tratard con més extensién este método, ya que hay algo- ritmos todavia mejores. 225. Ordenacién segiin un drbol EL método de ordenacién por seleccién directa se basa en la repeticién de la selecvi6n de la clave minima entre m elementos, después entre los restantes n — 1, Evidentemente, encontrar la clave minima entre m items, necesita m — 1 saraciones y encontrarla entre n — 1 precisa — 2. ;,Como puede mejorarse ‘este proceso? Solamente puede hacerse reteniendo en cada recorrido de la lista nnxis informacién que la identificacién del item minimo. Por ejemplo, con n/2 womparaciones es posible determinar la clave menor de cada par de articu- fos, eon otras 2/4 comparaciones puede seleccionarse la menor de cada pareja de chives minimas obtenidas anteriormente y si sucesivamente, Finalmente con solo 1 T comparaciones puede construirse un iirbol de seleccién como el dle Ia Higura 2.3, ¢ identificar la rake com Ia clave minima descada [2-2] ORDENACION DE ARRAYS 77 i “ZN ‘~. a UT aX Js, 36 12 18 08 Fig. 2. Seleoiin repetida entre cada dos claves. El segundo paso consiste en descender por el camino marcado por la clave ininima, elimindndola, y reemplazindola, bien por un nudo vacio (0 con clave alj + 1) .clave then j: = j +1: if.x .clave = aj) .clave then goto 13; ali}: als]: = figs = 204 {eribal wos w aloe w wo «os xfe ms 2 « » « osfee « 6 yo «fee @ « 8 2 @ lje_*® po» « » 9 o ‘Tabla2.6. Construccia de un monticul, los que no se requiere que exista ninguna relacién de orden, El monticulo se extiende, a continuacién, a la izquierda de forma que en cada paso se incluye tun elemento nuevo y se sitiia adecuadamente mediante el proceso de ctiba por hhundimiento. Este proceso se ilustra en la Tabla 2.6 y produce el monticulo que ‘aparece en la Fig, 2.6, Por tanto, el proceso de generar un monticulo dem elementos hy «oh sobre la propia lista es el siguiente: ie: = (ndiv2) +1; while iz > 1 do begin end is ~ 1s eriba(iz, m) Para obtener ahora los elementos ordenados, ¢s preciso ejecutar n pasos de criba, tomando, después de cada paso, el item siguiente de la cima del monticulo, Una vez imdis se presenta el problema de dénde almacenar los elementos que surgen de lu cima y si sera posible o no una ordenacién sobre la propia lista (in situ). ; Desde luego que hay solucién! En cada paso se saca del monticulo el tltimo componente (sea 2), se almacena el elemento superior del monticulo en la posicién, ahora (ine de yo erm pr undmieno aa option corsa Los #1 Foes mario se tan ene ejemplo dea able 276 proce se devesibe * 2 2 8 ww ww @ , eg os # 7 «fo = ea 9 «fen o a a rr re ae, ey «fe a 2 2 am rc ufo 8 # 2 w 2 o ORDENACION DE ARRAYS @1 mediante el procedimiento criba (Programa 2,7) de la forma siguieme de: = ni; whilegde > | do begin «= alt]; afl]: = ade]; ale] : — 35 de: = de —1; eriba(, de) 1H cjemplo de la Tabla 2.7 muestra que el orden resultante esté realmente inver- tido, Esto puede remediarse, sin embargo, cambiando Ia direccién de las relacio- nies de orden en el procedimiento de criba. De aqui resulta el procedimiento ‘moneiculo que se muestra en el programa 2.8. Programa 2.8. Ordenacién por el método del monticuo (heap). procedure monticulo var iz, de: indice; x: tem: procedure criba: label 13; var i,j: indice; begin: = iz,j: = 2+ ix: — ali] while j < de do begin if j < de then Wali] -clave < aly + 1] -elave then j: ix .clave = al} .clave then goto 13; ali}: = alii: = fj: = 248 ali]: = x end; begin iz : — (n div 2) + 1; de: =n; while iz > 1 do begin iz: = iz —1; eriba end: while de > 1 do begin x : = a(t}; a(t] : = alde]; a[de] : = x; de: = de—1; criba end end {monticulo} Anilisis del método del monticulo. A primera vista no resulta evidente que reste método produzca buenos resultados. Al fin y al cabo, los items mayores « cviban primeramente hacia la izquierda para ser finalmente depositados en l extremo derecho. Realmente el procedimiento no es recomendable para un tniniero pequeito de items, tal como el que se muestra en el ejemplo. Sin embargo, > OADENACION jrara n grande este método es muy eficiente y su eficacia aumenta cuanto mayor ts m, incluso mas que la del método de Shell. fin el caso més desfavorable, s necesitan n/2 pasos de criba de los items a travis de log(n/2). log(n]? + Dy... log ~ 1) posiciones, siendo el logaritmo ‘in base 2, trungado al entero mis préximo, por defecto. A continuacién, la fase tie nlenacién necesita n ~ 1 eribados con nimeros de movimientos maximos Mle lop —1)y log(t —2), +. 1 Ademés se necesitan n —1 movimientos ywasa ailuar el elemento cribado a la derecha. Estas consideraciones muestran {hue ef método del monticulo requiere del orden de n log m pasos en el caso mds ilesfavorable, Este excelente rendimiento, incluso en las peores condiciones, e tuna de las ventajas mas importantes del método. 'No esti claro en qué casos puede esperarse el peor (0 mejor) rendimiento. Vero peneralmente este método parece funcionar mejor con secuencias iniciales ‘en his que los items estan mis o menos en orden inverso y por ello su comporta- hnvcinto cs antinatural. Evidentemente, fa fase de creacién del monticulo no requiere tingiin movimiento si Tos elementos estin en orden inverso, Para los ocho items lel cjemplo, las secuencias que se indican a continuacién requieren el muimero tminimo y maximo de movimientos fain — 13 para la secuencia 94 67 44 55 12 42 18 6 Max ~ 24 para la secuencia 18 42 12 44 6 $5 67 94 111 ndmero medio de movimientos es, aproximadamente, 4 + log ry las desviacio~ hes respecto de este valor son relativamente pequefis. 2.2.6. Ordenacién por particién Después de estudiar dos métodos avanzados de ordenacibn basados en los principios de insercién y seleccién, se presenta un tercer método mejorado ba- Cido en el principio de intercambio, Dado que el método de la burbuja era como Theda cl menos efectivo de los tres algoritmos de ordenacién directa, puede espe- ‘nurse un factor de mejora relativamente importante. A pesar de todo resulta sor~ frendente que la mejora, basada en intercambios, que se describe a continuacién fradarea el mejor método de ordenar arrays conocido hasta ahora. Su rendi- mnicmto es tan espectacular que sw inventor, C. A. R, Hoare, lo bautiz6 como inctado ripide (Quicksort) [2-5 y 2-6) 111 método rapido se basa en el hecho de que los intereambios deben reli ‘aise proferiblemente sobre distancias largas para que sean més efeetivos. Su- Frongase dados m items en orden inverso al de sus claves. Es posible ordenarlox realizado los extiemos bios, fomando cn primer Tu ORDENACION DE ARRAYS 83 izquierdo y derecho y progresando gradualmente hacia el interior desde ambos lados. Naturalmente esto es posible por que se conoce que su orden inicial es exactament el nverso del que se busca. Pero ete cemplo ens alg, de todas Se va a intentar el siguieitte algoritmo: Se tom arbitratiamente un elemento (designado por x); se inspecciona el array de izquierda a derecha hasta encon- trar un ftem a > x, y entonces se inspecciona el array de derecha a izquierda hasta encontrar un item a; < x. A continuacién se intercambian los dos items y se continda este proceso de inspeccién e intercambio hasta que los recorridos en ambas direcefones se encuentren en algin punto situado aproximadamente cn la mitad del array. Como resultado se obtiene el array partido en dos; una parte izquierda con claves menores que x y una parte derecha con clavés mayores siue x, Este proceso de particién se formula como procedimiento en el progra- ima 2.9, Obsérvese que las relaciones > y < se han sustituido por > y < cuyas nnegaciones en la sentencia while son < y > respectivamente. Con este tnico cambio, x actiia como centinela en ambos procesos de inspeccién. Programa 29. Partcibn do un array. procedure particion: Yar wx: item; begin: = 1; j2 = ns {eleccionaleatoria de un item x} repeat while afi] .clave < x .clave do i while x .clave < al) itt clave do j : = j—1Vs if < jthen begin w: = ali]: aff]: = aj); af): = wi beithp=j—l ena until > j end or ejemplo, si se toma la clave media 42 como elemento x de comparacién, Harray de claves 44°55 12 42 94 06 18 67 1 «los intereambios para obtener el array particionado —— Be aS A or Jen. athares finales dle lox indices son 7 Sy f 3. Las claves an. ORDENACION son menores o iguales que la clave x — 42, las claves aj+1 dq Son mayores © iguales que la clave x, Consiguientemente hay dos particiones, es decir a lave > x clave parak=j+l...m 1 ay clave jim- plica el resultado deseado. 'No hay que olvidar que el objetivo perseguido no era solo realizar particiones «tl array inicial, sino también ordenarlo, Sin embargo, solo hay un paso entre la prarticién y la ordenacién: después de hacer Ia particién se aplica el mismo pro- «cso a cada una de ls partes y a continuacién a las partes reultantes y asi sucesi- ‘vamente, hasta que cada particion contenga un Gnico item. Este proceso se dleseribe en el programa 2.10, Programa 2 ‘Ordenacion por el todo rapido procedure rapido: procedure sort (iz, de: indice): var i,j: indice’ x, w: item; begin i de; x + de) div 2): repeat while afi] .clave < x clave doi: =i +1 while x clave < a[j] clave do j: = j—1 i jthen begin w : = afi); ali]: = alj]s all: = ws isdt hy: 1 end iti < de then sori de) cad bein sor vd rapido} 11 procedimiento sort se activa él mismo recursivamente. Esta forma de utili zu ka vecursividad en algoritmos es un instrumento muy poderoso que se discu- iui mas ampliamente en el Capitulo 3, En algunos lenguajes de programacion ‘nis antiguos no existe Ia recursién por ciertas razones técnicas. A continuacién 1 muestra como puede expresarse este mismo algoritmo como procedimiento no ‘eeursivo. Obviamente la solucién es expresar la recursién de manera iterativa y writ ello son necesarias determinadas operaciones adicionales de «administra- cain» de datos, a clave para construir una solucion iterativa est en mantener una lista de tiviones pendientes de ejecutar: Después de cada paso se generan dos nuevas 1nORDENACION areas de particién, Sélo una de ellas puede tratarse en In iteracién siguiente: In otra debe afiadirse a la lista de tareas pendientes. Desde Iuego, es fundamental lista de particiones pendientes se trate en un orden especifico, concreta- en orden inverso, Esto implica que la primera particién pendiente de la lista es ka Gltima @ procesar y reciprocamente: la lista se procesa como pila. En jn no recursiva del método rapido que se describe a continuacién, cada titew pendiente se representa sencillamente por los indices izquierdo y derecho ‘que avotan el tramo a particionar posteriormente. De acuerdo con esto, se in- Inexluee una variable array denominada pila y un indice p que designa e! iltimo clemento ineorporado a la misma. En el andlisis subsiguiente del método répido sw estudiaré la forma apropiada de elegir el tamaito de fa pila m. Programa 2.11. Versa no recursva del método rip, procedure rapido): const m = 12; var i,j, de indice’: x item; pO. pila: array {1 .. m} of record iz, de: indice end: Dregin p: — Ls pila] wie: = Ls pil) ade: repeat {tomar la demanda superior dela pila} is: = pilale) .iz; de: = pilalp) .de: p: ~ p — 1; repeat {subdivision de a2]... ade) } fs ie; j2 = de; x2 = alliz + de) div 2}; repeat while afi] .clave < x .clave doi while x .clave < alf] .clave do j: iti s then begin vs = alils ali]: = ali}: al/]: = in ithjiaj—l end unt > j: it < de then begin {almacenar en la pila la demanda para ordenar la ipariciin derecha} p+ Iipilalp) i: = i; pitalp) de: = de cond rapido! ORDENACION DE ARRAYS 87 Andlisis del método ripido. Para analizar el funcionamiento de este método cs prociso investigar, previamente, el comportamiento del proceso de particién, Una vez elegido un limite x, se recorre el array en su totalidad. De aqui que se leven a cabo exactamente ncomparaciones. EI niimero de intercambios puede \Joterminarse en base al Sigtiente razonamiento probabilistico. Se supone que el canjunto de datos que va a ser objeto de particién consta Ucn claves 1... ny que se ha elegido x como limite. Tras el proceso de particion x estar en Ja posicién x-ésima del array. El nimero de intercambios necesarios seri igual al iimero*de clementos en Ja particién izquierda, x — 1, multipl ceado por la probabilidad de que haya que intercambiar una clave. Una clave se cambia sino es menor que el limite x. Esta probabilidad es (n —x + I)/n, El hnimero esperado de intercambios se obtiene sumando para todos los limites posibles y dividiendo por » Mn Ee spet-d aay Por tanto, el nimero esperado de intercambios es aproximadamente 1/6. En el caso més favorable, cuando se selecciona siempre la mediana como mite, cada proceso de particion divide el array en dos partes iguales y ef niimero nnecesario de pasadas para ordenarlo es log n. Por tanto, el total de comparacio nies resultant es m login y el numero total de intercambios 1/6 : log n, Eviden- temente no puede esperarse que se acierte siempre en la mediana, 1c hecho, la probabilidad de que ocurra esto es solamente 1/n. Sorprendentemen- ‘c, sin embargo, el rendimiento medio del método rapido es inferior al caso Spti- ‘mo en un factor solamente de 2-In2 si se elige aleatoriamente el limite. A pesar de ello, este método tiene limitaciones. La primera, que funciona ‘slo moderadamente bien para pequefios valores de 1, como todos los métodos iwanzados. Su ventaja sobre otros métodos avanzados es la facilidad con que puede incorporarse un método de ordenacién directa para tratar las particiones peuefias. Esto es particularmente ventajoso cuando se considera la versién tectrsiva del programa, Todavia queda la cuestion del caso mis desfavoruble. ,COmo se comport reste método en ese caso? La respuesta, desgraciadamente, es decepcionante y revela el tnico punto débil de este método rapido (que en estos casos se convierte en el lento»), Considérese, por ejemplo, el caso infortunado en que, cada vez, se uur como elemento de comparacién el mayor elemento de uns particion. En este ‘ovat, en cada etapa se divide un segmento de m items en una particién izquierda, bun Lelementos y otra particién derecha con un tinico elemento. El resul- lulo ex que se precisan m procesos de subdivision en vez de log n y que el rendi- niemto en ef caso mas desfavorable es del orden de 7°. Aparentemente el paso erucial es la seleccién del elemento de comparacién x bn ef programa ejemplo se toma el elemento medio. Obsérvese que tambi J ORDENACION puede scleccionarseel primero o el ultimo elemento aliz] 0 ald. En estos casos Tatuacién mas desfavorable se produce con el array ordenado ya inicialmentes fon eatns circunstancias el método rapido muestra claramente su desagrado por Turon triviales y sn preferencia por los arrays desordenados. Si se toma el ‘emento medio, esta extrafla earacteristica del método no aparece tan obvia fir aque jel eas0 de array ordenado inicialmente resulta el 6ptimo! De hecho, MH reniniiento medio es ligeramente mejor si se elige el elemento medio. Hoare fropune que la eleecion de x se realice «aleatoriamente» o seleccionindolo tino mediana de una pequeiia muestra de, por ejemplo, tres claves [2.12y 2.13), Train pradente eleccion apenas influye en el rendimiento medio del método, per mejora considerablemente el del caso mas desfavorable, Resulta evidente ne tr ordenacion empleando el método rapido es, en cierta forma, como un vey en el que hay que ser consciente de cudnto puede perderse si hay mala suerte Tay una leceion importante que se desprende de esta experiencia, y que afecta uicctumente al programadot, ;Cusles son las consecuencias del comportamiento tore! eaxo mis desfavorable, mencionado anteriormente, en el rendimiento del proynma 2.117 Se ha comprobado que de cada subdivision resulta una par aralerecha de un elemento dnico; a demanda de ordenar esta particion se alma- ‘cn ct uni pila para ulterior ejecucion, Consiguicntemente, ef nimero maximo “Ie demandas, por tanto, el tamaiio de a pla, es, Esto, desde luego, es absolu- tamentsinaeeptable (obsérvese que no resulta mejor — de hecho es todavia peor ton kt version recursiva porque un sistema que permita Ia activaci6n recursiva de prrovedimientos tendra que almacenar automiéticamente los valores de los paré- Metros y las variables locales de todas las activaciones de procedimientos y uti mmplicitamente una pila para esto), La forma de remediar este problema es Iinacenat la demanda de ordenacion de la particion més larga y continuar direc- tiamente con las nuevas subdivisiones de las particiones més cortas. De esta forma, cl tama de fa pila mse Timita am = logs | eambioa realizar en el programa 2.11 se localiza en I seeci6n que construye tis nuevas demandas. Ahora seria ast it] is < de i then begin if 7 < de then begin {almacenar en pila la demanda de ordenacton de ta partcton derecha} ip + 1; pilalp) «iz: = i; pila{p] .de: = de j) {continuar ordenando ta particion izquierda} 2.16) < jhe {almacenar en pila la demanda de ordenacion de fa particion tequierda} pt ts pile pl oie ie pil pl odes Fi fet i feantinuar ardenande la partcion derecha} ORDENACION DE ARRAYS 89 2.2.7. Obtencién de la mediana La mediana de 1 items se define como aquel que es menor (0 igual) que la tia de os als y e ragor (0 igual) que or mtd, Por empl, fe me- 16 12 99 95 18 87 10 © 18, * El problema de hallar la mediana se relaciona habitualmente con el de orde- nnacién, ya que un método seguro de encontrarla es ordenar los n items y selec- cionar el item situado en el centro. Sin embargo, el método de particién del Programa 2.9 proporciona un procedimiento potencialmente mucho més rapido. 1 método que va a presentarse puede generalizarse ficilmente para resolver el problema de hallar el elemento niimero k en orden de menor a mayor de 7 items. Encontrar In mediana constituye el caso concreto k ~ n/2. El algoritmo, inventado por C. A. R. Hoare [2-4] funciona de la forma si- niente, En primer lugar se aplica la operacién de particién del método rapido para i = 1, de =n tomando afk] como valor (Iimite) de subdivision, x. Los Indices resultantes i, J son tales que 1. aft] < x paratodoh x para todo h > j 17) 3. i> J Pueden presentarse tres casos posibles. |. Bl valor de x empleado para subdivisién era demasiado pequeio; consiguien- temente el limite entre Ins dos particiones es inferior al valor deseado k. El proceso de particién debe repetirse con los elementos afi)... alde] (ver prose pet lementos afi), .., ade] (ve a t TF t a Gt k “ Fig, 29, Limite demasiado pesueno I Jimite elegido x era demasiado grande. Hay que repetir la operacion de sub- divisién con a particion aliz]... aL] (ver Fig. 2.10) t f tT f e ‘ is ae iy, 240, Lite domino pram ww ORDENACION \. j= k < iced elemento afk] subdivide el array en dos particiones en la pro- porcién especificada y por tanto es el valor buscado (ver Fig. 2.11) a a ae 2AM. Limite coreto Hay que repetir el proceso de subdivision hasta que se presenta el caso 3. nse expresa mediante la siguiente parte de programa ie: = Isde while iz < de do begin x: = alk]; particion(aliz] .. a{de)s 2.18) Wj < k then iz: = i itk < ithen de: = j ead 1H lector puede encontrar una demostracién formal de este algoritmo en el articulo original de Hoare. El programa completo encontrar se obtiene inmediata~ inente Programa 2.12. Programa de bisqueda del clemento smo, procedure encontrar (k: integer); var iz, de, i, jy x integer begin iz 2 = 15 de : =n while iz < de do begin x: = alk]; i: = iesj:— des repeat {subdivision} while aff] < xdoi:— i+ 1 hile x < aLj] dof: = j if < j then begin w : = afi]; ali]: = ali]: ab] i:sithjiss-t end wuatil > J tj < kthen iz: = is if k < ithen de: = j oud cen {encontrar} Si se supone que, por imino mediv, ea substivision divide en partes ipsa ORDENACION DE ARRAYS 91 lu particién en que se encuentra cl valor que se busca, el niimero de compara- ciones necesario es: nt dt ot +1l=2 2.19) cs decir, es del orden de n. Esto explica la potencia del programa encontrar para ‘obtener medianas y valores similares y también explica su superioridad sobre el método directo de ordenar el conjunto de items como paso previo a la seleccién lel K-ésimo (que, en el mejor de los casos, es del orden de 7 log n). En el caso mms desfavorable, sin embargo, cada paso de particion reduce el tamaito del conjunto de candidates sélo en un elemento, dando lugar a un mimero’ de com- paraciones del orden de n*, Se insiste en que apenas hay ventaja si se utiliza este algoritmo con un niimero pequefio de elementos, por ejemplo, menor de 10. 2.2.8, Comparacién de los métodos de ordenacién de arrays Para terminar con este desfile de métodos de ordenacién, se va a intentar comparar su eficacia, Se Hama al niimero de items a ordenar y Cy M siguen denominando, respectivamente, los nimeros necesarios de comparaciones y movimientos. Pueden darse formulas analiticas exactas para los tres métodos, ‘le ordenacién directa, Se presentan en la Tabla 2.8. Los nombres de columna ‘in, max, med indican, respectivamente, los valores minimos, méximos y medios sperados, promediados con todas las n! permutaciones de los 7 items. Min Med Max Insecign C= ond (2 bn 28 (2 = mp1 dicta M=2n—1) (a2 Sn 104 PF Bn 4/2 Seen Cm MR ~W 2 m2 deta M= Me) alm 0.57) mk MD) Tntercambio m2 8 — mr (me directo Ge = m0 Ge mrs Crarbuja) “Tabla28.. Comparacién de métodos directos de ordenacdn No se dispone de formulas aproximadas razonablemente simples para los ictaddox avanzados. Los resultados mas notables son que el esfuerzo de com- uticion necesatio es «=n? en el caso del método de Shell y ¢, + log(n) para los métodes rapido y del monticulo, Estas formulas proporcionan una medida a Tos algo- tpoce previst del rendimiento come Fanciones de 1, y peemiten cla 17 ORDENACION ritmes de ordenacién en métodos elementales o directos (n*) y métodos avanza- los @ «logaritmicos> (n log n). Para usos practicos, sin embargo, es conveniente tener algunos datos experimentales que arrojen alguna luz sobre los coeficientes 1.1 fin de clasficar con més precision los diferentes métodos. Ademés, las frmu- livs no tienen on cuenta el esfuerzo computacional invertido en otras operaciones ‘sparte de kis comparaciones entre claves y movimientos de items, tales como crnttol de bucles, ete, Evidentemente, estos Factores dependen en cierta forma dlel equipo conereto en que se procesa, pero, a pesat de ello, un ejemplo de datos ‘obtenides experimentalmente tiene interés informativo. La Tabla 2.9 muestra los tiempos (en milisegundos) consumidos por los métodos de ordenacién es- ttuialos anteriormente, ejecutados por el sistema PASCAL de un computador CLC 6400, Los tres bloques contienen los tiempos utilizados para ordenar un iniray que esta ya inicialmente en orden, una permutacién aleatoria del array y cl array ordenado en sentido inverso. Las columnas izquierdas de cada bloque corresponden a 256 items y las derechas a 512. Los datos de la tabla separan claramiente los métodos de tipo n? de los de tipo n «log n. Son de nota los siguien- fess puntos: Ondenado ‘Aleatorio ‘Orden inverso Invern dies 2 2366 oa 6 sore binerin = S625 378 6690 Sckcién diecta 4891907809 52615 Surbuja Sa 21651026 ta 3981 urbujs con val 3 #0 ots 6342 Sacudida 5 9861 16i9 6520 Shall sue om isp ape Monticulo Hs 25310 tos 226 Ripide 3 © 6 37 9 Morcla® MD eas + Via Apartado 23 Tabla 29, Tiempos de ejecion de programas de ordenacin, 1. a mejora del método de insercién binaria sobre el de insercién directa es imirginal, e incluso es negativa en el caso de ya existir un orden. HI método de la burbuja es definitivamente el peor método de ordenacién Su versién mejorada, el método de la sacudida es, incluso, peor que los de in directa y selevcién directa (excepto en el caso patolégico de orde- nnaciém de un array ya ordenado). \. Ubmétodo rapido supera al del monticulo por un factor de 2a 3. Ordena el uray en orden inverso con una velocidad précticamente idéntica a la corres- pondiente un array ya ordenadto. Hay que aadir que se tilizaron datos farmados inieamente por kt clave, sin otros datos ayociades, Fata hipdtesis no es nauy veaista, La Tabla 2.10 muestra ORDENAGION DE FICHEROS SECUENCIALES 93 cémo influye la ampliacién del tamaiio de los items. En el ejemplo elegido, los datos asociados ocupan siete veces el espacio que utiliza la clave. La columna izquierda de cada bloque presenta el tiempo necesario sin datos asociados, Ia ccolumna derecha se refiere ajla ordenacién con datos asociados: n = 256. ‘Ordenado Aleatorio Orden verso Incersin directa 2 66TH 2130 Insercion bina, 56 io) ora) its = 6m xn) Seeccion directa "7489 SAT 5037 SBD Barbuja ae ee oe ain | Burbuja con sal 5 S108 3237 6S 76 Sacudida 5 596687 Shall FST aS ‘Monticulo W661 HST Répido at s ae ig st 8 Mess » 186 To ty * Vease Apartado 2.31, Tabla 2:10, Ticmpos de ejssucién de programas de ordenactn (lave con datos asociados. Hay que hacer notar que: 1. Bl método de seleccién directa ha mejorado significativamente y resulta el mejor método directo. 2. El método de la burbuja continéa siendo el peor método por un ancho margen y slo su versién mejorada, el método de la sacudida, es ligeramente peor en el caso de array en orden inverso. 3, El método répido ha fortalecido su posicién como el més veloz y aparece como el mejor método de ordenacién de arrays con diferencia. 2.3, ORDENACION DE FICHEROS SECUENCIALES 2.3.1. Método de mezcla directa Desgraciadamente, los algoritmas de ordenacién presentados en el apartado ecedente son inaplicables si la masa de datos a ordenar no abe en la memoria huiincipal del computador y se encuentra representada, por ejemplo, en un dispo~ tivo periférico de almacenamiento secuencial tal como es una cinta. En este suiso se deseriben los datos en forma de fichero (secuencial) cuya caracteristica ‘-sajue en cada momento uno, y s6lo uno de las eomponentes, es accesible directa: hnicnte, Esta es una restriceién importante, comparada con las posibilidades que jnfrece ka estructura array, y, por ello, hay que utilizar técnicas de ordenacién dis- hintis, Lat mis importante es la técnica de fusién o mezcla («merger). Por mezcla ‘entender, en proceso de datos, la combinacién de dos (0 més) secuencias ot- slenadas en wna nie Secuencia ordenada, obtenida por seleccién repetida \ ORDENACION centre los componentes accesibles en cada momento. La mezela es una operacién macho mas simple que la ordenacién y se utiliza como operacién auxiliar en provesos més complejas de ordenacién secuencial. Un método de ordenacién hhasaudo en este tipo de proceso, denominado de mezcla directa, es el siguiente: |. Se divide la secuencia a en dos mitades Hamadas b y c. 2. Se mezclan by ¢ combinando items aislados para formar pares ordenados. 4. Ta secuencia resultante de la mezcla se denomina a, yse repiten los pasos 1 y 2, ‘est vez mezelando los pares ordenados para formar cuddruplos ordenados. |. Se repiten los pasos anteriores, fundiendo los cuadruplos ordenados para formar éetuplos ordenados, y se continta haciendo esto, duplicando cada ver el tamafio de las subsecuencias mezcladas, hasta que Ia secuencia total quede ordenada. Por ejemplo, considérese Ia secuencia 44-55 12 42 94 18 06 67 Fn el paso 1 el procedimiento de subdivisin produce las secuencias 44055 12 42 94 18 06 67 1a mezela de componentes aisiados (que son secuencias ordenadas de longitud 1) para formar pares ordenados produce 44 947 18 55°06 12° 42 67 Subdividiendo nuevamente en partes iguales, y mezclando los pares ordenados se ‘obtiene 06 12 44 94°18 42 55 67 Lins tervera operacién de subdivision y mezcla produce, finalmente, el resultado deseado 06 12 18 42 44 55 67 94 Cadi operacién que (rata una vez el conjunto de datos en su totalidad se deno- ninna unt fase, y el subproceso mas pequeiio que, por repeticion, constituye ef proceso de ordenacién se denomina pasada, Tin ef ejemplo anterior, Ia ordenacién necesits trex pasacas, eae pas coustitiid por un fase ole subdivision y otra de mezcla, Para evi a cabo el ORDENACION DE FICHEROS SECUENCIALES 95 proceso de ordenacién son necesitrias tres cintas; el proceso, por ello, se deno- mina, mezcla 0 fusién con tres cintas. Realmente, las fases de subdivision no contribuyen a la ordenacién, ya que no permutan los items de nipguna forma; en cierto sentido, son improductivas, sungue constituyen la,mitad de todas Ins operaciones de copiado. Pueden cli- minarse totalmente combinando las fases de subdivision y mezcla. En vez de mez- lar produciendo una sécuencia dnica, el resultado del proceso de mezcla se re- Llistribuye inmediatamente sobre dos cintas, que constituyen la base de la pasada subsiguiente. En contraste con el anterior proceso de dos fases, este método se denomina mezcla de fase nica 0 mezcla compensada. Evidentemente es superior porque son necesarias solamente la mitad de las operaciones de copia; el precio dle esta mejoria es una cuarta cinta. A continuacion se desarrollaré un programa de mezcla detalladamente. Los slatos se representan, inicialmente, por un array que, sin embargo, se inspecciona en forma estrictamente secuencial. Una version posterior del método de mezcla se basard en la estructura de fichero, Io que permitird comparar los dos progra- mas y poner de relieve cémo la forma de un programa depende fuertemente de i manera de representar los datos que procesa Puede usarse ficilmente un (nico array en lugar de dos ficheros, si se le con- sidera como una secuencia con dos extremos. En lugar de realizar la mezcla 4 partir de dos ficheros, pueden tomarse articulos de ambos extremos del array. De esta manera, la forma general de la fase combinada de mezela y subdivisidn puede ilustrarse por la Fig. 2.12, El destino de los items mezctados se modifica slespués de cada par ordenado en la primera pasada, cada cuadruplo ordenado cu la segunda pasada, elc., rellenando asi alternativamente las dos secuencias «le destino, representadas por ambos extremos de un array tinico. Después de cada asada, ambos arrays intercambian sus papeles; el de origen se convierte en et tle destino, y viceversa. ovigen destino (- Tig. 22. Método de mena drcts con dos arrays Puede conseguirse una simplificacién mayor uniendo en un solo array de tamaio doble los dos arrays simples conceptualmente distintos. Asi, los datos ‘ ORDENACION a: array{l..2 #1] of item 2.20) los indices i j designan Jos dos items origen mientras k y ! denominan los dos dlestinos (ver Fig. 212), Los datos iniciales son, desde Iuego, los items ay «« «de Hividentemente, se necesita una variable booleana, arriba, para designar la dlievcidn dl flujo de datos; arriba ~ true significard que, en la pasada en cur- 0, los componentes ay ... dq se moverin hacia «arriban, hacia las variables tiys ay Mientras arriba = false indicard que das .-» day deben transferirse hhucin ibajon, es decir, a1, ..., de. El valor de arriba cambia alternativamente centre pasadas consecutivas. Y, finalmente, se introduce una variable p para de- sigmar el tamatio de las «subsecuencias» a mezclar. Su valor inicialmente es 1 y se duplica antes de cada pasada sucesiva. Para simplificar, en cierta forma, s@ stipondri que n es una poteneia de 2. Asi, la primera version del programa de mercla directa toma la forma siguiente: procedure mezcladirecta; var i,j,k, ls indice; arriba: boolean: p: integers begin arriba : = true; p: = 1: repeat {inicializar indices} if arriba then begin: = 1; j:=nkism tla 2en end else 21 begin: =1;f:= mj: ath jis 2en end: ‘amezclar pruplos de las secueneias i, jen las secuencias k, by; arriba : = “arriba; p: = 2 p until p =n end el paso siguiente se «refinay Ia instruccién expresada (entre comillas) cen lenguaje natural, Evidentemente, esta pasada de mezcla que afecta a n items cs. en si misma, una sucesién de mezclas de subsecuencias, es decir, de p-uplos. Tintre cada dos mezclas parciales se cambia el destino pasando del exttemo inferior dlcl array al superior o viceversa, con cl fin de garantizar una distribucién equili« Inrada entre ambos destinos. Si el destino de los items mezclados es el extremo inferior del array, el indice de destino es k, que se inerementa en | después de ‘sist movimiento de un articulo. Si los items han de trasladarse al extremo supe- vio del array de destino, el indice es J, que debe disminuirse en | después de cada ‘movimiento, Para simplificar Ia instruccién de mezcla se va a designar el indice ide destino como k todas Tas veces, intercambiando los valores de las variables k ¥ Ly se denominaré el ineremento a utilizar, todas las veces, por f, tomando ft valores 1.4L. sts consideraciones de diseito conducen al siguiente «refina- niente ORDENACION DE FICHEROS SECUENCIALES 97 hs = Lm: =n; {m = no, de items a mezclar} repeat q = piri = psn: =m —2* pi sanezelar q arliculos de i con r articulos de j; el indice de destino es k coniineremento hm; 22) him séntercambiar K y, b>; stil En el nuevo paso de refinamiento hay que formular la instruccién real de mez- cla, Aqui hay que tener en cuenta que el final de una subsecuencia que no se ha vaciado en el proceso de mezcla debe afladirse a la sucesién de salida mediante simples operaciones de copia, while (q +0) (r + 0) do begin {seleccionar un item de to j} i ali] -clave < al] -clave then begin «mover un item de ia k; avanzar keinsqi=q 1 end else begin «mover un item de jak; avanzar jy ks r end end ‘«copiar final de la secuencia i»; ‘«copiar final de la secuencia j> Después de este nuevo refinamiento, con ka copia del final de las secuencias, quedan estudiados todos los detalles del programa. Antes de escribirlo de forma ‘completa, interesa eliminar la restriccién de que n sea una potencia de 2. ,Qué hwartes del algoritmo resultan afectadas al eliminar esta restricci6n? Es facil convencerse de que la mejor manera de tratar este caso més general es seguir cl método anterior mientras sea posible. En el ejemplo, esto significa que hay que continuar mezelando p-uplos hasta que los restos de las sucesiones origen sean nwenores que p. La tinica parte afectada por la climinacién de la restriccién est cconstituida por las instrucciones que determinan los valores de q y r, longitudes tie las secuencias « mezclar. Las siguientes cuatro instrucciones sustituyen las tres q=pir:=pim:—m—2+p y. el leetor debe convencerse de ello, representan una implementacion efectiva slo la estrategia especificada anteriormente; obsérvese que m designa el mimero total de items en las dos sucesiones origen que quedan por mezclar itm > pal itm - pal pedseg: mim: — mg pelser: mom: om ot

También podría gustarte