Analisis de Sistemas Computarizados (Libro)

of 117 /117
UNIDAD 1: ESTRUCTURAS DE DATOS

Embed Size (px)

description

Analisis de Sistemas Computarizados (Libro)

Transcript of Analisis de Sistemas Computarizados (Libro)

E

UNIDAD 1: ESTRUCTURAS DE DATOS

1.1. Definicin

En la prctica, la mayor parte de informacin til no aparece aislada en forma de datos simples, sino que lo hace de forma organizada y estructurada. Los diccionarios, guas, enciclopedias, etc., son colecciones de datos que seran intiles si no estuvieran organizadas de acuerdo con unas determinadas reglas. Adems, tener estructurada la informacin supone ventajas adicionales, al facilitar el acceso y el manejo de los datos. Por ello parece razonable desarrollar la idea de la agrupacin de datos, que tengan un cierto tipo de estructura y organizacin interna.La seleccin de una estructura de datos frente a otra, a la hora de programar es una decisin importante, ya que ello influye decisivamente en el algoritmo que vaya a usarse para resolver un determinado problema. De hecho, se trata de dar una idea, acerca de los pros y contras de cada una de ellas con el propsito final de justificar la citada ecuacin de:

PROGRAMACIN = ESTRUCTURAS DE DATOS + ALGORITMOS

Una estructura de datos es, a grandes rasgos, una coleccin de datos (normalmente de tipo simple) que se caracterizan por su organizacin y las operaciones que se definen en ellos. Por tanto, una estructura de datos vendr caracterizada tanto por unas ciertas relaciones entre los datos que la constituyen (por ejemplo el orden de las componentes de un vector de nmeros reales), como por las operaciones posibles en ella. Esto supone que podamos expresar formalmente, mediante un conjunto de reglas, las relaciones y operaciones posibles (tales como insertar nuevos elementos o como eliminar los ya existentes).En programacin, el trmino estructura de datos se utiliza para referirse a una forma de organizar un conjunto de datos que se relacionan entre s, sean estos simples o estructurados, con el objetivo de facilitar su manipulacin y de operarlo como un todo.En otras palabras es una forma particular de organizar datos en una computadora para que pueda ser utilizado de manera eficiente.En un lenguaje de programacin, un tipo de dato est definido por el conjunto de valores que representa y por el conjunto de operaciones que se pueden realizar con dicho tipo de dato. Por ejemplo, el tipo de dato entero puede representar nmeros en el rango de -2^31 a 2^31-1 y cuenta con operaciones como suma, resta, multiplicacin, divisin, etc. Por otro lado, podemos decir que en la solucin de un problema a ser procesado por una computadora podemos encontrar dos grandes tipos de datos: datos simples y datos estructurados. Los datos simples son aquellos que no estn compuestos de otras estructuras, que no sean los bits, al ser representados por la computadora en forma directa, ocupan solo una casilla de memoria, sin embargo existen unas operaciones propias de cada tipo que en cierta manera los caracterizan. Debido a esto, una variable de un tipo de dato simple hace referencia a un nico valor a la vez. Ejemplo de estos tipos de datos son los enteros, reales, caracteres y booleanos.As mismo, los datos estructurados se caracterizan porque su definicin est compuesta de otros tipos de datos simples, as como de otros datos estructurados. En este caso, un nombre (identificador de la variable estructurada) hace referencia no solo a una casilla de memoria, sino a un grupo de casillas. Por ejemplo: una cadena est formada por una sucesin de caracteres; una matriz por datos simples organizados en forma de filas y columnas; y un archivo est constituido por registros, stos por campos, que se componen, a su vez, de datos de tipo simple. Por un abuso de lenguaje, se tiende a hacer sinnimos, el dato estructurado con su estructura correspondiente, aunque ello evidentemente no es as.Para muchos propsitos es conveniente tratar una estructura de datos como si fuera un objeto individual y afortunadamente, muchos lenguajes de programacin permiten manipular estructuras completas como si se trataran de datos individuales, de forma que los datos estructurados y simples se consideran a menudo por el programador de la misma manera. As a partir de ahora un dato puede ser tanto un entero como una matriz, por nombrar dos ejemplos.Las estructuras de datos son necesarias tanto en la memoria principal como en la secundaria, de forma que primero nos centraremos en las correspondientes a la memoria principal, y posteriormente nos centraremos en las estructuras ms adecuadas para el almacenamiento masivo de datos.

1.2. Clasificacin

Una clasificacin de estructuras de datos es segn dnde residan: Internas y externas. Si una estructura de datos reside en la memoria central del computador se denomina estructura de datos interna. Recprocamente, si reside en un soporte externo, se denomina estructura de datos externa.Las estructuras de datos internas pueden ser de dos tipos: Estructuras de Datos Estticas. Estructuras de Datos Dinmicas.

Estructuras de Datos EstticasTienen un nmero fijo de elementos que queda determinado desde la declaracin de la estructura en el comienzo del programa. Ejemplo los arreglos. Las estructuras de datos estticas, presentan dos inconvenientes:La reorganizacin de sus elementos, si sta implica mucho movimiento puede ser muy costosa. Ejemplo: insertar un dato en un arreglo ordenado. Son estructuras de datos estticas, es decir, el tamao ocupado en memoria es fijo, el arreglo podra llenarse y si se crea un arreglo de tamao grande se estara desperdiciando memoria.

Estructuras de Datos DinmicasLas estructuras de datos dinmicas nos permiten lograr un importante objetivo de la programacin orientada a objetos: la reutilizacin de objetos. Al contrario de un arreglo, que contiene espacio para almacenar un nmero fijo de elementos, una estructura dinmica de datos se ampla y contrae durante la ejecucin del programa.A su vez, este tipo de estructuras se pueden dividir en dos grandes grupos segn la forma en la cual se ordenan sus elementos. Lineales. No lineales.

Estructuras de Datos LinealesEn este tipo de estructuras los elementos se encuentran ubicados secuencialmente. Al ser dinmica, su composicin vara a lo largo de la ejecucin del programa que lo utiliza a travs de operaciones de insercin y eliminacin. Dependiendo del tipo de acceso a la secuencia, haremos la siguiente distincin: Pilas: slo tienen un nico punto de acceso fijo a travs del cual se aaden, se eliminan o se consultan elementos. Colas: tienen dos puntos de acceso, uno para aadir y el otro para consultar o eliminar elementos. Listas: podemos acceder (insertar y eliminar) por cualquier lado.

Estructuras de Datos No LinealesDentro de las estructuras de datos no lineales tenemos los rboles y grafos. Este tipo de estructuras los datos no se encuentran ubicados secuencialmente. Permiten resolver problemas computacionales complejos.

1.3. Estructuras lineales

Las estructuras lineales de datos se caracterizan porque sus elementos estn en secuencia, relacionados en forma lineal, uno luego del otro. Cada elemento de la estructura puede estar conformado por uno o varios sub-elementos o campos que pueden pertenecer a cualquier tipo de dato, pero que normalmente son tipos bsicos.Una estructura lineal de datos est conformada por ninguno, uno o varios elementos que tienen una relacin dnde existe un primer elemento, seguido de un segundo elemento y as sucesivamente hasta llegar al ltimo.

PILAS.Una pila se caracteriza por el hecho que el ltimo elemento en entrar es el primero en salir. En ingls una pila se suele denominar con las siglas LIFO (last in first out). La definicin de pila nos indica que todas las operaciones trabajan sobre el mismo extremo de la secuencia. En otras palabras, los elementos se sacan de la estructura en el orden inverso al orden en que se han insertado, ya que el nico elemento de la secuencia que se puede obtener es el ltimo (figura 1).

Ejemplos de pilasEn nuestra vida diaria podemos ver este comportamiento muy a menudo. Por ejemplo, si apilamos los platos de una vajilla, nicamente podremos coger el ltimo plato aadido a la pila, porque cualquier intento de coger un plato del medio de la pila (como el plato oscuro de la figura 2) acabar en un destrozo. Otro ejemplo lo tenemos en los juegos de cartas, en los que generalmente robamos las cartas (de una en una) de la parte superior del mazo (figura 2).

En el mundo informtico tambin encontramos pilas, como por ejemplo, en los navegadores web. Cada vez que accedemos a una nueva pgina, el navegador la aade a una pila de pginas visitadas, de manera que cuando seleccionamos la opcin Anterior, el navegador coge la pgina que se encuentra en la cima de la pila, porque es justamente la ltima pgina visitada. Otro ejemplo lo tenemos en los procesadores de textos, en los que los cambios introducidos en el texto tambin se almacenan en una pila. Cada vez que apretamos la combinacin de teclas Ctrl+Z deshacemos el ltimo cambio introducido, mientras que cada vez que apretamos la combinacin Ctrl+Y volvemos a aadir a la pila el ltimo cambio deshecho.OperacionesEn la tabla 1 se encuentran las operaciones bsicas para trabajar con pilas.

Las operaciones del TAD pila se clasifican en: Operaciones constructoras: crear, apilar y desapilar. Operaciones consultoras: cima y vaca.Las operaciones constructoras son las operaciones que modifican el estado de la pila, mientras que las operaciones consultoras son las que consultan el estado de la pila sin modificarla.El estado de una pila est definido por los elementos que contiene la pila y por el orden en que estn almacenados. Todo estado es el resultado de una secuencia de llamadas a operaciones constructoras.Igualmente, las operaciones constructoras se clasifican en: Operaciones generadoras: crear y apilar, porque son imprescindibles para conseguir cualquier estado de la pila. Operaciones modificadoras: desapilar, porque modifica el estado de la pila extrayendo el elemento de la cima, pero no es una operacin imprescindible para construir una pila.Dado un estado de la pila, se puede llegar a l a travs de diversas secuencias de llamadas a operaciones constructoras, pero de entre todas las secuencias slo habr una que est formada exclusivamente por operaciones generadoras (figura 3).

Observar que la tercera secuencia de llamadas de la figura 3 es la mnima para llegar al estado deseado, ya que no podemos eliminar ninguna de las llamadas que la forman. Por lo tanto, tal como se ha mencionado anteriormente, apilar y crear son las operaciones generadoras.

COLAS.Una cola est caracterizada por el hecho que el primer elemento en entrar es el primero en salir. Las colas se diferencian de las pilas en la extraccin de los datos. En ingls, una cola suele denominarse con las siglas FIFO (first in first out).La definicin de cola nos indica que las operaciones trabajan sobre ambos extremos de la secuencia: un extremo para aadir los elementos y el otro para consultarlos o extraerlos. En otras palabras, los elementos se extraen en el mismo orden en que se han insertado previamente, ya que se insertan por el final de la secuencia y se extraen por la cabecera (figura 6).

Ejemplos de colasLas colas aparecen a menudo en nuestra vida diaria... Sin ir ms lejos, podemos afirmar que pasamos una parte de nuestra vida haciendo colas: para comprar la entrada en un cine, para pagar en la caja de un supermercado, para visitarnos por el mdico, etc. La idea siempre es la misma: se atiende la primera persona de la cola, que es la que hace ms rato que espera, y una vez atendida sale de la cola y la persona siguiente pasa a ser la primera de la cola (figura 7).

Si en el mundo real es habitual ver colas, en el mundo informtico todava lo es ms. Cuando el sistema operativo ha de gestionar el acceso a un recurso compartido (procesos que quieren ejecutarse en la CPU, trabajos que se envan a una impresora, descarga de ficheros, etc.), una de las estrategias ms utilizadas es organizar las peticiones por medio de colas. Por ejemplo, la figura 8 nos muestra una captura de una cola de impresin en un instante dado. En este caso, la tarea 321 se est imprimiendo porque es la primera en la cola, mientras que la tarea 326 ser la ltima en imprimirse porque ha sido la ltima en llegar.

OperacionesDada la representacin de una cola, en la tabla 2 definimos las operaciones para trabajar con ella.

Las operaciones de una cola se clasifican segn su comportamiento en generadoras, modificadoras y consultoras: Operaciones constructoras: Operaciones generadoras: crear y encolar. Operaciones modificadoras: desencolar. Operaciones consultoras: cabeza y vaca.El comportamiento de las operaciones desencolar y cabeza se resume en tres casos:1) sobre una cola vaca (crear),2) sobre una cola con un nico elemento (encolar(crear,e)) y3) sobre una cola con ms de un elemento (encolar(c,e), donde c no es una cola vaca).

LISTAS.Una lista est caracterizada por el hecho de que permite aadir, borrar o consultar cualquier elemento de la secuencia. Es la estructura lineal ms flexible, hasta el punto de considerar que las pilas y colas son casos particulares de las listas. Mientras que en las estructuras lineales anteriores hemos visto cmo las operaciones trabajaban solo con los extremos de la secuencia, las listas nos ofrecern la posibilidad de acceder a cualquier punto de esta.Ejemplos de listasTambin en este caso encontramos listas en nuestra vida cotidiana. Por ejemplo, la lista de la compra. Cuando estamos en el supermercado generalmente eliminamos los artculos a medida que los encontramos en el recorrido que seguimos con el carro, que no tiene porqu coincidir con el orden en que los hemos escrito en nuestra lista (figura 14).Desde el punto de vista informtico tambin encontramos ejemplos, como los editores de textos. Cuando escribimos un cdigo, en el fondo editamos una lista de palabras dentro de una lista de lneas. Hablamos de listas, porque en cualquier momento nos podemos desplazar sobre cualquier palabra del fichero para modificarla o para insertar nuevas palabras. Hay diferentes modelos de listas, uno de los ms habituales es el llamado lista con punto de inters. Esta lista contiene un elemento distinguido que sirve de referencia para aplicar las operaciones. El elemento distinguido es apuntado por el llamado punto de inters, que puede desplazarse. El punto de inters divide una secuencia en dos fragmentos, que a su vez tambin son secuencias. Por lo tanto, dada una lista l cualquiera, se puede dividir en una secuencia situada a la izquierda del punto de inters (s) y otra secuencia que va del punto de inters (elemento distinguido, e) hacia la derecha (et). Podemos representar esta unin de dos secuencias para formar la lista l de la manera siguiente: l =< s,et >. La secuencia vaca (es decir, sin ningn elemento) se representar con la letra l (lambda).OperacionesEn la tabla 3 se encuentran las operaciones para trabajar con las listas.

Podemos ver que adems de las operaciones tpicas para trabajar con secuencias, esta vez se han aadido operaciones para cambiar el elemento distinguido y as poder desplazar el punto de inters: principio y avanzar. En este caso, el conjunto de operaciones constructoras generadoras est formado por crear, insertar y principio. Por tanto, la mnima secuencia de llamadas que necesitaremos para obtener la lista es una combinacin de estas operaciones:{insertar(insertar(principio(insertar(insertar(crear, l), a)), h), o)}

La implementacin de las listas con punto de inters se puede hacer de varias maneras: Implementacin secuencial. Los elementos de la lista se almacenan en un vector respetando la norma que los elementos consecutivos ocupan posiciones consecutivas. La representacin requiere tres elementos: un vector (A), un indicador del nmero de elementos almacenados (nelem) y un indicador del punto de inters o elemento distinguido (act).

El indicador nelem nos sirve para controlar que no sobrepasemos el nmero mximo de elementos (MAX) que puede almacenar el vector, mientras que el indicador act apunta al elemento distinguido de la lista.

Implementacin encadenada. Los elementos se almacenan sin seguir la norma anterior, ya que cada elemento del vector guarda la posicin en que se halla el siguiente elemento de la lista. Para romper el concepto de secuencial, en que el sucesor de un elemento es el que ocupa la siguiente posicin del vector, introducimos a continuacin el concepto de encadenamiento, en que cada elemento guarda la posicin en que se halla su sucesor.

Como se puede observar en la representacin, se almacena para cada posicin del vector: el elemento (e) y un indicador de la posicin en que se halla el siguiente elemento (suc). Este indicador se denominar, a partir de este momento, encadenamiento.EJERCICIOS DE APRENDIZAJE NO. 1

I. Completa la siguiente tabla en base a las operaciones que se pueden realizar para cada una de las estructuras lineales.

NombrePilasColasListas

OperacionesCrear

II. Describe cada una de las operaciones que se pueden realizar en las listas.

OperacinDescripcin

Crear

Insertar

Borrar

Actual

Vaca

Principio

Avanzar

Fin

III. Coloca en la lnea que se encuentra debajo de cada dibujo a que estructura de datos lineal corresponden cada una de las representaciones.

1.4. Estructuras no lineales

A las estructuras de datos no lineales se les llama tambin estructuras de datos multienlazadas en donde cada elemento puede estar enlazado a cualquier otro componente. Se trata de estructuras de datos en las que cada elemento puede tener varios sucesores y/o varios predecesores.Tambin se pueden definir como aquellas estructuras que ocupan bloques de memoria no continuos/lineales. Para lidiar con el problema de la fragmentacin y, sobre todo del crecimiento dinmico. Los bloques deben estar enlazados unos con otros para poder navegar por la estructura, es decir, tener acceso a otro(s) dato(s) a partir del actual.

ARBOLES.

Un rbol es una estructura de datos no lineal que organiza sus elementos siguiendo una jerarqua de niveles entre sus elementos (nodos). Cada elemento tiene un nico antecesor y puede tener varios sucesores. Existe un nico camino entre el primer nodo de la estructura y cualquier otro nodo. Se utilizan para representar todo tipo de jerarquas.

Ejemplos de rboles:

rbol genealgico Taxonomas Diagramas de organizacin rbol de directorios en una unidad de disco Aplicaciones algortmicas (ordenacin, bsqueda) Compilacin (rboles sintcticos, rboles de expresiones)

Terminologa

Nodo: los vrtices o elementos de un rbol. Enlace/arco/arista: Conexin entre dos nodos consecutivos. Los nodos pueden ser: Nodo raz: nodo superior de la jerarqua. Nodo terminal u hoja: nodo que no contienen ningn subrbol. Nodos interiores: nodos con uno o ms subrboles; nodos que no son hojas. Descendientes o hijos: cada uno de los subrboles de un nodo. Ascendiente, antecesor o padre: nodo de jerarqua superior a uno dado. Nodos hermanos: nodos del mismo padre. Bosque: coleccin de rboles. Camino: enlace entre dos nodos. No existe un camino entre todos los nodos. Rama: camino que termina en una hoja. Grado de un nodo: nmero de subrboles que tiene. Nivel de un nodo o longitud del camino: nmero de arcos o enlaces que hay desde el nodo raz hasta un nodo dado. Altura o profundidad de un rbol: nmero mximo de nodos de una rama; el nivel ms alto de un rbol ms uno. Peso de un rbol: nmero de nodos terminales. Ejemplo de un bosque.

Tipos de rboles.

Un rbol general sera un rbol en el que cada nodo puede tener un nmero ilimitado de subrboles. Un rbol binario sera un conjunto de 0 o ms nodos en el cual existe un nodo raz y cada uno de los nodos, incluido la raz podrn tener 0, 1 o dos subrboles: Subrbol izquierdo y subrbol derecho. Cada nodo es como mximo de grado 2.

Tipos de rboles binarios.

rboles similares: rboles con la misma estructura. rboles equivalentes: rboles con la misma estructura y contienen la misma informacin. rboles completos o rboles perfectos: todos los nodos, excepto las hojas, tienen grado 2. Un rbol binario de nivel n tiene 2n-1 nodos. rbol equilibrado: un rbol en el que las alturas de los dos subrboles de cada uno de los nodos tiene como mximo una diferencia de una unidad. rbol degenerado: todos sus nodos slo tienen un subrbol.

Recorrido de un rbol (Definiciones)Se denominarecorrido de un rbolal proceso que permite acceder de una sola vez a cada uno de los nodos del rbol. Cuando un rbol se recorre, el conjunto completo de nodos se examina.En ciencias de la computacin, el recorrido de rboles refiere al proceso de visitar de una manera sistemtica, exactamente una vez, cada nodo en una estructura de datos de rbol (examinando y/o actualizando los datos en los nodos). Tales recorridos estn clasificados por el orden en el cual son visitados los nodos. Los siguientes algoritmos son descritos para un rbol binario, pero tambin pueden ser generalizados a otros rboles.Recorrido en profundidadLos algoritmos de recorrido de un rbol binario presentan tres tipos de actividades comunes: Visitar el nodo raz. Recorrer el subrbol izquierdo. Recorrer el subrbol derecho.

Estas tres acciones repartidas en diferentes rdenes proporcionan los diferentes recorridos del rbol. Los ms frecuentes tienen siempre en comn recorrer primero el subrbol izquierdo y luego el subrbol derecho. Los algoritmos anteriores se llamanpre-orden,post-orden,in-orden, y su nombre refleja el momento en que se visita el nodo raz. Preorden: (raz, izquierdo, derecho). Para recorrer un rbol binario no vaco en preorden, hay que realizar las siguientes operaciones recursivamente en cada nodo, comenzando con el nodo de raz:1. Visite la raz2. Atraviese el sub-rbol izquierdo3. Atraviese el sub-rbol derecho

Inorden: (izquierdo,raz, derecho). Para recorrer un rbol binario no vaco en inorden (simtrico), hay que realizar las siguientes operaciones recursivamente en cada nodo:1. Atraviese el sub-rbol izquierdo2. Visite la raz3. Atraviese el sub-rbol derecho

Postorden: (izquierdo, derecho,raz). Para recorrer un rbol binario no vaco en postorden, hay que realizar las siguientes operaciones recursivamente en cada nodo:1. Atraviese el sub-rbol izquierdo2. Atraviese el sub-rbol derecho3. Visite la raz

En general, la diferencia entre preorden, inorden y postorden es cundo se recorre la raz. En los tres, se recorre primero el sub-rbol izquierdo y luego el derecho. En preorden, la raz se recorre antes que los recorridos de los subrboles izquierdo y derecho. En inorden, la raz se recorre entre los recorridos de los rboles izquierdo y derecho. En postorden, la raz se recorre despus de los recorridos por el subrbol izquierdo y el derecho.

Preorden (antes), inorden (en medio), postorden (despus).Recorrido en anchuraLos rboles tambin pueden ser recorridos en orden por nivel (de nivel en nivel), donde visitamos cada nodo en un nivel antes de ir a un nivel inferior. Esto tambin es llamado recorrido en anchura-primero o recorrido en anchura.EjemploSe tiene el siguiente rbol binario ordenado, realizar los recorridos y obtener sus resultados.

Recorrido de ProfundidadSecuencia de recorrido de preorden: F, B, A, D, C, E, G, I, H (raz, izquierda, derecha)Secuencia de recorrido de inorden: A, B, C, D, E, F, G, H, I (izquierda, raz, derecha); note cmo esto produce una secuencia ordenadaSecuencia de recorrido de postorden: A, C, E, D, B, H, I, G, F (izquierda, derecha, raz)

Recorrido de AnchuraSecuencia de recorrido de orden por nivel: F, B, G, A, D, I, C, E, H

EJERCICIOS DE APRENDIZAJE NO. 2

I. Realiza los recorridos y obtn los elementos que se te solicitan de los siguientes rboles binarios.Pre-orden (raz, izquierda, derecha)

In-orden (izquierda, raz, derecha)

Post-orden (izquierda, derecha, raz)

Anchura (amplitud o por niveles)

Nodo raz:

Hojas:

Hijos del nodo raz:

Ejemplo de una rama:

Grado del nodo raz:

Profundidad del rbol:

Peso del rbol:

Nivel del rbol:

Pre-orden (raz, izquierda, derecha)

In-orden (izquierda, raz, derecha)

Post-orden (izquierda, derecha, raz)

Anchura (amplitud o por niveles)

Nodo raz:

Hojas:

Hijos del nodo raz:

Ejemplo de una rama:

Grado del nodo raz:

Profundidad del rbol:

Peso del rbol:

Nivel del rbol:

Pre-orden (raz, izquierda, derecha)

In-orden (izquierda, raz, derecha)

Post-orden (izquierda, derecha, raz)

Anchura (amplitud o por niveles)

Nodo raz:

Hojas:

Hijos del nodo raz:

Ejemplo de una rama:

Grado del nodo raz:

Profundidad del rbol:

Peso del rbol:

Nivel del rbol:

Pre-orden (raz, izquierda, derecha)

In-orden (izquierda, raz, derecha)

Post-orden (izquierda, derecha, raz)

Anchura (amplitud o por niveles)

Nodo raz:

Hojas:

Hijos del nodo raz:

Ejemplo de una rama:

Grado del nodo raz:

Profundidad del rbol:

Peso del rbol:

Nivel del rbol:

Pre-orden (raz, izquierda, derecha)

In-orden (izquierda, raz, derecha)

Post-orden (izquierda, derecha, raz)

Anchura (amplitud o por niveles)

Nodo raz:

Hojas:

Hijos del nodo raz:

Ejemplo de una rama:

Grado del nodo raz:

Profundidad del rbol:

Peso del rbol:

Nivel del rbol:

GRAFOS.Un grafo (del griego grafos: dibujo, imagen) es un conjunto de objetos llamados vrtices o nodos unidos por enlaces llamados aristas o arcos, que permiten representar relaciones binarias entre elementos de un conjunto.Tpicamente, un grafo se representa grficamente como un conjunto de puntos (vrtices o nodos) unidos por lneas (aristas). Desde un punto de vista prctico, los grafos permiten estudiar las interrelaciones entre unidades que interactan unas con otras. Por ejemplo, una red de computadoras puede representarse y estudiarse mediante un grafo, en el cual los vrtices representan terminales y las aristas representan conexiones (las cuales, a su vez, pueden ser cables o conexiones inalmbricas).Prcticamente cualquier problema puede representarse mediante un grafo, y su estudio trasciende a las diversas reas de las ciencias exactas y las ciencias sociales.Un grafo G es un par ordenado G=(V,E), donde: V es un conjunto de vrtices o nodos, y E es un conjunto de aristas o arcos, que relacionan estos nodos.

Normalmente V suele ser finito. Muchos resultados importantes sobre grafos no son aplicables para grafos infinitos. Se llama orden del grafo G a su nmero de vrtices, |V|. El grado de un vrtice o nodo es igual al nmero de arcos que lo tienen como extremo. Un bucle es una arista que relaciona al mismo nodo; es decir, una arista donde el nodo inicial y el nodo final coinciden. Dos o ms aristas son paralelas si relacionan el mismo par de vrtices.

Grafo no dirigidoUn grafo no dirigido o grafo propiamente dicho es un grafo G = (V, E) donde:es un conjunto de pares no ordenados de elementos de V. Un par no ordenado es un conjunto de la forma , de manera que . Para los grafos, estos conjuntos pertenecen al conjunto potencia de V, denotado P(V), y son de cardinalidad.

Grafo dirigidoUn grafo dirigido o digrafo es un grafo G = (V, E) donde: , es un conjunto de pares ordenados de elementos de V.Dada una arista (a,b), a es su nodo inicial y b su nodo final.Por definicin, los grafos dirigidos no contienen bucles.

Grafo mixtoUn grafo mixto es aquel que se define con la capacidad de poder contener aristas dirigidas y no dirigidas. Tanto los grafos dirigidos como los no dirigidos son casos particulares de este.

Propiedades

Adyacencia: dos aristas son adyacentes si tienen un vrtice en comn, y dos vrtices son adyacentes si una arista los une. Incidencia: una arista es incidente a un vrtice si sta lo une a otro. Ponderacin: corresponde a una funcin que a cada arista le asocia un valor (costo, peso, longitud, etc.), para aumentar la expresividad del modelo. Esto se usa mucho para problemas de optimizacin, como el del vendedor viajero o del camino ms corto. Etiquetado: distincin que se hace a los vrtices y/o aristas mediante una marca que los hace unvocamente distinguibles del resto.

Ejemplos

La imagen es una representacin del siguiente grafo: V:={1,2,3,4,5,6} E:={{1,2},{1,5},{2,3},{2,5},{3,4},{4,5},{4,6}}

En ciencias de la computacin los grafos dirigidos son usados para representar mquinas de estado finito y algunas otras estructuras discretas.

Grafos particulares

Existen grafos que poseen propiedades destacables. Algunos ejemplos bsicos son: Grafo nulo: aquel que no tiene vrtices ni aristas. Ntese que algunas personas exigen que el conjunto de vrtices no sea vaco en la definicin de grafo. Grafo vaco: aquel que no tiene aristas. Grafo trivial: aquel que tiene un vrtice y ninguna arista. Grafo simple: aquel que no posee bucles ni aristas paralelas. Consultar variantes en esta definicin. Multigrafo (o pseudografo): G es multigrafo si y solo si no es simple. Consultar variantes en esta definicin. Grafo completo: grafo simple en el que cada par de vrtices estn unidos por una arista, es decir, contiene todas las posibles aristas. Grafo bipartito: sea (W, X) una particin del conjunto de vrtices V, es aquel donde cada arista tiene un vrtice en W y otro en X. Grafo bipartito completo: sea (W, X) una particin del conjunto de vrtices V, es aquel donde cada vrtice en W es adyacente slo a cada vrtice en X, y viceversa. Grafo plano: aquel que puede ser dibujado en el plano cartesiano sin cruce de aristas. Grafo rueda: grafo con n vrtices que se forma conectando un nico vrtice a todos los vrtices de un ciclo-(n-1). Grafo perfecto: aquel que el nmero cromtico de cada subgrafo inducido es igual al tamao del mayor clique de ese subgrafo.

Una generalizacin de los grafos son los llamados hipergrafos. Los hipergrafos es una generalizacin de un grafo, cuyas aristas aqu se llaman hiperaristas, y pueden relacionar a cualquier cantidad de vrtices, en lugar de slo un mximo de dos como en el caso particular.

1.5. Estructuras estticas

Son aquellas en las que el tamao ocupado en memoria se define antes de que el programa se ejecute y no puede modificarse dicho tamao durante la ejecucin del programa.

Estas estructuras estn implementadas en casi todos los lenguajes. Su principal caracterstica es que ocupan solo una casilla de memoria, por lo tanto una variable simple hace referencia a un nico valor a la vez, dentro de este grupo de datos se encuentra:a) Enterosb) Realesc) Caracteresd) Bolanose) Enumeradosf) Subrangos

Nota: Los ltimos no existen en algunos lenguajes de programacin.

Clasificacin de las estructuras de datos estticas:

1.- Simples o primitivas a) Boolean b) Char c) Integer d) Real 2.- Compuestas a) Arreglos b) Conjuntos c) Strings d) Registros e) Archivos

1.6. Estructuras dinmicas

No tienen las limitaciones o restricciones en el tamao de memoria ocupada que son propias de las estructuras estticas.Mediante el uso de un tipo de datos especifico, denominado puntero, es posible construir estructuras de datos dinmicas que no son soportadas por la mayora de los lenguajes, pero que en aquellos que si tienen estas caractersticas ofrecen soluciones eficaces y efectivas en la solucin de problemas complejos.Se caracteriza por el hecho de que con un nombre se hace referencia a un grupo de casillas de memoria. Es decir un dato estructurado tiene varios componentes.

Clasificacin de las estructuras de datos dinmicas:

1.- Lineales a) Pila b) Cola c) Lista 2.- No lineales a) rboles b) Grafos

UNIDAD 2: ESTRUCTURAS LINEALES DE DATOS

2. 2.1. Introduccin a los tipos de datos abstractos

Un tipo de datos abstractos (TDA) es un tipo de dato definido por el programador que se puede manipular de un modo similar a los tipos de datos definidos por el sistema. Est formado por un conjunto vlido de elementos y un nmero de operaciones primitivas que se pueden realizar sobre ellos.

Ejemplo:- Definicin del tipoNumero racional: Conjunto de pares de elementos (a,b) de tipo entero, con b0.

- Operaciones:CrearRacional: a, b = (a,b)Suma: (a,b) + (c,d) = (a*d+b*c , b*d)Resta: (a,b) - (c,d) = (a*d-b*c , b*d)Producto: (a,b) * (c,d) = (a*c , b*d)Divisin: (a,b) / (c,d) = (a*d , b*c)Numerador: (a,b) = aDenominador: (a,b) = bValorReal: (a,b) = a/bMCD: (a,b) ...Potencia: (a,b)^c = (a^c , b^c)Simplifica: (a,b) = ( a/mcd(a,b) , b/mcd(a,b) )

Una vez definido se podrn declarar variables de ese tipo y operar con ellas utilizando las operaciones que aporta el tipo.Ejemplo: TRacional r1,r2, rsuma;CrearRacional(4,7, &r1);CrearRacional(5,8,&r2);Suma(r1, r2, &rsuma);printf(El valor real es %f, ValorReal(rsuma) );

Un TDA es el elemento bsico de la abstraccin de datos. Su desarrollo es independiente del lenguaje de programacin utilizado, aunque este puede aportar mecanismos que faciliten su realizacin. Debe verse como una caja negra.

En un TDA existen dos elementos diferenciados: La Interfaz de utilizacin La representacin

A la hora de utilizar el TDA, la representacin debe permanecer oculta. Solo podremos utilizar las operaciones del tipo para trabajar con sus elementos.InterfazPara construir un tipo abstracto debemos (Definicin):1. Exponer una definicin del tipo.2. Definir las operaciones (funciones y procedimientos) que permitan operar con instancias de ese tipo.3. Ocultar la representacin de los elementos del tipo de modo que slo se pueda actuar sobre ellos con las operaciones proporcionadas.4. Poder hacer instancias mltiples del tipo.Tipos bsicos de operaciones en un TDA (Operaciones): Constructores: Crean una nueva instancia del tipo. Transformacin: Cambian el valor de uno o ms elementos de una instancia del tipo. Observacin: Nos permiten observar el valor de uno o varios elementos de una instancia sin modificarlos. Iteradores: Nos permiten procesar todos los componentes en un TDA de forma secuencial.Implementacin Una vez definido el TAD se escoge una representacin interna utilizando los tipos que proporciona el lenguaje y/o otros TAD ya definidos previamente. La representacin deber ocultarse utilizando los mecanismos que nos proporcione el lenguaje. Ocultamiento de Informacin. Normalmente la implementacin del tipo se realiza en un mdulo aparte que ser enlazado al programa principal. Se necesitar un fichero cabecera que contenga la definicin de las operaciones y la declaracin del tipo (representacin). Con esta informacin se podrn definir elementos del tipo y acceder a sus operaciones.Ejemplo: Fichero cabecerastruct _TRacional { int a,b};typedef struct _TRacional TRacional;void CreaRacional (int a, int b, TRacional *r );void SumaRacional(TRacional r1, TRacional r2, TRacional *rsum);

2.2. Estructuras de datos dinmicas

Las estructuras dinmicas de datos son estructuras que crecen a medida que ejecuta un programa. Una estructura dinmica de datos es una coleccin de elementos llamadas nodos - que son normalmente registros. Al contrario de un arreglo que contiene espacio para almacenar un nmero fijo de elementos, una estructura dinmica de datos se ampla y contrae durante la ejecucin del programa, basada en los registros de almacenamiento de datos del programa.

Las estructuras dinmicas de datos son de gran utilidad para almacenar datos del mundo real, que estn cambiando constantemente.

Un ejemplo tpico, es la lista de pasajeros de una lnea area. Si esta lista se mantuviera en orden alfabtico en un arreglo, sera necesario hacer espacio para insertar un nuevo pasajero por orden alfabtico. Esto requiere utilizar un ciclo para copiar los datos del registro de cada pasajero al siguiente elemento del arreglo. Si en su lugar se utilizar una estructura dinmica de datos, los nuevos datos del pasajero se pueden insertar simplemente entre dos registros existentes con un mnimo de esfuerzo.

Otro ejemplo es si tenemos almacenados en un array (tambin llamados vectores o arreglos) los datos de los alumnos de un curso, los cuales estn ordenados de acuerdo al promedio, para insertar un nuevo alumno sera necesario correr cada elemento un espacio: Si en su lugar se utilizara una estructura dinmica de datos, los nuevos datos del alumno se pueden insertar fcilmente.

2.3. Estructuras de datos lineales

Las estructuras de datos lineales se caracterizan porque sus elementos estn en secuencia, relacionados en forma lineal, uno luego del otro. Cada elemento de la estructura puede estar conformado por uno o varios subelementos o campos que pueden pertenecer a cualquier tipo de dato, pero que normalmente son tipos bsicos.

Una estructura lineal de datos est conformada por ninguno, uno o varios elementos que tienen una relacin dnde existe un primer elemento, seguido de un segundo elemento y as sucesivamente hasta llegar al ltimo.

Las estructuras lineales son importantes porque aparecen con mucha frecuencia en situaciones de la vida, tambin se utilizan muy frecuente en los esquemas algortmicos. Ejemplos: Una cola de clientes de un banco, las instrucciones de un programa, los caracteres de una cadena o las pginas de un libro.

Caractersticas:

Existe un nico elemento, llamado primero, Existe un nico elemento, llamado ltimo, Cada elemento, excepto el primero, tiene un nico predecesor y Cada elemento, excepto el ltimo, tiene un nico sucesor

Existen tres estructuras lineales especialmente importantes:

1. Las pilas2. Las colas3. Las listas

Las operaciones bsicas para dichas estructuras son:

Crear la secuencia vaca Aadir un elemento a la secuencia Borrar un elemento a la secuencia Consultar un elemento de la secuencia Comprobar si la secuencia est vaca

El valor contenido en los elementos pueden ser el mismo o diferente. En estas estructuras se realizan operaciones de agregar y/o eliminar elementos a la lista segn un criterio particular. Para definir claramente el comportamiento de la estructura es necesario determinar en qu posicin se inserta un elemento nuevo y qu elemento se borra o se obtiene.

La diferencia entre las tres estructuras vendr dada por la posicin del elemento a aadir, borrar y consultar:

Pilas: Las tres operaciones actan sobre el final de la secuencia. Colas: Se aade por el final y se borra y consulta por el principio. Listas: Las tres operaciones se realizan sobre una posicin privilegiada de la secuencia, la cual puede desplazarse.

2.4. Listas contiguas

Una lista lineal es un conjunto de elementos de un tipo dado que se encuentran ordenados y pueden variar en nmero. Los elementos de una lista lineal se almacenan normalmente contiguos en posiciones consecutivas de la memoria. Las sucesivas entradas en una gua o directorio telefnico, por ejemplo, estn en lneas sucesivas, excepto en las partes superior e inferior de cada columna. Una lista lineal se almacena en la memoria principal de una computadora en posiciones sucesivas de memoria; cuando se almacenan en cinta magntica, los elementos sucesivos se presentan en sucesin en la cinta. Esta sucesin se denomina almacenamiento secuencial.

Las lneas as definidas se denominan contiguas. Las operaciones que se pueden realizar con listas lineales contiguas son:

1. Insertar, eliminar o localizar un elemento.2. Determinar el tamao de la lista (nmero de elementos).3. Recorrer la lista para localizar un determinado elemento.4. Clasificar los elementos de la lista en orden ascendente o descendente.5. Unir dos o ms listas en una sola.6. Dividir una lista en varias sublistas.7. Copiar una lista.8. Borrar una lista.

Una lista lineal se almacena en la memoria de la computadora en posiciones sucesivas o adyacentes y se procesa como un arreglo unidimensional. En este caso, el acceso a cualquier elemento de la lista y la adicin de nuevos elementos es fcil; Sin embargo la insercin o borrado requiere un desplazamiento de lugar de los elementos que le siguen y, en consecuencia un diseo de algoritmo especifico.

Se implementan a travs de arreglos, donde la insercin o eliminacin de un elemento excepto en la cabecera o al final de la lista necesitar una traslacin de los elementos de la lista.

La declaracin en C de una lista implementada por arreglos es la siguiente:struct lista{int elem[long_max];int ultimo;}

Creacin de lista contigua:struct lista* Crear(){struct lista* L = (struct lista*) malloc(sizeof(struct lista));L-> ultimo=0;return L;}

2.5. Listas enlazadas

Una lista enlazada es un conjunto de elementos llamados nodos en los que cada uno de ellos contiene un dato y tambin la direccin del siguiente nodo, donde el orden de los mismos se establece mediante punteros.

La idea bsica es que cada componente de la lista incluya un puntero que indique donde puede encontrarse el siguiente componente por lo que el orden relativo de estos puede ser fcilmente alterado modificando los punteros lo que permite, a su vez, aadir o suprimir elementos de la lista. El primer elemento de la lista es la cabecera, que slo contiene un puntero que seala el primer elemento de la lista.El ltimo nodo de la lista apunta a NULL (nulo) porque no hay ms nodos en la lista. Se usar el trmino NULL para designar el final de la lista.

Listas Enlazadas frente a Arrays

Las listas enlazadas tienen las siguientes ventajas sobre los arrays:

No requieren memoria extra para soportar la expansin. Por el contrario, los arrays requieren memoria extra si se necesita expandirlo (una vez que todos los elementos tienen datos no se pueden aadir datos nuevos a un array). Ofrecen una insercin/borrado de elementos ms rpida que sus operaciones equivalentes en los arrays. Slo se tienen que actualizar los enlaces despus de identificar la posicin de insercin/borrado. Desde la perspectiva de los arrays, la insercin de datos requiere el movimiento de todos los otros datos del array para crear un elemento vaco. De forma similar, el borrado de un dato existente requiere el movimiento de todos los otros datos para eliminar el elemento vaco.

En contraste, los arrays ofrecen las siguientes ventajas sobre las listas enlazadas:

Los elementos de los arrays ocupan menos memoria que los nodos porque no requieren campos de enlace. Los arrays ofrecen un acceso ms rpido a los datos, mediante ndices basados en enteros.

Las listas enlazadas son ms apropiadas cuando se trabaja con datos dinmicos. En otras palabras, inserciones y borrados con frecuencia. Por el contrario, los arrays son ms apropiados cuando los datos son estticos (las inserciones y borrados son raras). De todas formas, no olvide que si se queda sin espacio cuando aade tems a un array, debe crear un array ms grande, copiar los datos del array original el nuevo array mayor y eliminar el original. Esto cuesta tiempo, lo que afecta especialmente al rendimiento si se hace repetidamente.

Mezclando una lista de enlace simple con un array uni-dimensional para acceder a los nodos mediante los ndices del array no se consigue nada. Gastar ms memoria, porque necesitar los elementos del array ms los nodos, y tiempo, porque necesitar mover los tems del array siempre que inserte o borre un nodo. Sin embargo, si es posible integrar el array con una lista enlazada para crear una estructura de datos til.

Existen diferentes tipos de listas enlazadas:

Lista Enlazadas Simples. Listas Doblemente Enlazadas. Listas Enlazadas Circulares.

Las listas enlazadas pueden ser implementadas en muchos lenguajes. Lenguajes tales como Lisp y Scheme tiene estructuras de datos ya construidas, junto con operaciones para acceder a las listas enlazadas. Lenguajes imperativos u orientados a objetos tales como C, C++ o Java disponen de referencias para crear listas enlazadas.

Operaciones con listas enlazadas

Las operaciones que podemos realizar sobre una lista enlazada son las siguientes:

Recorrido. Esta operacin consiste en visitar cada uno de los nodos que forman la lista. Para recorrer todos los nodos de la lista, se comienza con el primero, se toma el valor del campo liga para avanzar al segundo nodo, el campo liga de este nodo nos dar la direccin del tercer nodo, y as sucesivamente. Insercin. Esta operacin consiste en agregar un nuevo nodo a la lista. Para esta operacin se pueden considerar tres casos: Insertar un nodo al inicio. Insertar un nodo antes o despus de cierto nodo. Insertar un nodo al final. Borrado. La operacin de borrado consiste en quitar un nodo de la lista, redefiniendo las ligas que correspondan. Se pueden presentar cuatro casos: Eliminar el primer nodo. Eliminar el ltimo nodo. Eliminar un nodo con cierta informacin. Eliminar el nodo anterior o posterior al nodo cierta con informacin. Bsqueda. Esta operacin consiste en visitar cada uno de los nodos, tomando al campo liga como puntero al siguiente nodo a visitar.

Figura 1. Esquema de un nodo y una lista enlazada.

LISTA ENLAZADA SIMPLE

La lista enlazada bsica es la lista enlazada simple la cual tiene un enlace por nodo. Este enlace apunta al siguiente nodo en la lista, o al valor NULL o a la lista vaca, si es el ltimo nodo.

LISTAS ENLAZADAS DOBLES

Cada nodo tiene dos enlaces: uno apunta al nodo anterior, o apunta al valor NULL o a la lista vaca si es el primer nodo; y otro que apunta al siguiente nodo siguiente, o apunta al valor NULL o a la lista vaca si es el ltimo nodo.

LISTAS ENLAZADAS CIRCULARES

En una lista enlazada circular, el primer y el ltimo nodo estn unidos juntos. Esto se puede hacer tanto para listas enlazadas simples como para las doblemente enlazadas. Para recorrer un lista enlazada circular podemos empezar por cualquier nodo y seguir la lista en cualquier direccin hasta que se regrese hasta el nodo original. Desde otro punto de vista, las listas enlazadas circulares pueden ser vistas como listas sin comienzo ni fin. Este tipo de listas es el ms usado para dirigir buffers para ingerir datos, y para visitar todos los nodos de una lista a partir de uno dado.

Cada nodo tiene un enlace, similar al de las listas enlazadas simples, excepto que el siguiente nodo del ltimo apunta al primero. Como en una lista enlazada simple, los nuevos nodos pueden ser solo eficientemente insertados despus de uno que ya tengamos referenciado. Por esta razn, es usual quedarse con una referencia solamente al ltimo elemento en una lista enlazada circular simple, esto nos permite rpidas inserciones al principio, y tambin permite accesos al primer nodo desde el puntero del ltimo nodo.

LISTAS ENLAZADAS DOBLEMENTE CIRCULAR

En una lista enlazada doblemente circular, cada nodo tiene dos enlaces, similares a los de la lista doblemente enlazada, excepto que el enlace anterior del primer nodo apunta al ltimo y el enlace siguiente del ltimo nodo, apunta al primero. Como en una lista doblemente enlazada, las inserciones y eliminaciones pueden ser hechas desde cualquier punto con acceso a algn nodo cercano. Aunque estructuralmente una lista circular doblemente enlazada no tiene ni principio ni fin, un puntero de acceso externo puede establecer el nodo apuntado que est en la cabeza o al nodo cola, y as mantener el orden tan bien como una lista doblemente enlazada con falsos nodos.

Implementacin

Cdigo con explicacin para implementar una lista enlazada:

Lo primero que debemos hacer es declarar las dos libreras necesarias.#include#include

Luego declaramos la estructura o el estruct donde vamos a guardar los nodosstruct nodo{ int info; // En la variable info guardaremos el contenido de los nodos. struct nodo *sgt; // El puntero siguiente sera para crear los nodos de la lista.};

Seguimos como el main(), en el main declaramos los dos punteros que nos van a servir en la creacin de los nodos:struct nodo *cabe; // este para la cabeza del nodostruct nodo *nuevo; //este para los nuevos nodos que se creen.

Procedemos a declarar la cabeza como NULLcabe=NULL;Importante si no declaras la cabeza del nodo como NULL posiblemente obtendrs un error en tiempo de ejecucin.

Ahora vamos a declarar tres variables tipo entero que nos ayudaran en lacreacinde nodos. int dato; // Esta variable para almacenar los datos que se le vallan a introducir a los nodos. int i=1; //Esta es la variable del contador para crear los nodos. int cant; //Esta para la cantidad de nodos que el usuario desee.

Ahora imprimimos un mensaje para pedir la cantidad de nodos que desea el usuario.coutcant;

Como viste ya se haba declarado la variable "cant" que es la que nos permite saber cuntos nodos desea el usuario.

Ahora vamos a realizar el proceso ms engorroso y que requiere la mayoratencinposible, por favor ponatencinen cada paso de esto porque son lo ms vitales. Abrimos un ciclo while que llegar hasta donde lo especifico el usuario con la sentencia anterior escrita. Este ciclo while depender de dos variables las variables i y cant anteriormente declaradas. La variable cant es el final del ciclo por ejemplo si la variable cant contiene el valor de 5 entonces este ser el nmero de repeticiones del ciclo o mejor dicho ser la cantidad de vueltas que dar el ciclo. Con esta variable controlamos los nodos que vamos a crear.

while(isgt=cabe; coutdato; nuevo->info=dato; cabe=nuevo; i++; }

Se especificaran las lneas que se han creado en el ciclo: nuevo=(struct nodo *)malloc(sizeof(struct nodo)); esta linease usa para crear el nuevo nodo que vamos a usar en la primera vuelta del ciclo. La parte de (struct nodo *)malloc(sizeof(struct nodo)) se usa para asignar memoria dinmicamente cuando se est ejecutando el programa. nuevo->sgt=cabe; Esta lnea es para que el nuevo nodo se le el valor de cabeza. Y as ir creando los dems nodos de forma ordenada. Importante ver video para mirar grficamente este proceso donde el enlace del nodo original pasa al enlace del nodo nuevo. Entonces el nodo original pasa a ser el nodo de atrs y el nuevo nodo pasa a ser el primero, y as sucesivamente en la repeticin del ciclo. coutdato; Aqu solicitamos los datos que vamos a entrar en el nuevo nodo. nuevo->info=dato; Entonces ahora hacemos que la informacin pedida anteriormente pase a la variable "info" que ser el contenido del nodo nuevo. cabe=nuevo; aqu damos al apuntador cabeza la direccin de nuevo quedando as el apuntador cabeza que apuntaba a el nodo original, apuntando al nodo nuevo.

Ahora procedemos a imprimir los nodos con las siguientes lneas.

while(nuevo!=NULL){ //El apuntador nodo ira siguiendo los nodos ya para hasta encontrar NULL cout