Vous êtes sur la page 1sur 25

Apuntes de Estructura de Datos

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.2 Competencia especfica a desarrollar


Que el alumno represente y aplique los tipos de datos abstractos por medio de un lenguaje de programacin.

1.3 Actividades de aprendizaje


Prctica de ejercicios. Elaborar un programa en un lenguaje de programacin que incorpore en un vector de n elementos sus operaciones bsicas: insertar, eliminar, ordenar, buscar, cantidad de memoria esttica utilizada y tiempo de ordenamiento. Prctica de ejercicios. Elaborar un programa en un lenguaje de programacin que incorpore en una lista de n elementos de forma ordenada. Considere adems las funciones de eliminar, buscar y cantidad de memoria dinmica utilizada.

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

Apuntes de Estructura de Datos

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

Apuntes de Estructura de Datos

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

Apuntes de Estructura de Datos

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.

1.5 Tipos de datos abstractos (TDA)


Aqu presento varias definiciones, segn varios autores: Un TDA es un modelo matemtico con una coleccin de operaciones definidas sobre el modelo (Aho, Hoperoft y Ullman. Fundamental Structures of Computer Science, 1981). Una clase de objetos definida por una especificacin independiente de la representacin (Guttag Abstract Data Type and development of data structures. ACM . Vol 206, 1977) Es un tipo de dato definido por el usuario a travs de una especificacin y una implementacin de los objetos abstractos. (Rowe, types ACM sigplan, Vol 161, 1980). Para algunos autores un TDA no es ms que una estructura algebraica que representa una entidad y las operaciones que permitan manipularla. La caracterstica ms importante de esta representacin es que intenta crear una proteccin de las entidades representadas, es decir: Oculta la representacin e implementacin de la entidad y sus operaciones. 4

Apuntes de Estructura de Datos

Los datos slo se manipulan a travs de sus operaciones.

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

Apuntes de Estructura de Datos

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

Apuntes de Estructura de Datos

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.5.1 Especificacin de un TDA


La especificacin de un TDA debe ser clara, concisa y sin ambigedades y puede ser a travs de:

Apuntes de Estructura de Datos

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.

1.5.2 Ejemplo de especificacin de un TDA


TDA COMPLEJO cuyos objetos son los nmeros complejos (parte real e imaginaria). La parte imaginaria es la raz cuadrada de un nmero negativo. X = (X1, X2)

Apuntes de Estructura de Datos

Especificacin Sintctica: Nombre de la operacin


Sumar Multiplicar Igual Crear_ Complejo Parte_Real Parte_Imaginaria

Nombre del TDA: Complejo Dominio Rango (codominio)


Complejo x Complejo Complejo x Complejo Complejo x Complejo Real x Real Complejo Complejo Complejo Complejo Complejo Complejo Real Real

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)

Apuntes de Estructura de Datos

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

Apuntes de Estructura de Datos

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

Apuntes de Estructura de Datos

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.

1.7 Uso del TDA


Usar el TDA permite aprovechar el nivel de abstraccin en el desarrollo de un problema. Por ejemplo: Resolver el problema de verificacin si la suma y multiplicacin de 2 nmeros complejos producen el mismo nmero complejo. Solucin en pseudo lenguaje: INICIO // Programa principal Complejo X, Y Booleano A X = Crear_Complejo ( 3, -5 ) Y = Crear_Complejo ( 8, -3 ) A = Verificar1( X, Y ) Si A = verdadero entonces imprimir Son iguales la suma y la multiplicacin sino imprimir NO son iguales la suma y la multiplicacin Booleano Verificar1 ( Complejo X, Y ) Complejo Z1, Z2 Z1 = Sumar ( X, Y ) Z2 = Multiplicar ( X, Y ) Retornar Igual ( Z1, Z2 ) Booleano Verificar2 ( Complejo X, Y ) Retornar Igual ( Sumar ( X, Y ), Multiplicar ( X, Y ) ) Las siguientes son algunas de las ventajas de utilizar un TDA: Herramienta para resolver problemas (nivel de abstraccin) Independencia entre la forma de representar la informacin y la solucin del problema portabilidad de la solucin. Favorece la especificacin, verificacin y depuracin de programas. Contribuye a la flexibilidad de los cambios.

12

Apuntes de Estructura de Datos

1.8 Manejo de memoria


La memoria es uno de los principales recursos de la computadora, la que debe de administrarse con mucho cuidado. Aunque actualmente la mayora de los sistemas de cmputo cuentan con una alta capacidad de memoria, de igual manera las aplicaciones actuales tienen tambin altos requerimientos de memoria, lo que sigue generando escasez de memoria en los sistemas multitarea y/o multiusuario.

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

Apuntes de Estructura de Datos

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.

La memoria principal normalmente se divide en dos particiones:

Sistema operativo residente, normalmente en la parte baja de memoria con los vectores

de interrupcin.

Procesos de usuario en la parte alta.

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

Apuntes de Estructura de Datos

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

Apuntes de Estructura de Datos

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.

1.8.1 Memoria esttica


Primeramente se recordar la forma en que se asigna la memoria para los arreglos. Cuando se declara un arreglo, por ejemplo de tamao 1000, las 1000 localidades de memoria se reservan para uso exclusivo del arreglo y la misma estrategia de asignacin se usa para la mayora de las implementaciones de los strings. Se usa el trmino asignacin esttica para referirse a esta estrategia de asignacin de memoria, en la cual toda la memoria que una estructura de dato posiblemente necesitara es asignada toda a la vez, sin considerar la cantidad actual requerida al tiempo de ejecucin. Siempre hay un mximo absoluto de memoria que puede ser asignada: esta es simplemente la cantidad de memoria que est fsicamente disponible en la computadora y ninguna estrategia de asignacin puede rebasarla. La forma ms fcil de almacenar el contenido de una variable en memoria en tiempo de ejecucin es en memoria esttica o permanente a lo largo de toda la ejecucin del programa. Sin embargo no todos los objetos (variables) pueden ser almacenados estticamente. Para que un objeto pueda ser almacenado en memoria esttica su tamao (nmero de bytes necesarios para su almacenamiento) debe ser conocido en tiempo de compilacin, por esta razn no podrn almacenarse en memoria esttica: Los objetos correspondientes a procedimientos o funciones recursivas, ya que en tiempo de compilacin no se sabe el nmero de variables que sern necesarias. Las estructuras dinmicas de datos tales como listas, rboles, etc. ya que el nmero de elementos que las forman no es conocido hasta que el programa se ejecuta.

16

Apuntes de Estructura de Datos

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

Apuntes de Estructura de Datos

1.8.2 Manejo de memoria dinmica


La estrategia para la asignacin de memoria dinmica es la opuesta a la asignacin esttica, en este caso se involucra asignacin de memoria en base a lo que se requiera. La idea principal es considerar toda la memoria disponible como un todo global que puede ser usado para cualquier propsito. Cuando en un programa se necesita memoria para almacenar algn dato en particular, se puede solicitar slo la cantidad que se requiere y se proporciona de esa memoria global, la cual se marca como ocupada o no libre, de tal forma que una solicitud subsecuente de espacio de memoria ya no asigna ese mismo block para un propsito diferente. La asignacin de memoria se realiza por algn procedimiento disponible en algn lenguaje, como malloc(n) en C, que asigna un block de memoria de n bytes o un proceso similar como new tanto en C como en Java. Es responsabilidad del programador el regresar la memoria ocupada a la memoria global cuando se termine de trabajar con ella, y entonces sta se marca como libre nuevamente y estar disponible para otros usos. Ahora, el asignador de memoria tpicamente no garantiza en qu estado estn los bits de memoria. Cuando un block de memoria se asigna a solicitud del usuario, se dice que contiene basura, y es responsabilidad del usuario inicializarlo apropiadamente. Pero qu es entonces la memoria dinmica? Supongamos que nuestro programa debe manipular estructuras de datos de longitud desconocida. Como un ejemplo sencillo puede considerarse el de un programa que lee las lneas de un archivo y las ordena. Para esto se debe leer un nmero indeterminado de lneas, y tras leer la ltima, ordenarlas. Una manera de manejar ese nmero indeterminado, sera declarar una constante MAX_LINEAS, darle un valor vergonzosamente grande, y declarar un array de tamao MAX_LINEAS. Esto, obviamente, es muy ineficiente. Nuestro programa no slo queda limitado por ese valor mximo, sino que adems gastara esa enorme cantidad de memoria para procesar hasta el ms pequeo de los archivos.

18

Apuntes de Estructura de Datos

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

Apuntes de Estructura de Datos

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.

1.8.3 Diferencia entre asignacin de memoria esttica y dinmica


sta se puede ilustrar con el siguiente ejemplo de registro de nombres individuales. Suponer que se tiene un total de 3000 localizaciones de memoria disponible con los cuales almacenar los nombres y apellidos de cada uno de los alumnos en una clase. Si se usa un arreglo de strings para almacenar estos datos, el almacenamiento ser asignado estticamente, y consecuentemente se debe fijar la longitud mxima que un nombre pueda tener y el nmero mximo de gente en la clase. Es bastante difcil fijar estos lmites, especialmente cuando, como

20

Apuntes de Estructura de Datos

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.

1.9 Introduccin a las Estructuras de Datos


Algunas definiciones de Estructura de Datos: Forma abstracta de representar los datos y sus relaciones de tal manera que sea posible aplicar cierto tipo de operaciones relevantes a la solucin de problemas. Una coleccin de elementos de datos cuya asignacin se caracteriza por las operaciones de acceso usadas para almacenar y recuperar los elementos individuales. Es una clase de datos que se puede caracterizar por su organizacin y operaciones definidas sobre ellas. Algunas veces a estas estructuras se les llama tipos de datos. Una organizacin de informacin, usualmente en memoria, para mejorar la eficiencia de algoritmos tales como la cola, la pila, listas enlazadas, rboles, grafos, o cualquier entidad conceptual, tal como el nombre y direccin de una persona. Puede incluir informacin redundante tal como la longitud de la lista o el nmero de nodos en un subrbol.

1.9.1 Estructuras lgicas de datos

21

Apuntes de Estructura de Datos

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.

1.9.2 Las estructuras de datos y los lenguajes de programacin


Los lenguajes de programacin ofrecen al programador un conjunto predefinido de estructuras de datos. En algunos de ellos, le permiten definir sus propias estructuras de datos, por ejemplo, Pascal con su enunciado type, el lenguaje C con el enunciado struct o el C++ an ms potente con su definicin de objetos a travs de struct, union o class y Java tambin con class.

1.9.3 Programacin orientada a objetos


La implantacin de estos TDA, se realizar utilizando el paradigma de la POO, pues existe una correspondencia casi directa entre la definicin de un TDA y una clase.

1.9.4 Qu es la programacin orientada a objetos (POO)?


La POO se puede definir como una tcnica o estilo de programacin que utiliza objetos como bloque esencial de construccin. Los objetos son en realidad como TDAs, aunque realmente el poder de ellos reside en sus caractersticas de encapsulamiento de datos, herencia y polimorfismo.

1.9.5 Estructuras de datos elementales

22

Apuntes de Estructura de Datos

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

Apuntes de Estructura de Datos

No Lineales: rboles, grafos

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

Apuntes de Estructura de Datos

25

Vous aimerez peut-être aussi