lunes, 30 de diciembre de 2013

UNIDAD 4.-Estructuras no lineales.

Árboles.
Un conjunto finito de elementos no vacío en el cual un elemento se denomina raíz y los restantes se dividen en subconjuntos separados, cada uno de los cuales es por sí mismo un árbol. Cada elemento en un árbol se denomina nodo del árbol. Su estructura es denominada como de bifurcación, también conocida como estructura multi-enlazada.
En un árbol no hay lazos, lo que indica que no hay pasos que comiencen en un vértice y puedan volver al mismo, un árbol puede tener un vértice o nodo llamado raíz, el cual se indica como vértice principal. Este nodo raíz no puede ser hijo de otro nodo.


Representación en memoria de árboles.
Para representar un árbol binario puede hacerse de forma tradicional, por arreglos o Struct. En la tradicional se emplean dos punteros de tipo variables dinámicas o listas; por la otra se emplea el uso de arreglos. La manera dinámica es la más empleada.

Strutc; es una manera de registro utilizado en C que define una lista de variables, que puede ser utilizada en árboles binarios.

Los arboles binarios se pueden expresar mediante registros divididos en por lo menos tres campos, el primero y el último contienen la información de los arboles anterior y siguiente del árbol en cuestión, y un campo más para almacenar el valor.

Árboles generales.


Se utiliza la recursión para definir un árbol porque representa la forma más apropiada y porque además es una característica primordial de los mismos. Dentro de los ejemplos de la aplicación de árboles, podemos citar:

-Los sistemas de archivos ( file system ) de los sistemas operativos, compuestos por jerarquías de directorios y archivos. 
-La jerarquía de clases en los lenguajes orientados a objetos. 
-La jerarquía de países, provincias, departamentos y municipios que organiza al poder político de una república.

Árboles binarios.

Al tener un árbol ordenado, este se identifica, porque el nodo padre es mayor que las claves del subárbol izquierdo, además de ser menor que todas las claves del subárbol derecho.
El árbol binario es empleado para reconocer un conjunto de registros que tienen un identificador o clave única.




Tipos esenciales de árboles binarios.
-Árbol binario distinto. 
Aquí, dos árboles tienen diferentes estructuras, por lo tanto se les considera árboles distintos.

-Árboles binarios similares. 



En este árbol las estructuras son iguales, pero los datos contenidos en el son distintos, entonces se dice que el árbol es distinto.







-Árboles binarios equivalentes.
Además de ser de tipo similar, si un árbol contiene los mismos datos, el árbol es equivalente.

-Árboles binarios completos.

Árbol en el que sus diferentes niveles tienen dos hijos, un subárbol izquierdo y un subárbol derecho, a excepción del último nodo.


Recorrido en un árbol binario.

Maneras de recorrer un árbol y su secuencia.

Inorden
-Recorrido del subárbol izquierdo en inorden.
-Buscar la raíz.
-Recorrido del subárbol derecho en inorden.

Preorden.

-Examinar la raíz.
-Recorrido del subárbol izquierdo en preorden.
-Recorrido del subárbol derecho en preorden.

Postorden.
-Recorrido del subárbol izquierdo en postorden.
-Recorrido del subárbol derecho en postorden.
-Examinar la raíz.


                                                                            

 El recorrido para este árbol es el siguiente:
Inorden: GDBHEIACJKF
Preorden: ABDGEHICFJK
Postorden: GDHIEBKJFCA

Otro tipo de árboles, son los enhebrados:
Se denomina así porque contiene hebras a la derecha o a la izquierda.
Estos árboles se utilizan para el mejor aprovechamiento de la memoria.


Árbol enhebrado a la derecha.          

Balanceo de árboles binarios.
Terminología. 
-Un árbol esta balanceado, si para cada uno de sus nodos, las alturas de sus dos subárboles  difieren a lo más en 1.

-Los arboles pueden estar balanceados, por altura o por peso.

-Balanceado por altura: todos los hijos o nodos hoja, se intentan mantener a la misma distancia de la raíz.

-Balanceado por peso: los nodos más visitados o utilizados se mantienen a poca distancia de la raíz

Grafos

Definición 
Un grafo es un conjunto de nodos (o vértices) unidos por un conjunto de arcos (o aristas) que permiten representar relaciones binarias entre los elementos de un conjunto.
Representación:
Un conjunto de nodos {A, B, C, D, E, F, G, H} y su conjunto de arcos {(A, B), (A, D), (A, C), (C, D), (C, F), (E, G), (A, A)}, para el siguiente grafo.

Terminología
- Al número de nodos del grafo se le llama orden del grafo.
- Un grafo nulo es un grafo de orden cero (0).
- Dos nodos son adyacentes si hay un arco que los une.
- Camino es una secuencia de uno o más arcos que conectan dos nodos.
- El camino de un nodo así mismo se llama ciclo.
- Un grafo es conexo si existe un camino simple entre cualesquiera dos de sus nodos.
- Un grafo sin ciclos es un árbol.
- Un grafo es completo cuando cada nodo está conectado con todos y cada uno de los nodos restantes.
- El grafo se denomina conectado cuando existe siempre un camino que une dos nodos cualesquiera y desconectado en su caso contrario.
Ejemplos;
1 Una línea aérea que realiza vuelos entre las ciudades conectadas por líneas
2 Un comerciante de frutas tiene que visitar n poblados, conectados entre si por carreteras, su interés será minimizar la distancia recorrida (o el tiempo, si puede haber ciertos problemas).

Entonces el grafo tendrá como vértices las ciudades, como aristas las carreteras y la valuación será la distancia entre ellas. 

Tipos de grafos.


Los grafos se pueden clasificar en dos grupos, dirigidos y no dirigidos. El grafo dirigido (o dígrafo) se caracteriza porque cada arista tiene una dirección asignada, es decir, que cada arista está asociada a un par ordenado de vértices, de forma que (v1, v2) ≠ (v2, v1) representen dos arcos diferentes. En un grafo no dirigido el par de vértices que representa un arco no está ordenado, por lo tanto los pares (v1, v2) = (v2, v1) representan el mismo arco.

De los principales tipos de grafos mencionamos los siguientes:
Grafo regular: grafo con el mismo grado en todos los vértices. Si ese grado se hace llamar k lo llamaremos K-regular.
grafo 3-regular y grafo no regular.


Grafo bipartito: es aquel cuyos vértices pueden formarse dos conjuntos distintos disyuntos de modo que no haya adyacencias entre vértices pertenecientes al mismo conjunto.






Grafo bipartito regular: se puede denotar como Km, n donde m, n es el grado de cada conjunto disjunto de vértices.         K2, 5


             

Grafo completo: grafo con una arista entre cada par de vértices; un grafo completo con n vértices se denota Kn.
K5




Grafo nulo: en este grafo los vértices que lo componen no están conectados, esto es, que son vértices aislados.






Grafos Isomorfos: (aquí se hace una comparación de dos grafos) se dice entonces, que dos grafos son isomorfos cuando existe una correspondencia uno a uno (biunívoca), entre sus vértices de tal forma que dos de estos quedan unidos por una arista en común.
(Referencia con la matriz de adyacencia para conocer si existe Isomorfismo en los dos grafos)*

Grafos platónicos: grafos formados por los vértices y aristas de los cinco sólidos regulares (sólidos platónicos) que son; el tetraedro, el cubo, el octaedro, el dodecaedro y el icosaedro.
Grafos Eulerianos: este, es un camino que contiene a todas las aristas del grafo, apareciendo una vez. Consiste en recorrer todas las aristas del grafo sin repetir ninguna.
Grafos Hamiltonianos: este camino recorre todos los vértices de un grafo sin pasar dos veces por el mismo vértice. 




Representación de grafos en memoria.  

-Por medio de matriz de incidencia, que corresponde a 0 y 1.
                                      
 -Por matriz de adyacencia.
Aquí las filas, son los nodos y las columnas, son los nodos destino.
Existen grafos con peso o sin peso
Los grafos con peso, no tienen valor, solo unión.
Los grafos sin peso, tienen aristas con valor.





-Lista de adyacencia
Se asocia cada nodo del grafo una lista que contenga todos aquellos nodos que sean adyacentes a el.


Clases para la implementación de grafos.
Las operaciones dentro de los grafos, son las siguientes:

Dentro de la matriz de adyacencia;
-Creación

Public Grafo BM (bolean d) {
Max vértices = num aristas = 0; (considerado null)
Dirigido = d;













-Inserción (de aristas)
Para una matriz, siendo simétrica, se intercambian las filas por las columnas, en este caso;
i = filas
j = columnas
  i j                  j i
123              147
456              258
789              369

Public void insert arista {
int i;
int j;
Matriz Adya [i] [j] = true
If (! dirigido);
Matriz [j] [i] = Matriz Adya [i] [j]
}
-Búsqueda
En la búsqueda se realiza alguno de estos procesos, únicamente haciendo el reconocimiento de la variable que se desea buscar.
-Eliminación.
Public eliminar arista {
int i;
int j;
matriz adya [i] [j] = falso
if (! dirigido);
matriz adya [j] [i] = falso
}Operaciones, en la lista de adyacencia
-Insertar aristas
Public void inseratr arista {
int i;
int j;
Lista adya [i]  insertar [j];
If (dirigido)
Lista adya [j]  insertar [i];
-Eliminar
Public void eliminar arista {
int i;
int j;
lista adya [i] [j];
lista [j] [i];







lunes, 18 de noviembre de 2013


Pilas

Las palabras que refieren a la programación o a la estructura de datos, están más que relacionadas a situaciones presentes en nuestra vida diaria.
Las pilas, en un sentido general, manejan lo siguiente: "El último elemento agregado, es el primero en ser retirado".

Para entender este concepto, se hace referencia a la filosofía LIFO = por sus siglas en inglés (Last Input, First Output).

Como se muestra en esta pila de libros y supermercado (figura 1.1)


(figura 1.1)
Además de ser una estructura lineal de datos, en una pila se pueden agregar o quitar elementos, únicamente por uno de los dos extremos, mientras que estos elementos que la integran son limitados, a lo que conocemos como Tope Máximo.
Las pilas indican su posición mediante un apuntador que muestra el último elemento en una pila.
Una pila maneja atributos y métodos para llevar a cabo sus procesos de resolución y entendimiento; los atributos son la colección de elementos y el tope, que es nuestro límite; los métodos integran todas las operaciones posibles, que son PUSH y POP.
PUSH, es una operación que nos ayuda a agregar elementos (su apuntador nos indica incremento).
POP, para esta operación los elementos son extraídos (el apuntador nos indica decremento).

Como se ve a continuación: 
Cada pila y su operación (imagen 1.2)
(figura 1.2)
A pesar de declarar ciertos puntos para las pilas, tanto en sus operaciones, como en lo que deben contener, existen posibles errores en ellas conocidos como, OVERFLOW UNDERFLOW. 
OVERFLOW, este error existe cuando se intenta introducir más elementos a una pila llena.
UNDERFLOW,  para este error lo que se intenta es extraer elementos de una pila vacía.



Colas.

Para comprender primero en qué consisten la colas, hablamos de lo siguiente;
El tema de Colas, para la estructura de datos, también esta presente en casos típicos de nuestra vida, por ello se dice que colas es, "El primer elemento agregado, es el primero en ser retirado"
En este ejemplo se muestra cómo podemos ver el tema de "Colas" en nuestro entorno.(imagen 1.3)

(figura 1.3)

Al igual que las pilas, las colas utilizan una filosofía para relacionar y entender su concepto; ellas hacen uso de la filosofía FIFO = (First Input, First Output)
Una cola utiliza un vector para poder ser implementada y el uso de dos variables que son, FRENTE y FIN
El FRENTE nos ayuda a indicar la posición del primer elemento en una cola, el cual se considera próximo en salir.
FIN indica la posición del último elemento en una cola, para continuar con el proceso, los elementos que vayan llegando, se irán agregando.

En las colas también existen posibles operaciones a llevar acabo; en un sentido general, insertar, eliminar, vacía y llena. como se muestra en la figura 1.4.

Insertar: se encarga de almacenar al final de la cola el elemento que es recibido.
Eliminar: saca el elemento de la cola que se encuentra al frente.
Vacía: regresa un valor indicando si la cola tiene o no elementos (indicación por medio de true y false).
Llena: regresa un valor indicando si la cola tiene espacio disponible para insertar nuevos elementos (la indicación es por medio de true y false).

(figura 1.4)

Existen diferentes tipos de colas, como lo son; las colas dobles y circulares.

 En una cola doble, se permite la inserción y eliminación de elementos desde ambos extremos.(figura 1.5)

(figura 1.5)
En una cola circular, encontramos los elementos, como lo dice su nombre, de forma circular, aquí cada elemento tiene un sucesor y un predecesor.
Para poder añadir o eliminar algún elemento, es necesario hacerlo desde la cabeza.(figura 1.6)

(figura 1.6)


Listas.


Otro tipo lineal conocido son las Listas, su  estructura son datos secuenciales.
Son estructuras lineales donde cada elemento de una lista excepto el primero tiene un único predecesor y cada elemento de la lista excepto el último tiene un sucesor. 

En una lista, para la solución de las mismas, es necesario el uso de operaciones, como las siguientes:

Lista Vacía ( ); en esta operación, devuelve verdadero si la lisa esta vacía, en caso de no estarlo devolverá falso.
Insertar (x, y); aquí el elemento x, se inserta hasta la ultima posición y de la lista.
Buscar (x); en la búsqueda, se devuelve la posición en la lista del elemento x. Y por ultimo.

Eliminar (x); encargado de eliminar de la lista nuestro elemento, en este caso x.

Las listas en las cuales nos basaremos de acuerdo a su estructura se clasifican en:

-Listas simples.
-Listas dobles.
  *Listas dobles lineales.
   *Listas dobles circulares.
-Listas Circulares.
   *Multilistas.

Listas simples. 

Las listas simples enlazadas se puede entender que están compuestas por una serie de nodos las cuales están interconectadas de manera secuencial, un dato con otro, únicamente se puede conocer a su sucesor, cuando una lista está vacía su valor es nulo o null. 

Como se muestra en la figura 1.7 en la cual se representa un ejemplo de lista simplemente enlazada que almacena apellidos:
(figura 1.7)


Listas dobles.
Este tipo de lista son series de nodos ,donde cada nodo tiene 2 enlaces (denominado doble enlace)  uno apuntando al nodo siguiente o predecesor y otro al anterior o a su sucesor, por medio de estos enlaces se podrá avanzar o retroceder a través de la lista.
como se puede apreciar en la figura 1.8

Listas dobles lineales.
En este tipo de lista cada nodo tiene 2 punteros un hacia el nodo siguiente, y otro hacia el nodo anterior. (imagen 1.9)
(imagen 1.9)



Listas dobles Circulares.
En una lista doblemente circular se tiene estructuralmente, cada nodo tiene dos enlaces, similares a los de la lista doble, excepto que el enlace anterior del primer nodo apunta al último y el enlace siguiente del último nodo, apunta al primero.

Como se había mencionado la lista circular ,tiene cierta similitud a la lista doble lineal,la diferencia es que el primer nodo apunta al ultimo y viceversa. ver figura 2.0

(figura 2.0)
Listas Circulares
  Las listas circulares tienen como característica de que el último elemento de la misma apunta al primero.  
En la siguiente figura 2.1 se hace una representación gráfica de listas circulares.
(figura 2.1)
Multilistas
Las multilistas es un método de búsqueda que nos permite acceder de manera ordenada a la información a través de campos claves.
Las multilistas nos permiten llegar a un registro por diferentes caminos. El camino lo determina el campo clave sobre el cual se va hacer la búsqueda. A continuación se presenta un ejemplo de multilistas
Nombre
Profesión
Categoria
Ángel
Químico
1
Carlos
Informático
2
Marcos
Matemático
3
José
Físico
1
Roberto
Abogado
2
Alejandro
Informático
3

En este caso, la información de cada individuo puede acceder por medio de su profesión y por medio de su categoría , que son los atributos que permiten realizar búsqueda directa en el archivo. Como puede verse en la siguiente figura 2.2 , se tiene una lista por profesión y una por categoría.
En general las multilistas son recomendables cuando la búsqueda se hace sobre un solo atributo. En caso de necesitarse una combinación de atributos es preferible usar listas invertidas.