martes, 12 de enero de 2010

UNIDAD IV: ESTRUCTURAS LINEALES

4.1 ARBOLES DEFINICION

Un árbol es una estructura de datos ampliamente usada que emula la forma de un árbol (un conjunto de nodos conectados). Un nodo es la unidad sobre la que se construye el árbol y puede tener cero o mas nodos hijos conectados a él. Se dice que un nodo a es padre de un nodo b, si existe un enlace desde a hasta b (en ese caso, también decimos que bes hijo de a). Sólo puede haber un único nodo sin padres, que llamaremos raíz. Un nodo que no tiene hijos se conoce como hoja.

El árbol También se define como una estructura de datos no lineal. Esta estructura se usa principalmente para representar datos con una relación jerárquica entre sus elementos, como por ejemplo registros, árboles genealógicos y tablas de contenidos. Entre otros tenemos un tipo especial de de árbol que es, llamado árbol binario, que puede ser implementado fácilmente en la computadora.


4.1.2 REPRESENTACION EN MEMORIA DE ARBOLES

Existen dos formas de representar un Arbol en Memoria:


1- Mediante Listas Enlazadas:
Utilizando la firma de las listas lineales. Los Nodos del arbolbinario serán representados como registros que contendran como minimo dos 3 campos. En un campo se almacenará la información del nodo y los dos campos restantes se utilizarán para apuntar los arboles izquierdo y derecho respectivamente del nodo en cuestión.

Dado el siguiente nodo T

IZQ INFO DER

Donde el IZQ es el campo donde se almacenara la dirección del subarbol iszquierdo, INFO Contendra la información del nodo y DER La dirección del subarbol derecho

2- Representacion Secuencial :
Se utiliza un arreglo simple en el cual la raíz ocupara la posición uno y sus hijos estaran en la posicion 2*k para el hijo izquierdo y 2*k+1 para el hijo derecho

Ejem:


K Arbol
1 45
2 22
3
4 22
5
6 11
7
8
9
10
11 15
12
13 30
14
15 25
...
19 77
...
27 90

4.1.2.1 ARBOLES GENERALES

En ciencias de la computación, un árbol es una estructura de datos ampliamente usada que emula la forma de un árbol (un conjunto de nodos conectados). Un nodo es la unidad sobre la que se construye el árbol y puede tener cero o mas nodos hijos conectados a él. Se dice que un nodo a es padre de un nodo b, si existe un enlace desde a hasta b (en ese caso, también decimos que b es hijo de a). Sólo puede haber un único nodo sin padres, que llamaremos raíz. Un nodo que no tiene hijos se conoce como hoja.

El árbol También se define como una estructura de datos no lineal. Esta estructura se usa principalmente para representar datos con una relación jerárquica entre sus elementos, como por ejemplo registros, árboles genealógicos y tablas de contenidos. Entre otros tenemos un tipo especial de de árbol que es, llamado árbol binario, que puede ser implementado fácilmente en la computadora.


4.1.2.2 ARBOLES BINARIOS


Árboles Binarios

Un árbol binario T se define como un conjunto finito de elementos, llamados nodos, de forma que:

  1. T es vacío ( en cuyo caso se llama árbol nulo o árbol vació) o
  2. T contiene un nodo distinguido R, llamado raíz de T, y los restantes nodos de T forman un par ordenado de árboles binarios disjuntos T1 y T2.

Si T contiene una raíz R, los dos árboles T1 y T2 se llaman, respectivamente, subárboles izquierdo y derecho de la raíz R. Si T1 no es vació , entonces su raíz se llama sucesor izquierdo de R; y análogamente, si T2 no es vació, su raíz se llama sucesor derecho de R.

Observe que :

  1. B es un sucesor izquierdo y C un sucesor derecho del nodo A.
  2. El subárbol izquierdo de la raíz A consiste en los nodos B, D, E y F, y el subárbol derecho de A consiste en los nodos C , G, H, J, K y L.

Figura (1)

Cualquier nodo N de un árbol binario T tiene 0, 1 ó 2 sucesores. Los nodos A,B,C y H tienen dos sucesores, los nodos R y J sólo tienen un sucesor , y los nodos D,F, G,L y K no tienen sucesores. Los nodos sin sucesores se llaman nodos terminales.

La definición anterior del árbol binario T es recursiva, ya que T se define en términos de los subárboles binarios T1 y T2. Esto significa, en particular, que cada nodo N de T contiene un subárbol izquierdo y uno derecho. Más aun, si N es un nodo terminal, ambos árboles están vacíos.

Dos árboles binarios T y T’ se dicen que son similares si tienen la misma estructura o, en otras palabras, si tienen la misma forma. Los árboles se dice que son copias si son similares y tienen los mismos contenidos en sus correspondientes nodos.


4.1.3 RECORRIDO EN ARBOL BINARIO EN PREORDEN

El recorrido en un árbol binario permite rescatar los datos en formas diferentes. Aunque existen varias maneras de hacerlo, aquí se verán las más conocidas : inorden , preorden , postorden.

Una de los recorridos más usados (inorden) es el que rescata los datos en forma ordenada (de menor a mayor).

La técnica que usualmente se usa para hacer el recorrido, es ir almacenando los datos en una estructura lineal : Cola , Lista o Pila.

El criterio para escoger una de las tres depende del problema , pero generalmente los criterios generales son los siguientes :

  • Cola : los datos quieren ser vistos en el mismo orden en el cual fueron recorridos y la cola pasa a ser un instrumento de almacenamiento de "corto plazo" : (almacenar , ver , vaciar ).

  • Lista : los datos necesitan ser almacenados y se requieren operaciones en donde es necesario acceder a los datos en cualquier posición.

  • Pila : se necesita que los datos se almacenen en forma de pila, pasando a ser un instrumento de almacenamiento de "corto plazo".

    De aquí en adelante , las implementaciones de recorrido serán usando una Cola , ya que los problemas que vienen, requieren los datos en forma ordenada.


  • 4.1.3.2 RECORRIDO EN ARBOL BINARIO INORDEN

    Se declara una función que recibe como parámetros un arbol binario y una cola.

    Las instrucciones de la función, siguen el concepto recursivo de la definición, teniendo en cuenta que el concepto de "visitar el elemento de la raiz" se reemplaza por : obtener la raíz e insertar el elemento en la cola y que la condición de la recursividad es que se encuentre con algún subárbol vacío.

    *nota : Hay que tener cuidado en verificar que la cola que se pasa como parámetro sea no vacía. Las funciones serán implementadas en el archivo "funcArbin.h".

    void inordenArbin(Arbin a,Cola col)
    {
    if (!vacioArbin(a))
    {
    inordenArbin(izqArbin(a),col);
    TipoA raiz
    = raizArbin(a);
    adicCola
    (col,raiz);
    inordenArbin
    (derArbin(a),col);
    }
    }

    4.1.3.3 RECORRIDO EN ARBOL BINARIO POSORDEN

    • Recorrer el subarbol izquierdo en postorden.
    • Recorrer el subarbol derecho en postorden.
    • Examinar la raíz.


    4.1.4 BALANCEO ARBOLES BINARIOS

    En ciencias de la computación, un árbol binario de búsqueda auto-balanceable o equilibrado es un árbol binario de búsqueda que intenta mantener su altura, o el número de niveles de nodos bajo la raíz, tan pequeños como sea posible en todo momento, automáticamente. Esto es importante, ya que muchas operaciones en un árbol de búsqueda binaria tardan un tiempo proporcional a la altura del árbol, y los árboles binarios de búsqueda ordinarios pueden tomar alturas muy grandes en situaciones normales, como cuando las claves son insertadas en orden. Mantener baja la altura se consigue habitualmente realizando transformaciones en el árbol, como la rotación de árboles, en momentos clave.

    Tiempos para varias operaciones en términos del número de nodos en el árbol n:

    Para algunas implementaciones estos tiempos son el peor caso, mientras que para otras están amortizados.

    Estructuras de datos populares que implementan este tipo de árbol:

    Operación Tiempo en cota superior asintótica
    Búsqueda O(log n)
    Inserción O(log n)
    Eliminación O(log n)
    Iteración en orden O(n)

    4.1.5 CLASES PARA IMPLEMENTACION DE ARBOLES

    • Dado que los árboles binarios son de estructura fundamental en la teoría de los árboles, será preciso disponer de algún mecanismo que permita la conversión de un árbol general en árbol binario.

      “Los árboles binarios son más fáciles de programar que los generales”. En esto es imprescindible deducir cuántas ramas o caminos se desprenden de un nodo en un momento dado. Por ello, y dado que de los árboles binarios siempre se cuelgan como máximo dos subárboles, su programación será más sencilla.

      Afortunadamente, existe una técnica para convertir un árbol general a formato de un árbol binario. Ejemplo:

      Supongamos que se tiene el árbol A y se quiere convertir en un árbol binario B. El árbol de conversión tiene 3 pasos fáciles:

      1. - La raíz de B es la raíz de A

      2. -

      a) Enlazar un nodo raíz con el camino que conecta el nodo más a la izquierda (su hijo).

      ,. b) Enlazar éste nodo con los restantes descendientes del nodo raíz en su camino con lo que se forma el nivel 1.

      c) A continuación, repetir los pasos a y b con los nodos del nivel 2, enlazando siempre en un mismo camino todos los hermanos (descendientes del mismo nodo). Repetir estos pasos hasta llegar al nivel más alto.

      3.- Girar el diagrama resultante 45° para diferenciar entre los subárboles izquierdos y derecho.

      Ejem:

      T T

      A A

      B B

      C C

      D D

      E E


    4.2 GRAFOS DEFINICION

    Definicion:

    Un grafo dirigido G consiste en un conjunto de vértices V y un conjunto de arcos o aristas A. Los vertice se denominan también nodos o puntos.

    Un arco, es un par ordenado de vértices(V,W) donde V es el vértice inicial y W es el vértice terminal del arco. Un arco se expresa como: V–>W y se representa de la siguiente manera:

    711.jpg

    Los vértice de un grafo pueden usarse para representar objetos. Los arcos se utilizan para representar relaciones entre estos objetos.

    Las aplicaciones más importantes de los grafos son las siguientes:

    Rutas entre ciudades.

    Determinar tiempos máximos y mínimos en un proceso.

    Flujo y control en un programa.

    Operaciones Sobre Grafos:

    En esta sección analizaremos algunas de las operaciones sobre grafos, como :

    Creación.

    Inserción.

    Búsqueda.

    Eliminación.

    En esta sección, continuaremos utilizando los apuntadores que se usaron en las secciones anteriores. TOP para hacer referencia al primer nodo, LD para indicar liga derecha y LA para indicar liga abajo, por último usaremos los apuntadores P y Q para hacer referencia a los nuevos nodos que vayan a ser usados.


    4.2.3 REPRESENTACION DE GRAFOS EN MEMORIA


    Los grafos se representan en memoria enlazada mediante listas de adyacencia.

    Una lista de adyacencia, se define de la siguiente manera: Para un vértice i es una lista en cierto orden formada por todos los vértices adyacentes [a,i]. Se puede representar un grafo por medio de un arreglo donde cabeza de i es un apuntador a la lista de adyacencia al vértice i.

    Veamos el siguiente grafo dirigido:

    La lista de adyacencia, que se obtuvo a partir del grafo anterior es la siguiente:



    4.2.4 CLASES PARA IMPLEMENTACION DE GRAFOS

    En un grafo se tiene un circuito de Hamilton cuando se inicie en un nodo y termina en el mismo pasando exactamente una vez por cada nodo.

    CIRCUITO DE VENN EULER

    Este circuito se da en grafos donde se realiza un camino donde se puede pasar solo una vez por cada arco.

    El factor de peso o Ponderación se da en un grafo en el cual hay datos asociados con un arco.










    1 comentario: