Punteros, referencias Listas enlazadas Arboles

Slides:



Advertisements
Presentaciones similares
5. Estructuras no lineales estáticas y dinámicas
Advertisements

ESTRUCTURA DE DATOS Unidad 04 TDA no lineales - Árboles.
IBD Clase 7.
ESTRUCTURA DE DATOS Unidad 04 Árboles BINARIOS.
ÁRBOLES EN C UNIVERSIDAD “ALONSO DE OJEDA” Facultad de Ingeniería
Unidad 5 Listas Enlazadas Bibliografía: Algoritmos y Estructuras de datos de Aguilar y Martinez. Unidad 9 Autor: Ing Rolando Simon Titiosky.
Listas enlazadas c++ Prof. Franklin Cedeño.
Estructuras de datos y algoritmos
Programación y Estructuras de Datos
Direcciones, Arreglos y Argumentos de Funciones
ÁRBOLES BINARIOS DE BUSQUEDA
Operaciones sobre un árbol
Tipo de Dato Abstracto Tipos de datos:
ESTRUCTURAS DE DATOS AVANZADAS
Encapsulamiento y Abstracción
Marzo 2007 Lenguajes Visuales Clase III.
Oscar Bedoya. Edificio 331, 2º piso, E.I.S.C. Estructuras de datos y algoritmos.
ÁRBOLES DE EXPRESION.
Definiciones: conjuntos, grafos, y árboles
Tema 7: Polimorfismo Antonio J. Sierra. Índice Introducción. Sobrecarga de métodos. Objetos como parámetros. Paso de argumentos. Devolución de objetos.
Arboles (Trees) Arboles Arboles binarios Recorridos de árboles
Cont. Arbol Binario de Búsqueda (2). Sobre los recorridos Las versiones recursivas de los recorridos son costosas debido a la gran cantidad de llamadas.
Almacenamiento y Recuperacion de Información TAD_ABB Ana Lilia Laureano Cruces Universidad Autónoma Metroplotiana.
Tema Nº4.
Estructuras dinámicas de datos, TAD Lista, parte 2
Tema 6: Clases Antonio J. Sierra.
Tema 9 Estructuras.
Estructura de Datos Lineales
Material de apoyo Unidad 4 Estructura de datos
Árboles.
Semana 5 Subprogramas..
ÁRBOLES BINARIOS DE BÚSQUEDA
C++ LISTAS C++ 11/04/2017 Ing. Edgar Ruiz Lizama.
Definiciones: conjuntos, grafos, y árboles
Árboles, montículos y grafos Cola de prioridades, montículos
ESTRUCTURAS DE DATOS I Conocer, comprender y analizar algunos de los principales tipos de estructuras de datos.
ARBOLES ESTRUCTURAS DE DATOS.
7.  El TDA Diccionario.
Índice. Revisando conceptos acerca de la memoria.
Estructura de Datos y Algoritmos
ESTRUCTURA DE DATOS EN JAVA
Árboles binarios de búsqueda
Arboles M.C. José Andrés Vázquez FCC/BUAP
ARBOLES ESTRUCTURAS DE DATOS.

Árboles Recomendado: 1. Nivelación Funciones
Árboles Binarios Estructuras de Datos.
LISTA DOBLEMENTE ENLAZADA
Programación en C para electrónicos
Unidad 6: Árboles.
Definiciones: conjuntos, grafos, y árboles
Arboles B (búsqueda externa)
INSTITUTO TECNOLOGICO DE APIZACO
Algoritmos y Estructuras de datos Listas Doblemente enlazadas
ARBOLES GENERALIZADOS
Árboles Binarios de Búsqueda (ABB)
A YUDANTÍA 5: A RBOLES Carlos Pulgar R. Mail: Página Ayudantía:
Lic. Carla Aguirre Montalvo

M.C. Meliza Contreras González
Matemáticas Discretas MISTI
Algoritmos y estructura de datos en I.O. Arboles Generales.
PUNTEROS. Los punteros son de amplia utilización en programación y muchos lenguajes permiten la manipulación directa o indirecta de los mismos. Su razón.
Listas Dinámicas.
1 ListaUna Lista se define como una serie de N elementos E 1, E 2,..., E N, ordenados de manera consecutiva, es decir, el elemento E k (que se denomina.
Las interfaces Predicate y Function Versión Unidad Didáctica 17 Fundamentos de Programación Departamento de Lenguajes y Sistemas Informáticos.
Algoritmos voraces Códigos de Huffman. Descripción del problema Tenemos un archivo de entrada. Asumiremos que el archivo está compuesto de bytes (enteros.
UNIVERSIDAD TECNOLÓGICA DE PANAMÁ Facultad de Ingeniería de Sistemas Computacionales Programa de Lic. en Informática Educativa Computación.
UNIVERSIDAD DIEGO PORTALES Facultad de Ingeniería Programación Avanzada TIPOS ABSTRACTOS DE DATOS TAD Tema: TIPOS ABSTRACTOS DE DATOS TAD Subtema: LISTAS.
Lenguaje de Programación II Prof. Rafael Montenegro B. Carrera: T.S.U en Informática Periodo: 2014-I.
Transcripción de la presentación:

Punteros, referencias Listas enlazadas Arboles 4. Estructuras de datos Punteros, referencias Listas enlazadas Arboles

Estructuras de Datos Toda la información que se maneja dentro de un computador se encuentra almacenada en su memoria, que en términos simples es una secuencia de caracteres (bytes) en donde se encuentran las instrucciones y datos a los que se accede directamente a través del procesador del computador. Los sistemas o métodos de organización de datos que permiten un almacenamiento eficiente de la información en la memoria del computador son conocidos como estructuras de datos. Estos métodos de organización constituyen las piezas básicas para la construcción de algoritmos complejos, y permiten implementarlos de manera eficiente.

El Arreglo Secuencia de datos del mismo tipo Nace y muere con una cantidad de datos fija para eficiencia en el acceso tipo[] nombre = new tipo[n_elem]; int[] arreglo = new int[10]; El nombre puede verse como puntero al primer elemento: número de byte donde se encuentra Lugar del i-esimo elemento nombre * i * largo(tipo)

Punteros puntero : variable que almacena la dirección de memoria de otra variable Si se imagina que la memoria del computador es un gran arreglo de bytes, el puntero correspondería al índice del arreglo En algunos lenguajes (Ej. C) punteros pueden ser declarados explícitamente Se puede realizar aritmética de punteros para mayor eficiencia a cambio se "oscurece" el código del programa -> alta probabilidad de cometer errores de programación difíciles de detectar En Java no

Java: Variables de referencia  variable de referencia, o  referencia: almacena la dirección de memoria en donde se ubica un objeto. Diferencia con puntero: una referencia sólo puede apuntar a objetos residentes en memoria, esto excluye los tipos primitivos. Esto implica que en Java toda variable que no sea de tipo primitivo, es una referencia. Por ejemplo, Object aux=new Object();  aux es una referencia a un objeto de la clase Object que permite operar con él.

Listas Enlazadas Una lista enlazada es una serie de nodos, conectados entre sí a través de una referencia Los nodos de una lista enlazada se componen de dos partes principales: class NodoLista { Object informacion; NodoLista siguiente; } La referencia siguiente indica en dónde se encuentra el siguiente elemento de la lista. El último elemento de la lista no tiene nodo siguiente, por lo que se dice que la referencia siguiente del último elemento es null (nula).

Listas de strings class NodoLista { String info; NodoLista sgte; NodoLista(String x, NodoLista y) { info = x; sgte = y; } NodoLista p = new NodoLista(“Pedro”,null), q = new NodoLista(“Juan”,null), r = new NodoLista(“Diego”, null); p.Sgte = q; q.sgte = r; //otra forma NodoLista lista = new NodoLista(“Diego”, null); Lista = new NodoLista(“Juan”, lista); Lista = new NodoLista(“Pedro”,lista);

Recorriendo una Lista Imprime el contenido de una lista cuyo comienzo se pasa como parámetro a la función void recorrido(NodoLista lista) { NodoLista aux=lista; while (aux!=null) { System.out.println(aux.info); aux=aux.sgte; } }

Insertando elementos Para insertar al final basta que Es necesario tener una referencia al elemento que quedará antes que el que se quiere insertar NodoLista aux=lista; while (...) { aux=aux.sgte; } NodoLista nuevo = new NodoLista(“Paula”,aux.sgte); aux.sgte = nuevo; Para insertar al final basta que aux quede apuntando al último Insertar al principio es caso especial

Eliminando elementos Es necesario tener una referencia al elemento que quedará antes que el que se quiere eliminar . Ej. Eliminar nodo que contiene “Paula”. Eliminar al principio es caso especial if (lista.info.equals(“Paula”)) lista = lista.sig; else { NodoLista aux=lista; while (aux.sgte != null) { if (aux.sgte.info.equals(“Paula”)) { aux.sgte = aux.sgte.sgte; break; }

Invertir una lista El último elemento de la lista sea el primero, el penúltimo el segundo, etc..., modificando sólo las referencias y no el contenido de los nodos. Invariante: siguiente anterior anterior siguiente anterior siguiente

Invertir una lista El último elemento de la lista sea el primero, el penúltimo el segundo, etc..., modificando sólo las referencias y no el contenido de los nodos. Invariante: void invertir(NodoLista lista) { NodoLista siguiente=lista, anterior=null; while(lista!=null) { siguiente=lista.sgte; lista.sgte=anterior; anterior=lista; lista=siguiente; } siguiente lista anterior

Lista de doble enlace La implementación vista se conoce como lista de enlace simple, y sólo puede recorrerse en un solo sentido. En una lista de doble enlace se agrega una segunda referencia al nodo previo, lo que permite recorrer la lista en ambos sentidos, Generalmente se implementa con una referencia al primer y otra referencia al último elemento.

Listas circulares Una lista circular es aquella en donde la referencia siguiente del último nodo en vez de ser null apunta al primer nodo de la lista. El concepto se aplica tanto a listas de enlace simple como doblemente enlazadas.

Cabezas de lista En muchas aplicaciones que utilizan listas enlazadas es útil contar con un nodo cabecera, que no contiene información relevante, y su referencia siguiente apunta al primer elemento de la lista. De esta manera siempre es posible definir un nodo previo a cualquier nodo de la lista, Eliminar/agregar al principio no es caso particular

Todo Junto Nodo cabecera en una lista de doble enlace Basta solo un puntero a la cabecera de la lista De esta forma la lista de doble enlace queda circular de una manera natural.

¿Qué es un TDA ? Es un conjunto de datos u objetos al cual se le asocian operaciones Provee de una interfaz con la cual es posible realizar las operaciones permitidas, abstrayéndose de la manera en como estén implementadas dichas operaciones Un mismo TDA puede ser implementado utilizando distintas estructuras de datos y proveer la misma funcionalidad Los lenguajes de programación orientados a objeto son consecuencia de estas ideas

TDA Lista serie de N elementos E1, E2, ..., EN, ordenados de manera consecutiva es decir, el elemento Ek (que se denomina elemento k-ésimo) es previo al elemento Ek+1 Si la lista contiene 0 elementos se habla de una lista vacía. Operaciones: insertar un elemento en la posición k, borrar el k-ésimo elemento, buscar un elemento dentro de la lista y preguntar si la lista esta vacía.

Definición de la interfaz Define firma de las funciones (métodos) que realizarán esto Distintas clases implementarán esta interfaz usando diferentes estructuras de datos, pero deben respetar la firma El usuario puede usar cualquiera de ellas indistintamente ya que la sintaxis de las funciones será la misma Ejemplo para lista interface Lista { boolean estaVacia(); void insertar(Object x, Posicion k); Posición buscar(Object x); Object buscarK(Posición k); void eliminar(Object x); void eliminar(Posicion k); }

Implementación Se podría pensar en dos posibilidades: con arreglos y con lista enlazada Posición con arreglos sería entonces un entero (índice del lugar del elemento). Con lista enlazada sería un puntero (índice a lugar en la memoria) a0 a1 . . . an-1 . . . i n a0 a1 a1 an-1

Orden ¿ De qué orden son los métodos en una u otra implementación ? arreglo L. enlazada boolean estaVacia(); void insertar(Object x, Posicion k); Posicion buscar(Object x); Object buscarK(Posición k); void eliminar(Object x); void eliminar(Posicion k);

Eficiencia en una lista enlazada Se puede usar como posición la dirección en memoria del elemento anterior Se requiere una cabeza de lista Al tener la posición, insertar y eliminar un elemento es O(1) Buscar el elemento es siempre O(n)

Un iterador de TDA’s Para muchos TDA’s es útil definir un iterador, es decir, objeto que permita recorrer esta estructura Ej TDAx a = new TDAx(); //agregar elementos . . . Iterador b = new Iterador(a); while (b.notEmpty()) print(b.next(); La idea es que el iterador esconda también la impl. El iterador se define normalmente como una interfaz Mirar interfaz Iterator de Java

Un iterador de Lista con lista enlazada class IteradorLista implements Iterador { NodoLista actual; public IteradorLista(Lista n) { actual=n.primero; } poublic boolean notEmpty() { return actual != null; public Object next() { Object aux = actual.info; actual = actual.sig; return aux;

Estructuras de Datos: Árboles Colección de nodos organizados en forma recursiva: 0 nodos -> árbol esta vacío, Si no, un nodo denominado raíz, con 0 o más referencias a otros árboles (subárboles) Raíces de los subárboles se llaman hijos de la raíz, Raíz se llama padre de las raíces de sus subárboles

Definiciones (1) Los nodos sin hijos se denominan hojas. Dos nodos que tienen el padre en común se denominan hermanos. Un camino entre un nodo n1 y un nodo nk está definido como la secuencia de nodos n1, n2, ..., nk tal que ni es padre de ni+1, 1 <= i < k. El largo del camino es el número de referencias que componen el camino, que para el ejemplo son k-1. El camino desde un nodo del árbol a sí mismo es de largo 0.  Existe un único camino desde la raíz hasta cualquier otro nodo del árbol.

Definiciones (2) Un nodo n es ancestro de un nodo m si existe un camino desde n a m; Un nodo n es descendiente de un nodo m si existe un camino desde m a n. La profundidad del nodo nk es el largo del camino entre la raíz del árbol y el nodo nk. (profundidad de la raíz es siempre 0) La altura de un nodo nk es el máximo número de nodos en un camino desde nk hasta alguna hoja. (altura de toda hoja es 1) La altura de un árbol es igual a la altura de la raíz. La altura de un árbol vacío se define como 0.

Ejemplo A es la raíz del árbol y es padre de B, C y D. E y F son hermanos, puesto que ambos son hijos de B. E, J, K, L, C, P, Q, H, N y O son las hojas del árbol. El camino desde A a J (único) lo conforman los nodos A-B-F-J, largo = 3. D es ancestro de P, y por lo tanto P es descendiente de D. L no es descendiente de C, puesto que no existe un camino desde C a L. La profundidad de C es 1, de F es 2 y de Q es 4. La altura de C es 1, de F es 2 y de D es 4. La altura del árbol es 5 (número de nodos en el camino entre la raíz A y la hoja P o Q).

Arboles Binarios Un árbol binario es un árbol en donde cada nodo posee 2 referencias a subárboles (ni más, ni menos). En general, dichas referencias se denominan izquierda y derecha, y consecuentemente se define el subárbol izquierdo y subárbol derecho del árbol. class NodoArbolBinario { Object información; NodoArbolBinario izq; NodoArbolBinario der; }

Nodos internos y externos Los nodos en sí que conforman un árbol binario se denominan nodos internos, y todas las referencias que son null se denominan nodos externos. Propiedades de los árboles binarios Propiedad 1: Si se define i = número de nodos internos, e = número de nodos externos, entonces se tiene que: e = i+1 Demostración: inducción sobre i (ejercicio).

Propiedades de los árboles binarios Sea n = número de nodos internos. Se define: In = suma del largo de los caminos desde la raíz a cada nodo interno (largo de caminos internos). En = suma del largo de los caminos desde la raíz a cada nodo externo (largo de caminos externos). Se tiene que: En = In+2n Demostración: inducción sobre n (ejercicio).

Propiedades de los árboles binarios ¿Cuántos árboles binarios distintos se pueden construir con n nodos internos? ¿bn? Por ejemplo: b4 = b0*b3 + b1*b2 + b2*b1 + b3*b0 = 5 + 2 + 2 + 5 = 14. Este tipo de ecuaciones se puede resolver y la solución es la siguiente: La serie de numeros que genera bn se conoce como números de Catalan. Asintóticamente:  n   bn   0  1  2  3  5

Ejemplo: árboles de expresiones matemáticas En un árbol de expresiones las hojas corresponden a los  operandos de la expresión (variables o constantes), y los nodos restantes a operadores. Como los operadores matemáticos son binarios, un árbol de expresiones resulta ser un árbol binario. Un árbol de expresiones se puede evaluar de la siguiente forma: Si la raíz del árbol es una constante o una variable se retorna el valor de ésta. Si la raíz resulta ser un operador, entonces recursivamente se evalúan los subárboles izquierdo y derecho, y se retorna el valor que resulta al operar los valores obtenidos de las evaluaciones de los subárboles con el operador respectivo.

Recorridos de árboles binarios Existen tres formas principales para recorrer un árbol binario en forma recursiva. Estas son: Preorden: raíz - subárbol izquierdo - subárbol derecho. Inorden: subárbol izquierdo - raiz - subárbol derecho. Postorden: subárbol izquierdo - subárbol derecho - raíz. Por ejemplo, al recorrer el árbol de expresiones anterior en pre-orden se obtiene: * + a b - c d Al recorrer el árbol en in-orden se obtiene: a + b * c – d Al recorrer el árbol en pos-torden se obtiene: a b + c d - * La expresión que se obtiene con el recorrido en postorden se conoce como notación polaca.

Árboles generales Los nodos tienen un número indeterminado de hijos. La implementación: un nodo tiene dos referencias, una a su primer hijo y otra a su hermano más cercano. La raíz del árbol necesariamente tiene la referencia a su hermano como null. Un árbol general puede representarse como un árbol binario, con la salvedad que el hijo derecho de la raíz es siempre null. la raíz tiene hermanos, lo que se conoce como bosque, entonces se tiene que el conjunto de los bosques generales es isomorfo al conjunto de los árboles binarios. Las propiedades vistas en árboles binarios se cumplen en árboles generales.