Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Captulo 1
Introduccin a las estructuras de datos
1.1 Objetivo Educacional
Representar y aplicar los tipos de datos abstractos por medio de un lenguaje de programacin.
1.4 Introduccin
La primera cosa con la que nos enfrentamos al escribir un programa es con el problema. Tpicamente, los problemas son "de la vida real" y lo que queremos es facilitar la escritura del programa para resolver dicho problema. Sin embargo, los problemas de la vida real son nebulosos y la primera cosa que se tiene que hacer es tratar de entender el problema para separar
los detalles esenciales de los no esenciales: se trata de obtener una perspectiva propia abstracta o modelo del problema. Este proceso de modelado se llama abstraccin:
Problema
Modelo
Abstraccin
Para este modelo se enfoca solamente en aspectos relacionados con el problema y lo que se trata es de definir las propiedades del problema, que incluyen:
los datos que son afectados las operaciones que son identificadas por el problema.
Es decir, la abstraccin es la estructuracin de un problema nebuloso en entidades bien definidas por medio de la definicin de sus datos y operaciones. Consecuentemente, estas entidades combinan datos y operaciones. No estn desacoplados unos de otros. Por medio de la abstraccin se crea una entidad bien definida que puede ser adecuadamente manejada. Estas entidades definen la estructura de datos de un conjunto de elementos. Las estructuras de datos son abstracciones que se usan para manejar grandes cantidades de informacin y las relaciones entre diferentes piezas de informacin. Tambin mantienen una relacin estrecha con la complejidad algortmica seleccionar una estructura de datos apropiada para un trabajo es crucial para escribir buen software. Debido a que las estructuras de datos son abstracciones de alto nivel, estas nos presentan operaciones en grupos de datos, tal como agregar un dato a una lista, o buscar el dato de prioridad ms alta en una cola. Cuando una estructura de datos provee operaciones, podemos llamar a la estructura un tipo de dato abstracto (algunas veces abreviado como ADT por sus
siglas en ingls o TDA en espaol). Un tipo de dato abstracto puede minimizar dependencias en el cdigo, que es importante cuando el cdigo necesita ser cambiado. Los lenguajes de programacin ofrecen una serie de tipos de datos bsicos o elementales que pueden emplearse para almacenar datos en variables y definir la forma en que podrn manipularse esos datos, tales como los nmeros enteros y de punto flotante que permiten trabajar con objetos de datos para los cuales el procesador de la computadora tiene un soporte nativo. Estos tipos construidos son abstracciones que el procesador actualmente provee porque los tipos construidos ocultan detalles acerca de su ejecucin y limitaciones. Por ejemplo, en el caso del tipo int, la representacin interna emplea una cantidad determinada de bytes y algn tipo de codificacin (como complemento a 2), para almacenar los nmeros. Sin embargo, cuando usamos variables de este tipo en un programa, slo nos interesa saber que pueden almacenar nmeros enteros sin decimales, y que existen varios operadores disponibles que pueden aplicarse a las expresiones de este tipo. Cuando mucho nos interesar saber los valores mnimo y mximo que pueden almacenarse y estos valores estn definidos mediante constantes, de modo que los programas no sean dependientes de un computador o compilador particular. Cuando se usa un nmero de punto flotante se est primeramente conciente de su valor y las operaciones que se pueden aplicar a ellos. Si se considera el clculo de la longitud de la hipotenusa como: c = sqrt(a * a + b * b) esta lnea usa patrones comunes para calcular los valores y acumular el resultado. De hecho, estos patrones son tan repetitivos que los lenguajes de alto nivel fueron creados para evitar esta redundancia y permitir a los programadores pensar acerca de qu valor fue calculado en lugar de cmo fue calculado. Aqu estn inmersos dos conceptos tiles y relacionados: La abstraccin, es como una ignorancia selectiva, no es ser poco especfica, es ms bien crear un nuevo nivel, en el cual se puede ser absolutamente preciso1. Es la transparencia que tiene el programador para manipular los tipos de datos, independientemente de su representacin, es
1
Edsger Dijkstra
decir, cuando patrones comunes se agrupan juntos bajo un solo nombre y entonces se parametrizan con objeto de obtener un entendimiento de alto nivel de tal patrn. Por ejemplo, la operacin de multiplicacin requiere dos valores fuente y escribir el producto de esos dos valores en un destino dado. La operacin se parametriza por las dos fuentes y el destino. La encapsulacin es un mecanismo para ocultar a los usuarios, los detalles de implementacin de una abstraccin. Cuando se multiplican nmeros, por ejemplo, no se necesita conocer la tcnica usada por el procesador, slo se necesitan conocer sus propiedades. Cada estructura de datos puede ser concebida como una sola unidad que tiene un conjunto de valores y un conjunto de operaciones que pueden ser ejecutadas para acceder o cambiar esos valores.
Pero, cmo se logra crear dicha proteccin? Segn la ecuacin de Niklaus Wirth un programa se define de la siguiente manera: Programa = Datos + Algoritmos Si se pueden separar e identificar en un algoritmo las instrucciones que manipulan los datos de las instrucciones que indican control, entonces se puede reescribir la ecuacin como: Programa = Datos + (AlgoritmosDatos + AlgoritmoControl) Donde: TDA = Datos + Algoritmos-Datos y por tanto la ecuacin quedara as: Programa = TDA + Algoritmo de Control Una definicin de TDA podra ser la siguiente: Es un tipo de dato definido por el usuario para representar una entidad (abstraccin) a travs de sus caractersticas (datos o atributos) y sus operaciones o funciones (algoritmos que manipulan los datos). TDA = Datos + AlgoritmosDatos. De todo esto, ahora entenderemos a la abstraccin de datos como una metodologa que permite aislar la implementacin de un tipo de dato compuesto a partir de tipos bsicos. La idea es estructurar los programas de modo que trabajen sobre datos abstractos, sin conocer su implementacin. Slo se requiere una interfaz, predefinida e invariante. Puede decirse que es una tcnica poderosa de programacin que permite inventar o definir nuevos tipos de datos, observando e identificando entidades del mundo real (objetos), explicando el qu y no el cmo, y ocultando datos irrelevantes para la resolucin del problema, lo que permite a los programas que sean ms cortos, legibles y flexibles. Se puede poner como ejemplo el caso de un auto. El ser humano es capaz de conducir distintos autos, de distintas marcas, modelos y aos, sin tener necesidad de saber cmo funciona cada uno de sus componentes. De hecho, no todos los autos tienen los mismos componentes. Incluso, los
componentes que son comunes, a pesar de tener la misma funcionalidad, difieren en marcas, modelos, rendimiento, costo, etc. En resumen, la implementacin es distinta pero tienen la misma funcionalidad. De manera similar, una implementacin particular de un tipo de datos es independiente de los programas que lo usan. Lo nico que es intocable es la interfaz. Volviendo al ejemplo del auto, todas las marcas y modelos poseen algo en comn: Una forma de uso establecida por parmetros de operacin y por la forma de entregar esos parmetros (forma de usar el volante, el acelerador, el freno, etc. Nadie comprara un auto en que el freno se encuentre a la derecha del acelerador, o que el volante funcione girando el auto a la derecha cuando se mueve hacia la izquierda. En resumen, los datos que componen el TDA se mantendrn ocultos de los programadores que lo usan. La nica forma de accederlos es a travs de la interfaz, la cual est compuesta por mtodos, llamados constructores y selectores. Todo TDA debe tener al menos un constructor y varios selectores. La interfaz implementa la funcionalidad del TDA manipulando los datos almacenados. Los constructores son los encargados de inicializar las nuevas instancias del TDA. Esta inicializacin puede hacerse con valores por defecto o con valores suministrados por el programador al invocar el constructor. Un TDA puede tener varios constructores, normalmente para inicializar de distinto modo la nueva instancia. Por ejemplo, podra haber un constructor que inicialice con valores por defecto (funcin sin parmetros), y otro que inicialice con ciertos valores pasados como parmetro. Los selectores permiten extraer, agregar, modificar, o eliminar datos a partir de una instancia del TDA. Un TDA podramos visualizarlo de la siguiente manera:
Tipo de dato abstracto Estructura de datos abstracta Operaciones Interface
Sin embargo, lo primero que se debe considerar antes de programar es revisar el problema. Como los problemas son complejos, se debe analizar solo lo ms importante y separar los detalles generales de los especficos para obtener el modelo abstracto de ese problema. Por ejemplo, suponer que se quiere generar un modelo sencillo que se aplique a todos los perros: El perro tiene nombre, raza y cantidad de ladridos que da. El perro ladra y come
Y este sera el modelo abstracto del perro. Otro ejemplo sencillo de creacin de un TDA sera para representar los nmeros racionales. La abstraccin nos permite reconocer el comportamiento de un nmero racional y el estado de los atributos del mismo, entonces: TDA: Racional Comportamiento Sumar, restar, multiplicar, simplificar, etc. Estado Numerador Denominador: siempre debe ser diferente de cero La mejor abstraccin es aquella que hace simples las cosas complejas, rescatando y resaltando los conceptos fundamentales y escondiendo los aspectos no importantes como los detalles de la implementacin.
1) Una especificacin Sintctica, en donde se especifica qu hace? Su interfaz, que es la especificacin de las entidades y sus propiedades: Definir el nombre de las entidades abstractas. Definir el nombre de las operaciones indicando el dominio (argumentos) y el codominio o rango (los valores de retorno). 2) Especificacin Semntica, en donde se especifica cmo lo hace? La descripcin de la representacin del objeto (estructura de los datos) y desarrollo de las operaciones: Definir el significado de cada operacin usando los smbolos definidos en la especificacin sintctica. La especificacin semntica puede ser de dos tipos: (1) Informal, a travs del lenguaje natural, aunque no se recomienda, ya que ste dara lugar a las ambigedades y (2) Formal, rigurosa y fundamentada matemticamente. Para la representacin formal se puede usar el enfoque operacional y enfoque algebraico. La ms utilizada es el enfoque operacional que usa modelos abstractos, a travs de: Define la semntica del TDA especificando el significado de cada operacin en trminos de otros modelos, llamado modelo de referencia (formalmente definido). Denotar la semntica de cada operacin, mediante la definicin de un procedimiento o funcin indicando una precondicin y poscondicin definidas sobre el modelo de referencia. {P} Precondicin: condiciones que deben cumplirse antes de realizar la operacin. {Q} Poscondicin: condiciones que se cumplen una vez realizada la operacin. La notacin usual {P} S {Q} donde S es la funcin o procedimiento.
Tipo de Op.
T T A C A A
Donde: los tipos de operaciones son: C Constructoras: crear objetos del TDA, como en: Crear_Complejo A Acceso o Analizadoras: permite obtener componentes del TDA como resultado, como en: Parte_Real. T Transformacin o Simplificadoras: cambios al TDA y retornan un objeto del TDA como resultado, p.e: Sumar y Multiplicar. Especificacin Semntica: Complejo Sumar ( Complejo X, Y ) Precondicin: X, Y son del tipo Complejo Si X = (X1, X2) y Y = (Y1, Y2) entonces Z = (Z1, Z2) donde Z1 = X1 + Y1 y Z2 = X2 + Y2 Poscondicin: Z es del tipo Complejo, Z = X + Y Complejo Multiplicar ( Complejo X, Y ) Precondicion: X,Y son del tipo Complejo Si X = (X1, X2) y Y = (Y1, Y2) entonces Z = (Z1,Z2) tal que Z1 = X1 * Y1 X2 * Y2 y Z2 = X1 * Y2 + X2 * Y1 Poscondicin: Z es Complejo, Z = X * Y Booleano Igual ( Complejo X, Y ) Precondicin: X, Y son del tipo Complejo Si X = (X1, X2) y Y = (Y1, Y2) entonces Si X1 = Y1 y X2 = Y2 entonces Resultado = Verdadero. sino Resultado = Falso Poscondicin: Resultado de comparar (X = Y) Real Parte_Real ( Complejo X ) Precondicin: X es del tipo Complejo Poscondicin: Si X = (X1, X2)
entonces Resultado = X1 Complejo Crear_Complejo ( Real X1, X2 ) Precondicin: X1 y X2 son del tipo Real. Poscondicin: X = (X1, X2) resultado X es Complejo Ahora se puede elegir una representacin concreta para el TDA en trminos de las estructuras de datos definidas en un lenguaje de programacin o pseudo lenguaje y codificar los procedimientos basndose en la estructura seleccionada. En seguida se muestra un extracto de cmo implementar en un pseudo lenguaje el TDA para el Complejo: tipo Complejo = class Real re; Real imag; Complejo Sumar ( Complejo X, Y ) Z Complejo; Z.re = X.re + Y.re; Z.imag = X.imag + Y.imag; Retornar Z; Real Parte_Real ( Complejo X ) Retornar X.re; . finClass Se recomienda que se implementen el resto de las operaciones definidas para el complejo. Para un usuario del TDA, en la resolucin de problemas bsicamente lo que interesa es la especificacin sintctica del TDA, pues es lo que permite utilizarlo: crear instancias de variables del tipo y aplicar operaciones sobre esas variables.
1.6 Modularidad
10
En el proceso de desarrollo de software ste se descompone en componentes, a los cuales se les asocia normalmente un nombre. Estos componentes se denominan mdulos. De esta forma el software se hace ms manejable, ya que es ms sencillo enfrentarse a un problema por partes que a la totalidad. Se aplica as la tcnica de divide y vencers. Sin embargo, la descomposicin del software en un nmero excesivo de mdulos puede producir un aumento de la complejidad ya que aumentan las interfaces entre los mdulos. La modularidad por tanto, descompone un programa en un pequeo nmero de abstracciones independientes unas de otras pero fciles de conectar entre s. Un mdulo se caracteriza principalmente por su interfaz y su implementacin: si no se necesita algn tipo de informacin, no se debe tener acceso a ella. La organizacin de los mdulos de un programa se realiza normalmente de forma jerrquica. De esta forma, existirn mdulos subordinados y otros mdulos superiores. Cada mdulo superior podr ser a su vez un mdulo subordinado. Se definen por tanto los siguientes conceptos: Visibilidad: componentes que pueden ser invocados o usados sus datos por otro componente (tanto de forma directa o indirecta). Conectividad: mdulos a los que invoca o utiliza sus datos otro mdulo.
La visibilidad y conectividad de cada mdulo son dos caractersticas de la jerarqua de control. Uno de los principios en la descomposicin modular de una solucin es que la informacin contenida en un mdulo sea inaccesible al resto de los mdulos que no necesitan acceder a esa informacin. De esta forma se conseguirn mdulos independientes, establecindose la comunicacin entre esos mdulos solo mediante la informacin necesaria para realizar su funcin. La modularidad es un aspecto muy importante en los TAD, ya que es el reflejo de la independencia de la especificacin y la implementacin. Es la demostracin de que un TAD
11
puede funcionar con diferentes implementaciones. Adems de esto, la programacin modular ofrece otras ventajas, como por ejemplo un mejor reparto del trabajo y una deteccin de fallos mucho mejor.
12
La parte del sistema operativo que administra la memoria se llama administrador de memoria y su labor consiste en llevar un registro de las partes de memoria que se estn utilizando y aquellas que no, con el fin de asignar espacio en memoria a los procesos cuando stos la necesiten y liberndola cuando terminen, as como administrar el intercambio entre la memoria principal y el disco en los casos en los que la memoria principal no le pueda dar capacidad a todos los procesos que tienen necesidad de ella. Los sistemas de administracin de memoria se pueden clasificar en dos tipos: los que desplazan los procesos de la memoria principal al disco y viceversa durante la ejecucin y los que no. El propsito principal de una computadora es el de ejecutar programas, estos programas, junto con la informacin que accesan deben de estar en la memoria principal (al menos parcialmente) durante la ejecucin. Para optimizar el uso del CPU y de la memoria, el sistema operativo debe de tener varios procesos a la vez en la memoria principal, para lo cual dispone de varias opciones de administracin tanto del procesador como de la memoria. La seleccin de uno de ellos depende principalmente del diseo del hardware para el sistema. A continuacin se mencionan los conceptos importantes correspondientes a la administracin de la memoria como la memoria real y la virtual, el espacio de direcciones y la unidad de manejo de la memoria. La memoria real o principal es en donde son ejecutados los programas y procesos de una computadora y es el espacio real que existe en memoria para que se ejecuten los procesos. Por lo 13
general esta memoria es de mayor costo que la memoria secundaria, pero el acceso a la informacin contenida en ella es de ms rpido acceso. Solo la memoria cache es ms rpida que la principal, pero su costo es a su vez mayor.
Sistema operativo residente, normalmente en la parte baja de memoria con los vectores
de interrupcin.
La memoria virtual se asocia a dos conceptos que normalmente aparecen unidos: 1. El uso de almacenamiento secundario para ofrecer al conjunto de las aplicaciones la ilusin de tener ms memoria RAM de la que realmente hay en el sistema. Es decir, se pueden tener en ejecucin mas aplicaciones de las que realmente caben en la memoria principal, sin que por ello cada aplicacin individual pueda usar ms memoria de la que realmente hay o incluso de forma ms general, ofreciendo a cada aplicacin ms memoria de la que existe fsicamente en la mquina. 2. Ofrecer a las aplicaciones la ilusin de que estn solas en el sistema, y que por lo tanto, pueden usar el espacio de direcciones completo. Esta tcnica facilita enormemente la generacin de cdigo, puesto que el compilador no tiene porque preocuparse sobre dnde residir la aplicacin cuando se ejecute. Los espacios de direcciones involucrados en el manejo de la memoria son de tres tipos:
Direcciones fsicas: son aquellas que referencian alguna posicin en la memoria Direcciones lgicas: son las direcciones utilizadas por los procesos. Sufren una
fsica.
serie de transformaciones realizadas por el procesador (la MMU), antes de convertirse en direcciones fsicas.
Direcciones lineales: direcciones lineales se obtienen a partir de direcciones lgicas tras haber aplicado una transformacin dependiente de la arquitectura.
14
Los programas de usuario siempre tratan con direcciones virtuales; nunca ven las direcciones fsicas reales. La unidad de manejo de memoria (MMU) es parte del procesador y stas son sus funciones:
Convertir las direcciones lgicas emitidas por los procesos en direcciones fsicas. Comprobar que la conversin se puede realizar. La direccin lgica podra no tener una direccin fsica asociada. Por ejemplo, la pgina correspondiente a una direccin se puedo haber trasladado a una zona de almacenamiento secundario temporalmente.
Comprobar que el proceso que intenta acceder a una cierta direccin de memoria tiene permisos para ello. La MMU se inicializa para cada proceso del sistema. Esto permite que cada proceso pueda usar el rango completo de direcciones lgicas (memoria virtual), ya que las conversiones de estas direcciones sern distintas para cada proceso.
En todos los procesos se configura la MMU para que la zona del ncleo solo se pueda acceder en modo privilegiado del procesador. La configuracin correspondiente al espacio de memoria del ncleo es idntica en todos los procesos.
Ahora bien, en cuanto a la asignacin de memoria, sta consiste en determinar cual espacio vaco en la memoria principal es el ms indicado para ser asignado a un proceso. Puede hacerse una asignacin de particin simple, en la cual puede utilizarse un esquema de registro de relocalizacin y lmite para proteger un proceso de usuario de otro y de cambios del cdigo y datos del sistema operativo. Este registro de relocalizacin contiene la direccin fsica mas pequea; el registro lmite contiene el rango de las direcciones lgicas y donde cada direccin lgica debe ser menor al registro lmite. Tambin est la asignacin de particiones mltiples, donde los bloques de distintos tamaos estn distribuidos en memoria, cuando llega un proceso se le asigna un hueco suficientemente grande para acomodarle.
15
Para que el sistema operativo pueda hacer asignacin de memoria cuando sta sea requerida, debe tener informacin sobre: las particiones asignadas y las particiones libres o huecos.
16
Sin embargo, las tcnicas de asignacin de memoria esttica son sencillas: a partir de una posicin sealada por un puntero de referencia se aloja el objeto X, y se avanza el puntero tantos bytes como sean necesarios para almacenar el objeto X. La asignacin de memoria se hace en tiempo de compilacin y los objetos estn vigentes desde que comienza la ejecucin del programa hasta que termina. En los lenguajes que permiten la existencia de subprogramas, y siempre que todos los objetos de estos subprogramas puedan almacenarse estticamente se aloja en la memoria esttica un registro de activacin correspondiente a cada uno de los subprogramas. Estos registros de activacin contendrn las variables locales, parmetros formales y valor devuelto por la funcin. Dentro de cada registro de activacin las variables locales se organizan secuencialmente. Existe un solo registro de activacin para cada procedimiento y por tanto no estn permitidas las llamadas recursivas. El proceso que se sigue cuando un procedimiento p llama a otro procedimiento q es el siguiente: 1. p evala los parmetros de llamada, en caso de que se trate de expresiones complejas, usando para ello una zona de memoria temporal para el almacenamiento intermedio. Por ejemplos, s la llamada a q es q((3*5)+(2*2),7) las operaciones previas a la llamada propiamente dicha en cdigo mquina han de realizarse sobre alguna zona de memoria temporal. (En algn momento debe haber una zona de memoria que contenga el valor intermedio 15, y el valor intermedio 4 para sumarlos a continuacin). En caso de utilizacin de memoria esttica sta zona de temporales puede ser comn a todo el programa, ya que su tamao puede deducirse en tiempo de compilacin. 2. q inicializa sus variables y comienza su ejecucin. Dado que las variables estn permanentemente en memoria es fcil implementar la propiedad de que conserven o no su contenido para cada nueva llamada.
17
18
La solucin consiste en utilizar memoria dinmica. La memoria dinmica es un espacio de almacenamiento que se solicita en tiempo de ejecucin. De esa manera, a medida que el proceso va necesitando espacio para ms lneas, va solicitando ms memoria al sistema operativo para guardarlas. El medio para manejar la memoria que otorga el sistema operativo, es el puntero, puesto que no podemos saber en tiempo de compilacin dnde nos dar huecos el sistema operativo (en la memoria de nuestra computadora). Cuando se hace una reserva de memoria dinmica y ms adelante ya no es requerida, entonces hay que liberar esa memoria. Un problema de asignacin de memoria dinmica, es el cmo satisfacer una necesidad de tamao n con una lista de huecos libres. Existen muchas soluciones para el problema. El conjunto de huecos es analizado para determinar cul hueco es el ms indicado para asignarse. Las estrategias ms comunes para asignar algn hueco de la tabla son: Primer ajuste: Consiste en asignar el primer hueco con capacidad suficiente. La bsqueda puede iniciar ya sea al inicio o al final del conjunto de huecos o en donde termin la ltima bsqueda. La bsqueda termina al encontrar un hueco lo suficientemente grande. Mejor ajuste: Busca asignar el espacio ms pequeo de los espacios con capacidad suficiente. La bsqueda se debe de realizar en toda la tabla, a menos que la tabla est ordenada por tamao. Esta estrategia produce el menor desperdicio de memoria posible. Peor ajuste: Asigna el hueco ms grande. Se busca en toda la tabla de huecos a menos que est organizada por tamao. Esta estrategia produce los huecos de sobra ms grandes, los cuales pudieran ser de ms uso si llegan procesos de tamao mediano que quepan en ellos. Se ha demostrado mediante simulacros que tanto el primer y el mejor ajuste son mejores que el peor ajuste en cuanto a minimizar el tiempo del almacenamiento. Ni el primer o el mejor ajuste
19
es claramente el mejor en trminos de uso de espacio, pero por lo general el primer ajuste es ms rpido. Desde luego que la aplicacin de estos mtodos de gestin de memoria presentan un problema, que es la fragmentacin. La fragmentacin es generada cuando durante el reemplazo de procesos quedan huecos entre dos o ms procesos de manera no contigua y cada hueco no es capaz de soportar ningn proceso de la lista de espera. sta puede ser:
Externa: existe el espacio total de memoria para satisfacer un requerimiento, pero no es contigua. Interna: la memoria asignada puede ser ligeramente mayor que la requerida; esta referencia es interna a la particin, pero no se utiliza.
La fragmentacin externa se puede reducir mediante la compactacin para colocar toda la memoria libre en un solo gran bloque, pero esta solo es posible si la relocalizacin es dinmica y se hace en tiempo de ejecucin.
20
en este caso, hay una interactuacin entre ellos, es decir, si se quiere permitir nombres ms largos se tiene que reducir el tamao posible de la clase. Por ejemplo, si se quiere permitir nombres hasta de 100 caracteres, dado que slo hay 3000 localidades de memoria, entonces el lmite por clase es de 30 personas, aunque hay el riesgo de que no se inscriban las 30 personas en la clase. Con la asignacin dinmica, no se tendr que pensar acerca de cunta gente debe inscribirse en la clase, o de qu tamao deben ser sus nombres. Se pueden acomodar 30 personas con nombres de 100 caracteres y 300 personas con nombres de 10 caracteres.
21
Las estructuras de datos son muy importantes en sistemas computacionales. En un programa cada variable pertenece a alguna estructura de datos, ya sea que esta estructura haya sido declarada de manera explcita o sea implcita al lenguaje, y esta estructura determina el conjunto de operaciones vlidas sobre ella. Cada estructura de datos lgica puede tener una o varias representaciones fsicas diferentes para sus almacenamientos posibles. Es decir, hablamos de estructuras lgicas de datos tal como se definen los tipos de datos abstractos mencionados anteriormente, entendiendo por abstraccin una simplificacin de la realidad.
22
Los datos son una abstraccin de la realidad en el sentido de que ciertas propiedades y caractersticas de los objetos reales se ignoran porque no interesan para el problema concreto que se estudia. Un tipo de dato se ha visto como un mtodo de interpretacin de los contenidos de la memoria de una computadora. Un tipo de dato es un concepto abstracto definido por un conjunto de propiedades lgicas. Una vez que se haya definido el tipo de dato abstracto y se hayan especificado las operaciones legales de dicho tipo, podemos implementar ese tipo de dato. Tal implementacin puede ser del hardware en el cual el circuito necesario para realizar la operacin requerida es diseado y construido como parte de la computadora, o puede ser en software, en el cual se escribe un programa que consiste de instrucciones de hardware ya existentes para interpretar las hileras de bits en la forma deseada y para realizar las operaciones requeridas. Es decir que una implementacin en software incluye las especificaciones de cmo un objeto del nuevo tipo de dato es representado por medio de los objetos previamente existentes de los otros tipos de datos, como tambin las especificaciones de cmo manipular dicho objeto en conformidad con las operaciones que se han definido.
1.9.6 Clasificacin
ELEMENTALES: Aquellas estructuras cuya manipulacin y representacin se ha estandarizado en los lenguajes de programacin: Primitivas: enteros, flotantes, boolean, char, etc. Simples: strings, arreglos, conjuntos, registros lgicos
COMPUESTAS: Aquellas estructuras cuya manipulacin y representacin requieren un mayor nivel de abstraccin por parte del usuario: Lineales: pilas, colas, listas 23
Cualquier otra creada por el programador Asimismo, las estructuras de datos tambin pueden clasificarse segn el tipo de variables que se utilicen. Las variables que pueden utilizarse durante la ejecucin de un programa pertenecen a dos clases: las variables estticas que son aquellas que se declaran y se nombran cuando se escribe el programa, y las variables dinmicas que son creadas (y quiz destruidas) durante la ejecucin del programa. Para las primeras, desde el momento de la compilacin se reserva el espacio de almacenamiento requerido de acuerdo al tipo de dato, y ese espacio permanece asignado a esa variable durante la ejecucin del programa, como el caso de los tipos primitivos en Java y en el caso de las variables dinmicas, no existen cuando se compila el programa sino slo cuando se corre, y se emplean referencias, como con los objetos en Java. De esta manera podemos hablar de estructuras estticas y estructuras dinmicas. Se puede decir que una estructura de dato se forma con la seleccin adecuada de los tipos de datos y la definicin de operaciones para esos tipos de datos, resumida en la siguiente frmula: ESTRUCTURA DE DATOS = TIPOS DE DATOS (Declaracin de variables y definicin de tipos) + OPERACIONES BSICAS (algoritmo) mtodos
La importancia que las estructuras de datos tienen en el desarrollo de una aplicacin, se puede enfatizar recordando la frmula de Niklaus Wirth que indica que un programa se obtiene tras el diseo correcto del algoritmo y la eleccin adecuada de la estructura de datos: PROGRAMA = DATOS + ALGORITMOS Y si substituimos en esta ecuacin datos por estructuras de datos tenemos: PROGRAMA = ESTRUCTURAS DE DATOS + ALGORITMOS
24
25