Está en la página 1de 122

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

INTRODUCCION A LAS ESTRUCTURAS DE DATOS

1.1 Abstraccin Trminos simples: Es un proceso mental, mediante el cual se extraen los rasgos esenciales de algo para representarlos por medio de un lenguaje grfico o escrito. Debido a que es un proceso mental es una accin subjetiva y creativa es decir: depende del contexto psicolgico de la persona que la realiza. Trminos de la POO: Constituye un principio de la POO que: Enfatiza en detalles que son significativos y que suprime otros detalles que son por el momento irrelevantes. Denota las caractersticas esenciales de un objeto que lo distinguen de todas las otras clases de objetos. 1.2 Importancia de la abstraccin Dato: unidad bsica de la informacin, que por lo general por si solo no dice nada. Informacin: es el conocimiento que puede comunicarse, generalmente es el conjunto de datos pero que tienen relacin y que tienen sentido; La abstraccin: es una tcnica o metodologa que permite disear o modelar Estructuras de Datos, Consiste en representar bajos ciertos lineamientos de formato las caractersticas esenciales de una Estructura de Datos. Su importancia radica en que la abstraccin es una capacidad para modelar una realidad por medio de herramientas computacionales. 1.3 Estructuras de Datos Cualquier coleccin o grupo de datos organizados, de tal forma que tengan asociados un conjunto de operaciones para poder manipularlos. La mayora de lenguajes de programacin de alto nivel disponen de tipos de datos estructurados o estructuras de datos predefinidas. Ejemplo: Arreglos, que no son ms que un conjunto de datos, todos del mismo tipo, con una organizacin lineal y con mtodos claros de acceso a travs de sus subndices. Las operaciones tradicionales son: comparacin, asignacin, escritura, lectura.

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

Tipos de Estructuras Hacen referencia a un solo valor a la vez. Ocupan una sola casilla de memoria Pueden ser: Entero, real, lgico carcter (donde: su tamao depende del Lenguaje de Programacin).

SIMPLES

COMPUESTAS

Se caracteriza por el hecho de que con un nombre se hace referencia a un grupo de casillas de memoria es decir sta estructura est formada: Por uno o varios datos simples. Por uno o varios datos compuestos. Porque pueden tener algn tipo de comportamiento (mtodos).

ED:Estructura de almacenamiento + Operaciones de manipulacin (mtodos). Clasificacin de las Estructuras de Datos


ESTATICAS Tienen una cantidad fija de memoria principal Delimitan el espacio que ocupan en memoria en tiempo de compilacin Ejemplo: Arreglos o Arrays, Cadenas // declaracin int [ ] A; // crea un arreglo con 10 nmeros // enteros A = new int [ 10 ] ; DINAMICAS No tienen limitacin en el tamao de memoria principal ocupada El espacio de memoria a ocupar se determina en tiempo de ejecucin Ejemplo: listas, rboles, grafos, etc. public class Nodo{ // Atributos private int dato; private Nodo sig; // Constructor public Nodo (Nodo ns){ sig = sig; } // Mtodos a implementar para la // clase Nodo }

TDA: Tipo de Dato Abstracto: Es el modelo, junto con varias operaciones definidas sobre el modelo, con lo que se representa a la estructura y el comportamiento del mundo real. El TDA, especifica el Qu? ms no el Cmo?

1.4 Tipo de Dato Abstracto ( T.D.A) TDA es un modelo matemtico de estructuras de datos que especifica los tipos de datos almacenados, las operaciones definidas sobre esos datos y los tipos de los parmetros de esas operaciones.

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

Un TDA define lo que cada operacin debe hacer, ms no como lo debe hacer. En un lenguaje de programacin como Java un TDA puede ser expresado por una interface, que es una simple lista de declaraciones de mtodos. Un TDA es materializado por una estructura de datos concreta, en Java, es modelada por una clase. Una clase define los datos que sern almacenados y las operaciones soportadas por los objetos que son instancia de la clase. Al contrario de la las interfaces, las clases especifican como las operaciones son ejecutadas (Implementacin). La tcnica de la abstraccin de datos establece que al disear una nueva Estructura de Datos pasa a ser un TDA que luego podr ser implementado en cualquier lenguaje de programacin. Especificacin lgica de un TDA Es un documento en el que se plasma la abstraccin realizada al disear una Estructura de Datos y a partir del cual se implementa la Estructura de Datos. En dicho documento se definirn claramente todas las reglas en las que podr usarse el TDA Partes: 1. Elementos que conforman la Estructura de Datos Describe el tipo de los datos individuales que guardara la estructura. Ejemplo: nmeros enteros, nmeros reales, caracteres, fechas, registro con los datos de un empleado. Tipo de organizacin en que se guardara los elementos Lineal: Si hay una relacin de uno a uno entre los elementos. (Arreglos) Jerrquica: Si hay una relacin de uno a muchos entre los elementos. (Arboles)

2.

Red: Relacin de muchos a muchos entre los elementos (grafos)

Sin relacin: Si no hay relacin entre los elementos

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

3.

Dominio de la estructura (opcional) Se describir la capacidad de la estructura de datos en cuanto al rango posible de datos por guardar. Descripcin de las operaciones de la estructura Para cada operacin se debe considerar los siguientes puntos: Nombre de la operacin Descripcin breve de su utilidad Datos de entrada a la operacin Datos que generan como salida la operacin Precondicin: condicin que debe cumplirse ANTES de utilizar la operacin para que se ejecute sin problemas. Postcondicion : condicin en que queda el TDA DESPUES de ejecutar la operacin. Definir claramente la especificacin lgica del TDA, facilita la implementacin y aplicacin de la Estructura de Datos. Importante: Averigua varios ejemplos de aplicaciones dentro del campo informtico, donde se identifique a una estructura de datos y el tipo de organizacin en su implementacin INVESTIGA..!!!

4.

1.5 Niveles de abstraccin de datos 1.- Nivel (Lgico o abstracto) Corresponde a la especificacin lgica del TDA. En este nivel se define abstractamente a la Estructura de Datos y las operaciones relacionadas con ella, independientemente del lenguaje de programacin en el que se implemente o utilice la Estructura. 2.- Nivel (Fsico o de Implementacin) Se decide el lenguaje de Programacin en el que se va a implementar la estructura de datos. As como los tipos de datos ya definidos en el lenguaje de programacin servirn para representar a la estructura. y luego se implementa cada una de las operaciones diseadas en el TDA 3. Nivel de Aplicacin o de Uso: El programador usar el TDA para resolver determinadas aplicaciones, el uso del TDA se limita a llamar a las operaciones sobre la estructura que se requiera cuidando siempre de cumplir las reglas de cada operacin especificadas en el nivel lgico. Analiza: Identifica los niveles de abstraccin en el siguiente ejemplo de la vida real como lo es: Construir un edificio. Piensa en otros casos ms, comenta con tus compaeros y con tu profesora !!!

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

Ventajas de utilizar la Tcnica de Abstraccin de Datos Se tiene una implementacin ms clara, documentable y fcil de darle mantenimiento. Debido a la independencia de datos, se puede crear paquetes como unidades de software reutilizable, con los que se obtienen Estructuras de Datos genricas. Facilita y hace ms rpido el desarrollo de aplicaciones.

Ejemplo de TDA: En un sistema bancario las cuentas de cheques de los clientes pueden considerarse objetos. Todos ellos pertenecen a una cuenta llamada CUENTA _CHEQUES que definen para cada instancia los siguientes datos: Numero de la cuenta. Nombre del cliente. Sucursal donde se abri la cuenta. Saldo de la cuenta. Y las siguientes Operaciones Abrir cuenta Deposito Retiro Consultar saldo A continuacin elaboramos la especificacin lgica que contienen los siguientes puntos:
TDA: CUENTA _CHEQUES. 1.- Elementos que conforman la estructura de datos Nmero de cuenta cadena Nombre del cliente cadena Sucursal donde se abri cadena Saldo de la cuenta real 2.- Tipo de organizacin. El tipo de organizacin es lineal entre los nmeros de cuentas 3.- Dominio Existe entre 0 y 10000 cuentas, el dominio ser todos aquello nmeros que se ubiquen dentro del rango establecido. 4.- Descripcin de las operaciones ABRIR_CUENTA: Utilidad: Esta operacin se ejecutar al crear un objeto de la clase CUENTA_CHEQUES, e implica solicitar por teclado los datos correspondientes para guardarlos en los atributos del objeto y colocar el valor de cero al saldo inicial. Datos de entrada:Nombre del cliente, Nombre de la sucursal, (Saldo inicial de la cuenta ser cero) Datos de salida: Nmero de cuenta Precondiciones: Ninguna Postcondiciones: Los datos ingresados sern guardados en los atributos correspondientes del objeto. DEPOSITAR Utilidad: Agrega la cantidad especificada al saldo de la cuenta. Datos de Entrada: Monto a depositar Datos de Salida: Saldo disponible aumentado Precondiciones: Nmero de la cuenta exista Que la cantidad a depositar sea mayor a cero Postcondiciones: Saldo de la cuenta agregado la cantidad especificada RETIRAR

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

Utilidad: Quita al saldo de la cuenta la cantidad espeficada, validando que sea posible retirar esa cantidad. Datos de Entrada: Monto a retirar Datos de Salida: saldo disponible disminuido Precondiciones: Que el nmero de cuenta exista Que el saldo disponible sea mayor que la cantidad especificado para el retiro. Postcondiciones: saldo disponible disminuido en la cantidad especificada CONSULTAR_SALDO Utilidad: Mostrar en pantalla el saldo de la cuenta correspondiente Datos de Entrada: Nmero de cuenta Datos de Salida: Saldo disponible Precondiciones: Exista el nmero de cuenta Postcondiciones: Ninguna

1.6 Representacin de una estructura de datos Puede entenderse como el punto de conexin entre la especificacin lgica de una TDA y su implementacin en un lenguaje de programacin particular. Dentro del proceso de abstraccin de datos la representacin de una estructura corresponde al inicio del segundo nivel de abstraccin es decir el nivel fsico. Constituye un esquema de cmo se almacenarn los elementos de la Estructura de Datos, en la memoria de tal forma que se logre su ptimo aprovechamiento. Tipos de representaciones para una Estructura de Datos Independientemente de las facilidades de implementacin que ofrezcan los lenguajes de programacin, una Estructura de Datos puede representarse de dos formas:
Almacenamiento contiguo

1. Por posiciones Tipos 2. Por ligas

Almacenamiento disperso

1. Representacin de una estructura de datos por posiciones El lugar fsico donde se almacena un elemento determina automticamente su posicin relativa en la estructura de datos. Se podra considerar como un espacio de almacenamiento contguo donde: cada lugar sirve para almacenar un elemento. Un elemento esta en un lugar K, por lo tanto

Tendr la ksima posicin dentro de la estructura

El elemento K+1 estar despus de K por lo tanto se almacenar en el lugar k+1 del espacio de almacenamiento.

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

1 2 K K+1 N

Elemento 1 Elemento 2 Elemento k Elemento k+1 Elemento N

Existe una relacin lineal Elemento 1 pos 1 Elemento 2 pos 2 . Elemento N pos N

Herramientas en los lenguajes de programacin para desarrollar una representacin por posiciones Todos los lenguajes de programacin proveen al programador de herramientas tiles para representar Estructuras de Datos en forma contigua, ms conocidas como estructuras de datos implcitas del lenguaje. 1. Arreglos de elementos uniformes.- Solo almacenan un conjunto de elementos de un mismo tipo simple enteros, reales, cadenas o tipos compuestos registros con elementos de diferentes tipos 2. Registros de elementos de diversos tipos.- Permiten definir estructuras que contienen valores de diferentes tipos, almacenados como si fuera unidad. 3.- Archivos Secuenciales.- el almacenamiento es contiguo, son similares a los arreglos, permiten almacenar un conjunto de elementos aunque lo hace en la memoria secundaria. Ventajas Fcil implementacin. Rapidez de recorrido, debido a que la direccin de cada elemento est implcita en su posicin fsica. Desventajas Al realizar manipulaciones de los elementos o Al agregar un nuevo elemento en algn lugar que no sea el ltimo, se tiene que desplazar los elementos hacia abajo que estn despus de la posicin de insercin deseada logrando que se genere un espacio para poder agregar un nuevo elemento. o Al borrar un elemento que no sea el ltimo deja un espacio no permitido entre los elementos, para lo cual se tiene que desplazar una posicin hacia arriba los elementos, que estn despus del elemento borrado. 2. Representacin de una estructura de datos por ligas En este tipo de representacin la ubicacin fsica de un elemento no determina la posicin relativa que tiene dentro de la Estructura de Datos. El almacenamiento se realiza en forma dispersa: dos elementos contiguos en la Estructura de Datos no necesariamente deben estar almacenados fsicamente en posiciones contiguas dentro del espacio de almacenamiento. 1 2 Elemento k Dir k+1 Almacenamiento disperso

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

K K+1

Elemento 1

Dir 2

Lista Uno: Elemento k, el que sigue est en la direccin Dir k+1, que es el Elemento 1, el que sigue est en la Dir 2 que es nula. Lista Dos. Elemento k+1, el que sigue tiene direccin Nula Dir k+2

Elemento k+1

Dir k+2

En necesario que cada elemento almacene la direccin fsica donde se ubica el elemento que le sigue en el Estructura de tal forma que puedan mantener una relacin en donde est cada uno de los elementos. Caractersticas 1.- La posicin fsica del elemento no determina la posicin relativa dentro de la Estructura de datos. 2.- El almacenamiento se realiza en forma dispersa. 3.- Es necesario que cada elemento almacena la direccin fsica del siguiente elemento. 4.- Cada elemento debe contener 2 o ms campos (dato y direccin). Ventajas 1.- La representacin no es exclusiva debido a que mantiene una organizacin lineal 2.- Posibilidad de agregar y eliminar elementos de la estructura, sin tener que desplazar los elementos que ya estaban en ella. 3.- Permite un uso ms eficiente del espacio de almacenamiento ya que puede crecer o decrecer en tiempo de ejecucin, segn requiera el usuario. Desventajas 1.- Cada elemento deber recordar donde est alguno de los elementos, cada espacio es un elemento compuesto por (dato y la direccin del siguiente elemento). 2.- Las operaciones requieren mayor tiempo de procesamiento, debido a que el acceso no es directo, se requiere realizar un recorrido hasta encontrar el elemento deseado. Herramientas en los Lenguajes de Programacin para desarrollar una Representacin por Ligas En la mayora no existen herramientas predefinidas, por lo tanto es el programador implementa las estructuras. Se recomienda el uso de apuntadores, un apuntador se define como un tipo capaz de almacenar una direccin de memoria, se considera como una referencia indirecta a un elemento.

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

ESTRUCTURAS DE DATOS BSICAS

2.1 Cadenas o Strings Cadena: Es una secuencia finita de smbolos tomados como un conjunto de caracteres (letras, nmeros, caracteres especiales). Strings: Internamente es un arreglo de caracteres, dependiendo del lenguaje de Programacin generalmente se considera el inicio de la cadena en la posicin 0. La importancia del String radica en que la mayor parte de la informacin que se maneja actualmente en casi cualquier rea del conocimiento puede verse como una secuencia de caracteres. Ejemplo: el nombre de una persona, el nombre del un libro, la informacin de un texto son vistas como cadenas de caracteres. Conceptualizacin de un String como un TDA Se puede disear muchos TDA, que definen una String considerando que operaciones se tomarn como bsicas para el funcionamiento de dicha estructura y cul ser el conjunto de caracteres que aceptarn como parte de l.
TDA: String Elementos: Conjunto de letras maysculas y minsculas, caracteres especiales y dgitos. Estructura: Existe una relacin lineal, debido a que se considera como una cadena de caracteres. Dominio: Suponiendo que los Strings pueden almacenar entre 0 y 80 caracteres, su dominio ser el conjunto de todas las cadenas que puedan formar con la combinacin de elementos de esa longitud. Operaciones: INICIALIZAR Utilidad: Nos sirve para definir el espacio a ocupar en la memoria por el string. Datos de entrada: Tamao de memoria para el String Datos de salida: El string S es nulo (esta vacio) Precondicin: Ninguna Postcondicin: el String S es nulo. INSERTAR_CARCTER_AL_FINAL Utilidad: aadir un carcter al final Datos de entrada: String S y la letra L que se insertar al final de S. Datos de salida: String S modificado Precondicin: El numero de letras en S es menor que 80. Postcondicin: el string S tiene una letra ms en el extremo derecho BORRAR_ CARCTER_AL_INICIO Utilidad: Permite borrar un carcter al inicio del String Datos de entrada: String S al que se le borrara la primera letra Datos de salida: String S modificado Precondicin: el String S exista y no sea nulo Postcondicion: el String S tiene una letra menos en el extremo izquierdo CONCATENAR Utilidad: Unir dos Strings S1 y S2 Datos de entrada: Strings S1 y S2. Datos de salida: String S1 modificado. Precondicin: La suma de la longitud de S1 y S2 debe ser menor que 80. Postcondicin: A string S1 se le agrega todos los caracteres de s2(en el extremo derecho); s2 no se modifica. BUSCAR_SUBSTRING Utilidad: Buscar un Substring S2 en S1 Datos de entrada: Strings S1 y S2. Datos de salida: verdadero si S2 est contenida en S1, falso en caso contrario Precondicin: S1 y S2 existan Postcondicin: ninguna

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

10

OBTENER_ CARACTER Utilidad: Sirve para encontrar un carcter dentro del String Datos de entrada: String S donde se desea conocer cierto carcter y la posicin i del carcter que se desea conocer. Datos de salida: Carcter que se encuentra en la posicin i del String S Precondicin: El String S no sea nulo e i debe ser un valor entre 1 y la longitud de S Postcondicin: Ninguna VERIFICA_VACIO Utilidad: Sirve para verificar si una cadena o String est vaca o no Datos de entrada: String S que ser verificado Datos de salida: Verdadero si el String S no tiene caracteres y Falso en caso contrario. Precondicin: Ninguna. Postcondicin: Ninguna. VERIFICAR_LLENA Utilidad: Sirve para verificar si una cadena est llena o no Datos de entrada: String S que ser verificado Datos de salida: Verdadero si la cadena o String S contiene 80 caracteres y Falso en caso contrario Precondicin: Ninguna Postcondicin: Ninguna INVIERTE Utilidad: Sirve para invertir el orden de los caracteres de un String. Datos de entrada: String S1 a invertir Datos de salida: String S2 Precondicin: la secuencia de la cadena S se invierte, de forma que el primer carcter toma el lugar del ltimo, el segundo del penltimo y as sucesivamente. Postcondicin: El String S1 cambia sus caracteres y se convierte en String S2

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

11

Representacin del TDA String. Se puede almacenar en la memoria mediante almacenamiento contiguo y tambin podr utilizarse el almacenamiento no contiguo.
1. Uso de un Carcter Centinela Los caracteres se almacenan en un arreglo con longitud predefinida. Se delimitan por un carcter especial, denominado Centinelaequivale a un carcter nulo en la mayora de los lenguajes de programacin \0. MARTES\00 C O N T I G U O Desventaja. El carcter centinela ocupar un espacio dentro del String. No se conoce la longitud del String por lo que se debera programar un mtodo que permita realizar dicha operacin. Los lenguajes de programacin que utilizan este tipo de almacenamiento son: C Y C++. 2. Almacenamiento de la longitud del String Los elementos del String se almacenan en un arreglo de longitud predefinida. La Longitud actual del String se almacenan en la posicin 0 y no forma parte del String. max
ASCII6MARTES....

A L M A C E N A M I E N T O

5...n

5 6

N Desventaja. Debido a que la longitud ocupa una posicin de un carcter la longitud se restringe a 265. El lenguaje de programacin que utiliza este tipo de almacenamiento es el Pascal.

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

12

1. Lista encadenada de nodos con un caracter Genera una lista encadenada donde cada nodo almacena un solo carcter y la direccin del siguiente nodo de la lista. M A L M A C E N A M I E N T O N O C O N T I G U O Ventaja. Puede generar Strings de longitud infinita. Desventaja. Desperdicio del 80% en la memoria debido al almacenamiento en tantas direcciones de nodos. 2. Lista encadenada de nodos con N caracteres Genera una lista encadenada donde cada uno de los nodos almacena N caracteres, del String (N>1) y la direccin donde se encuentra el siguiente nodo. UNIVERS IDAD NA CIONAL DE LOJA A R T E S

Ventajas. Genera Strings de longitud infinita y se disminuye el desperdicio de memoria. Desventajas. La implementacin de sus operaciones es ms compleja, ya que la informacin contenida en el String est almacenada en forma de substrings. EJERCICIOS PROPUESTOS

1. Cree un mtodo que permita generar y presentar la letras del alfabeto maysculas separadas por un guin 2. Cree un mtodo que permita contar el nmero de letras A que existen dentro de una cadena. 3. Cree un mtodo que permita contar el nmero de letras maysculas que existen dentro de una cadena. 4. Cree un mtodo que permita contar el nmero de palabras que existe dentro de una frase. 5. Cree un mtodo que permita cambiar de maysculas a minsculas y viceversa

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

13

2.2

Arreglos Unidimensionales (Arrays) Analiza: Se tienen las notas de un grupo de 90 estudiantes y necesitamos saber cuntos de estos estudiantes tienen tienen una nota superior al promedio del grupo. Cmo podramos resolver este problema?.... Piensa en varias soluciones, comenta con tus compaeros y con tu profesora..!!!

Qu es un arreglo Unidimensional? Es un tipo de dato estructurado, est formado por una coleccin finita y ordenada de datos del mismo tipo. Adems de conoce como una estructura natural, que es utilizada para modelar lista de elementos iguales, donde el tipo de acceso es DIRECTO debido al uso de un ndice que indica la posicin relativa del elemento dentro de la Estructura de Datos y adems porque para acceder a cada elemento se lo hace directamente sin tener que consultar elementos anteriores o posteriores. Representacin en memoria. 100 101 102 103 104 A[0] A[1] A[2] A[3] A[4] . . . .

TDA: ARREGLO. Elementos: Nmeros enteros. Estructura: Lineal entre los elementos del arreglo. Dominio: Los datos o elementos posibles a guardar estarn en el rango de 0-20 nmeros. Operaciones: OBTENER Utilidad: Regresa el elemento del arreglo A, que tiene un rango r. Datos Entrada: ndice i Datos Salida: elemento e Precondiciones: elemento e, este guardado dentro del arreglo A. ndice i sea < rango. Postcondiciones: se produce una condicin de error si el ndice i<0 o si i > N-1, donde n es la cantidad actual de elementos. AGREGAR Utilidad: Colocar un elemento e, en el arreglo A del rango r. Datos Entrada: el elemento nuevo e Datos Salida: El arreglo A con un elemento mas Precondiciones: haya espacio en el arreglo

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

14

Postcondiciones: El arreglo con un elemento agregado. MODIFICAR Utilidad: Sustituir el elemento e del arreglo A de rango r en el ndice i. Datos Entrada: elemento ea, y el nuevo elemento ne Datos Salida: mensaje Precondiciones: El arreglo este creado y no este vacio Post condiciones: Se produce un mensaje de error, si el elemento no se encuentra en el arreglo. ELIMINAR Utilidad: quitar el elemento e del arreglo A de rango r en el ndice i. Datos Entrada: elemento e Datos Salida: mensaje indicando que la operacin ha tenido xito. Precondiciones: el arreglo no este vacio y que el elemento se encuentre en el arreglo Postcondiciones: Se produce un mensaje de error, si el elemento no se encuentra en el arreglo.

Representacin de Arreglos

Manejo de arreglos en Java. Los arreglos son considerados como objetos cuyo tamao se determina en tiempo de compilacin y no puede ser modificado en tiempo de ejecucin. Pueden contener. Tipos de datos (int, char, boolean, float) Objetos de clases (los del API, o los definidos por el usuario). Se hace uso del operador [ ]. Dispone de una funcin miembro para consultar la longitud de arreglo length. Declaracin de un arreglo. <tipo dato/clase> [ ] identificador; <tipo_dato/clase> identificador [ ]; Ejemplos: String [ ] das_Semana; int [ ] edades_Estudiantes; double [ ] notas; char [ ] vocales; boolean [ ] productos disponibles. Creacin de los arreglos. Reservar el espacio en memoria y se requiere de un constructor que es el operador (new). dias_Semana = new String[7];

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

15

edades_Estudiantes = new int[20]; notas = new double[10]; vocales = new char[5]; Se puede declarar y crear el arreglo: Declarar y crear un arreglo vacio. String [ ] das_Semana=new String [7]; O tambin: declarar y crear un arreglo con valores inciales. int [ ] edades_Estudiantes={15,20,23,18};

Errores. 1. Crear arreglos estticos en tiempo de compilacin. int [4]edades; 2. Asignar valor a un arreglo sin haber determinado su tamao. int [ ] edades; edades [0]=15;

Principales Operaciones 1. Lectura Saber el contenido o el valor del arreglo de una determinada posicin. Ejemplo. int [ ] edades={15,18,20,25}; Sintaxis: Nombre_Arreglo[subindice]; edades[3]; retorna el 25 ya que est en la posicin 3. 2. Escritura y actualizacin Sintaxis: Nombre_Arreglo[subndice]=valor; Edades [1]=28; Ejemplo de actualizacin de la posicin 1. 3. Presentacin de los elementos arreglos. Se lo hace a travs de un recorrido. for(int i<0;i<edades.length;i++){ System.out.println(edades [i]); }
Recuerda: Java utiliza los siguientes api: Vector, Collection, Array que son clases y/o interfaces que permiten almacenar cualquier clase de objetos como elementos y que pueden ser usados independientemente como unidimensionales o multidimensionales.

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

16

EJERCICIOS PROPUESTOS 1. Crear un mtodo que rellene un arreglo con los nmeros enteros comprendidos entre 2 y 20. 2. Escriba un mtodo que rellene un arreglo con los nmeros pares comprendidos entre 1 y 40. 3. Escribir un mtodo, que rellene un arreglo con diez nmeros enteros consecutivos a partir de un nmero pasado como parmetro y haga una copia de ese arreglo en otro. 4. Escribir un mtodo, que permita ingresar por teclado diez elementos en un arreglo, determine la posicin del arreglo en la que se encuentra el mximo valor de los elementos ingresados. 2.3 Arreglos Bidimensionales (Matrices) Analiza: Se requiere representar el nmero de accidentes mensual por regin del Ecuador Cmo podramos resolver este problema?.... Piensa en varias soluciones, comenta con tus compaeros y con tu profesora..!!! Qu es un arreglo bidimensional? Un arreglo bidimensional es un conjunto de datos homogneos finito y ordenado donde se hace referencia a cada elemento por medio de dos ndices: rengln (fila) y columna. Arreglos bidimensionales ms conocidos como matrices (mxn), donde m representa a las filas y n a las columnas. Tambin conocidos como arreglos de arreglos, su manipulacin es similar a los arreglos unidimensionales sin acceso directo la nica variacin es que se requiere tantos ndices como dimensiones se tengan. Para calcular el nmero de elementos que estn en la Matriz se realiza la siguiente operacin: ne=n elementos1* n elementos2* n elementos n. ne=m*n ne=3*2 ne=6. Representacin de una matriz MATRIZ FILAS 0 1 2 COLUMNAS 0 1
P(0,0) P(1,0) P(2,0) P(0,1) P(1,1) P(2,1)

2
P(0,2) P(1,2) P(2,2)

.. N
p(0,N-1) p(1,N-1) p(2,N-1)

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

17

P(M,0)

P(M,1)

P(M,2)

p(M-A,N-1)

Manejos de Arreglos Bidimensionales (Matrices) Declaracin: <Tipo/Clase> [ ][ ]identificador; double [ ][ ]x; Creacin: 1. 2. Un arreglo bidimensional vacio: double [ ][ ]x=new double[3][2]; Con valores iniciales double [ ][ ]x={{1.0,2.0},{6.0,5.0},{10.0,8.0}};

Operaciones Bsicas
1.

Lectura: Obtener un elemento contenido en la matriz: double r = x [1][1]=5; Modificacin: Actualizar al elemento: x [2][0]=4.0; Presentacin: Utilizar un ciclo repetitivo que recorre las filas(i); y otro ciclo anidado que recorre a las columnas(j). for(int i=0; i<n;i++){ for(int j=0;j<n;j++){ System.out.println(x[i][j]); } }

2.

3.

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

18

EJERCICIOS PROPUESTOS Implementar la clase Matriz


Matriz + n: entero //dimensin de la matriz - x[ ][ ]:doubl // array bidimensional //constructores + Matriz(n: entero) + Matriz(x [ ][ ]double) //mtodos de la clase Matriz + suma(a: Matriz,b Matriz): Matriz + resta(a: Matriz,b Matriz): Matriz + multiplicacion(a: Matriz,b Matriz): Matriz + productoEscalar(double,a: Matriz): Matriz + transpuesta(a: Matriz): Matriz + sumaDiagonal(): double +sumElemSobDiagonal():double +sumElemBajoDiagonal():double +triBaseSup(Matriz a):double +triBaseInf(Matriz a):double +triBaseIzq(Matriz a):double +triBaseDer(Matriz a):double +triVerticeSup(Matriz a):double +triVerticeInf(Matriz a):double +triVerticeIzq(Matriz a):double +triVerticeDer(Matriz a):double +Rombo(Matriz a):double +Arbol(Matriz a):double +Reloj(Matriz a):double
IMPLEMENTACIONDELACLASEMATRIZ

publicclassMatriz{ /**Miembrosdato*/ publicintn;//dimension privatedouble[][]x;//Arraybidimensional //Constructores publicMatriz(intn){ this.n=n; x=newdouble[n][n]; for(inti=0;i<n;i++){ for(intj=0;j<n;j++){ x[i][j]=0.0; } } } publicMatriz(double[][]x){ this.x=x; n=x.length; } //ParamostrarlosdatosredefinimoslafunciontoString //delaClasebaseObjectdelacualderivaimplicitamenteMatriz publicStringtoString(){ Stringtexto="\n"; for(inti=0;i<n;i++){

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

19

for(intj=0;j<n;j++){ texto+="\t"+(double)Math.round(1000*x[i][j])/100; } texto+="\n"; } returntexto; }

2.4

Conjuntos Analiza: Cmo sera el proceso que se aplican los motores de bsqueda de Informacin en Internet? Piensa en varias soluciones, comenta con tus compaeros y con tu profesora..!!!

Es una coleccin de elementos del mismo tipo cuyo orden y cantidad de repeticiones es observada. Entre sus principales caractersticas tenemos: Es un contenedor de objetos distintos No hay elementos duplicados En la implementacin de la estructura conjunto el ordenamiento juega un papel muy importante
TDA CONJUNTOS Elementos: Puede ser cualquier tipo de objetos (elementos diferentes). Estructura: Tiene una estructura lineal entre los objetos del conjunto. Dominio: Son todos los datos posibles a guardar dentro del rango definido por el usuario en relacin con el tipo de aplicacin de la estructura. OPERACIONES: UNION : AB= { x A o x B } Utilidad: Que se reemplaza en A con la unin A y B, esto es ejecutar A AB . O se puede crear un nuevo conjunto C. Datos de Entrada: Dos conjuntos { }A, { }B. Datos de Salida: El conjunto {}A modificado o tambin puede ser un nuevo conjunto {}C. Precondiciones: Que el conjunto {}A, y {}B existan. Postcondiciones: El conjunto {}A o el {}C contiene los elementos de la unin INTERSECCION:

AB= { x A y xB }

Utilidad: Se reemplazar en {}A con la interseccin del conjunto A y B, esto es ejecutar A AB . O se puede crear un nuevo conjunto C. Datos de Entrada: Dos conjuntos { }A, { }B. Datos de Salida: El conjunto {}A modificado o tambin puede ser un nuevo conjunto {}C. Precondiciones: Que el conjunto {}A, y {}B existan. Postcondiciones: El conjunto {}A o el {}C contiene los elementos de la intersecsin. DIFERENCIA:

AB= { x A y xB }

Utilidad: Reemplaza en A con la diferencia A y B, esto es ejecutar A AB . O se puede crear un nuevo conjunto C. Datos de Entrada: Dos conjuntos { }A, { }B. Datos de Salida: El conjunto {}A modificado o tambin puede ser un nuevo conjunto {}C. Precondiciones: Que el conjunto {}A, y {}B existan. Postcondiciones: El conjunto {}A o el {}C contiene los elementos de la diferencia del conjunto {}A, y {}B.

En algunos lenguajes de programacin stas operaciones se realizan sobre el primer conjunto o sea el conjunto A se

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

20

definir a stas operaciones sin alterar al conjunto A, devolviendo en un nuevo conjunto que podra ser el conjunto C. Manipulacin de conjuntos en Java En el api de Java encontramos, el paquete Java.util que incluye la interfaz SET, que nos permite manipular conjuntos de elementos y tiene como caractersticas las siguientes: Un conjunto no puede contener elementos duplicados Incluye mtodos parecidos a los definidos en el TDA mencionado anteriormente. A continuacin se muestra: Correspondencia entre TDA CONJUNTO y la Interfaz Java.util.Set TDA CONJUNTO Unin Interseccin Diferencia Interfaz Java.util.Set addAll (collection c):boolean retainAll(collection c):boolean removeAll(collection c):boolean

Ejemplo de representacin de la operaciones bsicas(insercin y eliminacin); operaciones con subconjuntos y las operaciones entre conjuntos(Unin, Interseccin y Diferencia) de la Estructura Conjunto en Java
MODELADO
Conjunto +a: SortedSet //Constructor +Conjunto() +getA():SortedSet +setA(a:SortedSet):void //metodos de Conjunto +inserta(e:Object):void +elimina(e:Object):void +subconjuntosup(e:Object):SortedSet +subconjuntoinf(e:Object):SortedSet +subconjuntoentre(Object ei, Object ef):SortedSet +union(SortedSet a, SortedSet b):SortedSet +interseccion(SortedSet a, SortedSet b):SortedSet +diferencia(SortedSet a, SortedSet b):SortedSet

IMPLEMENTACION DE CONJUNTO
importjava.util.*; publicclassConjunto{ publicSortedSeta; publicConjunto(){ a=newTreeSet(); } publicSortedSetgetA(){ returna; } publicvoidsetA(SortedSeta){ this.a=a; }

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

21

publicvoidinserta(Objecte){ if(a.add(e)==false){ System.out.println("Elemento:"+e+"repetido!!..Nosepudoinsertar"); } } publicvoidelimina(Objecte){ if(a.remove(e)){ System.out.println("Elemento:"+e+":hasidoeliminado"); }else{ System.out.println("Noexisteelelementoaeliminar"); } } publicSortedSetsubconjuntosup(Objecte){ SortedSetb=newTreeSet(); b=a.tailSet(e); returnb; } publicSortedSetsubconjuntoinf(Objecte){ SortedSetb=newTreeSet(); b=a.headSet(e); returnb; } publicSortedSetsubconjuntoentre(Objectei,Objectef){ SortedSetb=newTreeSet(); b=a.subSet(ei,ef); returnb; } publicSortedSetunion(SortedSeta,SortedSetb){ a.addAll(b); returna; } publicSortedSetinterseccion(SortedSeta,SortedSetb){ a.retainAll(b); returna; } publicSortedSetdiferencia(SortedSeta,SortedSetb){ a.removeAll(b); returna; } }

2.5 Archivos o ficheros La estructura de datos tipo archivo (ficheros) es la nica estructura de datos que se almacena en memoria secundaria o externa (disco o cinta). Un archivo de datos es una estructura constituida simplemente por colecciones de datos que se pueden guardar, para uso posterior mediante la ejecucin de programas adecuados. Otra caracterstica importante de los archivos es que permite almacenar gran cantidad de informacin. Esta coleccin de datos sirve para la entrada y salida a la computadora y se maneja con un programa en contraste con archivos y registros, el tamao de esta coleccin no es fija y est limitada solo por la cantidad de memoria secundaria (disco o cinta) disponible. Es decir, los archivos son dinmicos, esto es que se pueden hacer archivos de datos ms grandes o ms pequeos segn sean las necesidades.

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

22

Los archivos no estn limitados por la memoria donde estn contenidas las estructuras. Cada archivo se puede manipular por un identificador. Un archivo est compuesto por un conjunto de registros que es una coleccin de los elementos de informacin sobre una entidad particular, los diferentes elementos se conocen como campo que pueden guardar informacin diferente, y estos pueden a su vez contener subcampos los que estn compuestos de caracteres. Mtodos de acceso a un archivo Un mtodo de acceso, no es ms que la forma como recuperar la informacin del archivo, a veces se pude procesar dato por dato, en otras veces se podra acceder rpidamente a un dato sin recuperar los datos anteriores. Existen dos mtodos para acceder a un archivo de datos: acceso secuencial y acceso aleatorio. Acceso Secuencial Exige el tratamiento elemento a elemento es necesario una exploracin secuencial comenzando desde el primer elemento hasta llegar al elemento buscado. Acceso Aleatorio o Directo Permite procesar o acceder a determinado elemento mediante una direccin en el soporte de almacenamiento. Representacin Grafica
puntero a b c Acceso directo ndice (posicin) elementos
Acceso a un archivo secuencial Acceso a un archivo directo

Representacin de la Estructura Archivo


1. SECUENCIAL: Entre sus principales caractersticas tenemos ms sencillos de

implementar, no es eficiente cuando la cantidad de datos a almacenar es grande, deben actualizarse en forma peridica para reflejar los cambios dados en la informacin almacenada. Ejemplo: archivo que almacena los datos de los clientes de un banco, al obtener dinero de un cajero automtico.
R1 R2 R3 R . Rn

EOF

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

23

2. INDEXADOS: Entre sus principales caractersticas tenemos: que este tipo de archivos requiere que se conozca la direccin donde se encuentra el dato a buscar, se compone de un archivo de datos(secuencial) y un archivo de ndices(guarda las llaves o clave del archivo secuencial, o sea la direccin del dato correspondiente en disco). Archivo de ndices Llave Direccin 10008 001 10209 003 10321 006 Archivo de datos (Secuencial) 10008 Mara del Cisne . Caldern 10209 Mara Gonzaga Gabriela

001 002 003 004 005 006 007 008 300 301 N

Nmero de

Tipos de archivos cuenta(llave) Texto: Solo permiten acceso secuencial y su unidad constitutiva es el carcter. Acceso directo: Se puede acceder secuencial o aleatoriamente y est compuesto por bytes.

10321

Mara Jos Salinas

Con tipo o Serializables: Se puede acceder secuencialmente, y solo trabaja con objetos. Implementacin de un archivo tipo texto. MODELADO:
ArchivoTexto + f : File +bw : BufferedWriter +br: BufferedReader //Constructor ArchivoTexto(dir:String) ArchivoTexto(dir:String, nom:String) //Mtodos del Archivo +escribir(dato:String):void +leer():void +info():void +lista():void +listaFiltro():void

Filtro implements FilenameFilter +extension:String //Constructor +Filtro(extension:String) //Redefinicin mtodo accept

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

24

+accept(dir:File, name String ):boolean

CLASE ARCHIVOTEXTO
importjava.io.*; publicclassArchivoTexto{ publicFilef=null; publicBufferedWriterbw=null; publicBufferedReaderbr=null; publicArchivoTexto(){ } publicFilegetF(){ returnf; } publicvoidsetF(Filef){ this.f=f; } publicbooleanverifica(Stringdir,Stringnom){ //Comprobarsihayunarchivoconesenombreeneldirectorio Filefa=newFile(dir); File[]lf=fa.listFiles(); booleanexiste=false; for(inti=0;i<lf.length;i++){ if(lf[i].getName().equalsIgnoreCase(nom)){ fa=lf[i]; existe=true; setF(fa); break; } } returnexiste; } publicvoidabrir(Stringda,Stringna){ this.f=newFile(da,na); } publicvoidescribir(Stringdato)throwsIOException{ //*************ESCRIBIRENELARCHIVO************************* //Recuerdaquelafilosofiadeaccesoalalecturayescrituraalosarchivos, //siempreeslamisma.Buffer,queenvuelveaReader,queasuvezenvuelve //alarchivo(ostream). //Paraescribirutilizamosenelmetodo.write()delbuffer //intpos=(int)f.length(); if(f.exists()){ bw=newBufferedWriter(newFileWriter(getF(),true)); }else{ bw=newBufferedWriter(newFileWriter(getF())); } bw.write(dato+"\n"); bw.close(); } publicvoidleer()throwsIOException{ //*************LEERELARCHIVO********************************** //ManejarelbufferReaderesmuysencilloyaquesimplementedeberemosde

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

25

//ejecutarlecturasporlinea. System.out.println("ElcontenidodelArchivoes:"); br=newBufferedReader(newFileReader(getF())); Stringtexline=br.readLine(); while(texline!=null){ System.out.println(texline); texline=br.readLine(); } br.close(); } publicvoidinfo(){ if(f.exists()){ System.out.print("ElArchivoexistente"); System.out.println("Nombre:"+f.getName()); System.out.println("Camino:"+f.getPath()); System.out.println("Directoriopadre:"+f.getParent()); System.out.print((f.canRead()?"sepuedeLeer":"")); System.out.println((f.canWrite()?"ysepuedeEscribir":"")); System.out.println("LalongituddelArchivoes:"+f.length()+"Bytes"); }else{ System.out.println("ElArchivonoexiste."); } } publicvoidlista(){ System.out.println("*******listadelosarchivosdeestedirectorio*******"); Filefa=newFile("/home/usuario/Documentos"); String[]lf=fa.list(); for(inti=0;i<lf.length;i++){ System.out.println(lf[i]); } } publicvoidlistaFiltro(){ System.out.println("*****listadelosarchivosdeestedirectorioconfiltro***\n"); Filefa=newFile("/media/RESPALDO/"); String[]lf=fa.list(newFiltro(".odt")); for(inti=0;i<lf.length;i++){ System.out.println(lf[i]); } } }

CLASE FILTRO

importjava.io.*; /** * *@authorIng.Mire */ publicclassFiltroimplementsFilenameFilter{ Stringextension; Filtro(Stringextension){ this.extension=extension; } publicbooleanaccept(Filedir,Stringname){ returnname.endsWith(extension); } }

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

26

Ejemplo de manejo de un archivo tipo de acceso Aleatorio


MODELADO: Log +Rf : RandomAccessFile //Constructor +Log(nom: String, t: String) //Mtodos Archivo Aleatorio +escribirfinal(dato:String):void +escribirposicion(dato:String, pos: int).void +leer():void +cerrar():void +info():void importjava.io.*; publicclassArchivoAleatorio{ publicRandomAccessFileRf; /**CreatesanewinstanceofArchivoAleatorio*/ publicArchivoAleatorio(Stringnom,Stringt)throwsIOException{ Rf=newRandomAccessFile(nom,t); } publicvoidescribirfinal(Stringdato){ try{ //Nosvamosalfinaldelfichero,Incorporamoslacadenaalfichero Rf.seek(Rf.length()); Rf.writeBytes(dato); }catch(Exceptione){ System.out.print("Haocurridounerror....Eldirectorionoexiste"); } } publicvoidescribirposicion(Stringdato,intpos){ try{ Rf.seek(pos); Rf.writeBytes(dato); }catch(Exceptione){ System.out.println("Ficheronoexiste."); } } publicvoidleer(){ //Presentamoslosdatosdelarchivo,medianteelaccesosecuencial try{ Rf.seek(0); Stringlinea=Rf.readLine(); while(linea!=null){ System.out.println(linea); linea=Rf.readLine(); } }catch(Exceptione){ System.out.println("Ficheronoexiste"); } } publicvoidcerrar()throwsIOException{

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

27

Rf.close(); } publicvoidinfo()throwsIOException{ System.out.println("Elpunteroestaenlaposicion:"+Rf.getFilePointer()); System.out.println("Eltamaodelarchivoes:"+Rf.length()); System.out.println("Elpunteroestaenlaposicion:"+Rf.getFilePointer()); } }

Ejemplo de manejo de un archivos Serializables MODELADO Clase Datos


Datos #nombre:String #telefono: String #direccion:String +Datos(String n, String t, String d); +getNombre():String +getTelefono():String +getDireccion():String +to String(): String

Clase de Lectura
ContadoInput -f:FileInputStream -fi:ObjectInputStream +abrir():void +cerrar():void +leer():Datos

Clase de Escritura
ContactoOutput -f:FileOutputStream -sf:ObjectOutputStream +abrir():void +cerrar():void +escribir(Datos d):void

IMPLEMENTACIN DE ARCHIVOS SERIALIZABLES CLASE DATOS


publicclassDatosimplementsjava.io.Serializable{ protectedStringnombre; protectedStringtelefono; protectedStringdireccion; /**CreatesanewinstanceofDatos*/ publicDatos(Stringn,Stringt,Stringd){ nombre=n; telefono=t; direccion=d; } publicStringgetNombre(){

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

28

return(nombre); } publicStringgetTelefono(){ return(telefono); } publicStringgetDireccion(){ return(direccion); } @Override publicStringtoString(){ Stringtexto="\n"; texto="\t"+nombre+"\t"+telefono+"\t"+direccion+"\n"; returntexto; } }

CLASE ESCRITURA
importjava.io.*; publicclassEscritura{ publicFileOutputStreamf; publicObjectOutputStreamsf; /**CreatesanewinstanceofEscritura*/ publicEscritura(){ } //Abrirelfichero; publicvoidabrir(Filea)throwsIOException{ f=newFileOutputStream(a,true); sf=newObjectOutputStream(f); } //Escribirenelfichero publicvoidescribir(Datosd)throwsIOException{ if(sf!=null) sf.writeObject(d); } //Cerrarelfichero publicvoidcerrar()throwsIOException{ if(sf!=null) sf.close(); } }

CLASE LECTURA
import java.io.*; public class Lectura { /** Creates a new instance of Lectura */ private FileInputStream f; private ObjectInputStream fi; public Lectura() { } public void abrir(File a) throws IOException { f = new FileInputStream(a);

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

29

fi = new ObjectInputStream(f); } public Datos leer() throws IOException, ClassNotFoundException{ Datos da = null; if (fi!= null){ try{ da = (Datos) fi.readObject(); }catch (EOFException eof){ System.out.print("Fin de archivo"); } } return da; } public void cerrar() throws IOException{ if (fi != null){ fi.close(); } } }

CLASE EJECUTORA
importjava.io.*; publicclassEjecutorArchivoSerializable{ publicstaticvoidmain(Stringargv[])throwsIOException{ Filea=newFile("/home/usuario/Documentos/agenda.odt"); Escriturabw=newEscritura(); Lecturabr=newLectura(); bw.abrir(a); bw.escribir(newDatos("Marco","2546788","LasPitas")); bw.escribir(newDatos("Andres","2545609","Argelia")); bw.cerrar(); br.abrir(a); try{ while(br!=null){ System.out.print(br.leer()); } }catch(Exceptione){ System.out.println("Nohaymasobjetos"); } br.cerrar(); } }

EJERCICIOS PROPUESTOS
1. Generar las letras del abecedario maysculas y minsculas combinadas, guardar

en un archivo de texto o aleatorio y presentarlas de la siguente manera:


AaBbCcDd EeFfGgHh IiJjKkLl MmNnOoPp QqRrSsTt UuVvWwXx

YyZz
2. Generar la tabla de sumar del 1 al 12 y guardar en un archivo de texto o

aleatorio.
TABLA DEL1 1+1=2

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

30

1+2=3 1+3=4 1+4=5 1+5=6 1+6=7 1+7=8 1+8=9 1+9=10 1+10=11 1+11=12 1+12=13 TABLA DEL2

2+1=3 2+2=4 2+3=5 2+4=6 2+5=7 2+6=8 2+7=9 2+8=10 2+9=11 2+10=12 2+11=13

2+12=14 y asi sucesivamente...

3. Generar los nmeros del fatorial hasta el 12 y guardar en un archivo de texto o aleatorio.
1! =1*=1 2! =1*2*=2 3! =1*2*3*=6 4! =1*2*3*4*=24 5! =1*2*3*4*5*=120 6! =1*2*3*4*5*6*=720

y asi sucesivamente...

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

31

ESTRUCTURA LISTA

3.1 Descripcin Lgica de la Estructura Lista Una lista, es una coleccin de elementos homogneos, entre los elementos existe una relacin lineal, en donde cada elemento indica la direccin donde se encuentra el siguiente elemento de la lista.

Representacin: Una lista se puede representar de dos formas: Esttica: su tamao se limita en tiempo de compilacin Ej.: arreglos Dinmica: su tamao puede crecer indefinidamente en tiempo de ejecucin Ej.: listas enlazadas simples, listas enlazadas dobles, listas circulares, pilas y colas. Caractersticas En cada elemento o nodo de la lista a excepcin del primero, tiene un nico predecesor se debe indicar donde se encuentra el siguiente elemento. Cada elemento de la lista, a excepcin del ltimo tiene un nico sucesor. Las listas son flexibles y permiten cambios en la implementacin. Partes de un nodo Campo dato o info Campo de enlace

Campo dato o info: contiene uno o varios datos y/o objetos Campo de enlace: es la referencia hacia el otro nodo de la lista. Representacin de la estructura en memoria:

Por lo general un nodo de una lista se abstrae en una clase. Ejemplo: Class Nodo{ int dato; Nodo siguiente; public Nodo (Nodo sig){ Siguiente = sig; } // mtodos de la clase } // fin de la clase Nodo

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

32

3.2 Operaciones En una lista se pueden efectuar las siguientes operaciones: Insertar: Agregar un nuevo nodo a la lista Eliminar: Quitar un nodo de la lista Buscar: Permite encontrar un nodo dentro de la lista Modificar: Actualiza la informacin de un determinado nodo dentro de la lista 3.3 Tipos de listas 3.3.1 Listas Simplemente Enlazadas Analiza: Piensa en varias aplicaciones informticas de la vida real, en donde se utilice la estructura: Lista Simplemente Enlazada, comenta con tus compaeros y con tu profesora..!!! Es una coleccin de elementos homogneos cuya relacin lineal es determinada por la posicin del elemento en la lista. Una lista simplemente enlazada se caracteriza por lo siguiente: En cada nodo existe un solo enlace o referencia hacia el siguiente nodo. Solo el ltimo nodo de la lista contendr una referencia nula o apuntara a null. Esta dada en un solo sentido.

Java inicializa los campos de referencias de un objeto a null durante la construccin del objeto, no es necesario asignar explcitamente null a un campo de enlace. Pero sin embargo no olvide estas asignaciones de null en su cdigo fuente, su ausencia reduce la claridad del cdigo.

TDA:LISTA ENLAZADA SIMPLE Elementos: los elementos de una lista simplemente enlazada, son conocidos como nodos, que almacenan datos simples o estructurados. Estructura: Lineal entre los nodos que forman la lista enlazada simple, cada nodo tiene un nico sucesor y predecesor Dominio: si la lista no est vaca el rango sern los elementos que tendrn las posiciones 0,1,2,3N donde N es la cantidad de elementos de la lista. OPERACIONES: INSERTAR-INICIO Utilidad: aadir un elemento al inicio de la lista L

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

33

Datos de entrada: la lista L y el nuevo elemento. Datos de salida: la lista L con el nuevo elemento al inicio. Precondicin: Ninguna Postcondicion: La lista L contiene un elemento nuevo al inicio. INSERTAR-FIN

Utilidad: aadir un elemento al final de la lista L Datos de entrada: la lista L y el nuevo elemento. Datos de salida: la lista L con el nuevo elemento al final. Precondicin: Ninguna Postcondicion: La lista L contiene un elemento nuevo al final. INSERTAR-ENTRE-NODOS

Utilidad: aadir un nuevo nodo en un orden especifico dentro de la lista L Datos de entrada: la lista L ,el nuevo elemento y el nodo predecesor Datos de salida: la lista L con el nuevo elemento insertado en el lugar que le corresponde. Precondicin: La lista contenga nodos Postcondicin: La lista L contiene al elemento nuevo en el orden que le corresponde. ELIMINAR-INICIO

Utilidad: quitar un elemento del inicio de la lista L Datos de entrada: la lista L. Datos de salida: la lista L con un nodo menos y el valor del nodo eliminado Precondicin: la lista L no este vaca Postcondicion: La lista con un nodo menos (el del inicio) ELIMINAR-FIN

Utilidad: quitar un elemento del final de la lista L Datos de entrada: la lista L. Datos de salida: la lista L con un nodo menos y el valor del nodo eliminado Precondicin: la lista L no este vaca Postcondicion: La lista con un nodo menos (el del final) ELIMINAR- ENTRE-NODOS

Utilidad: quitar un nodo de un orden especfico de la lista Datos de entrada: la lista L, y el elemento a eliminar Datos de salida: la lista L con un elemento menos Precondicin: la lista L no est vaca y que contenga el nodo a eliminar Postcondicin: La lista L contiene un elemento menos y corresponde al que se elimino BUSCAR-NODO

Utilidad: recorrer la lista L, hasta encontrar un determinado nodo dentro de la lista L Datos de entrada: la lista L ,el elemento a buscar Datos de salida: verdadero si se ha encontrado el nodo caso contrario falso Precondicin: la lista no est vaca Postcondicin: Ninguna MODIFICAR-NODO Utilidad: modificar un elemento de la lista L Datos de entrada: la lista L ,el elemento a modificar y el nuevo valor para modificar el elemento de la lista L. Datos de salida: Ninguna Precondicin: la lista no est vaca Postcondicin: La lista L con un elemento modificado.

Nivel fsico: Implementacin de operaciones de Listas Enlazadas Simples CASOS PARA LA INSERCIN DE NODOS: 1.- Cuando la lista enlazada simple no existe

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

34

2.- Cuando el nodo se debe insertar antes del primer nodo 3.- Cuando el nodo se debe insertar despus del ltimo nodo 4.- Cuando el nodo se debe insertar entre nodos PASOS PARA LA SOLUCIN Caso 1: Cuando la lista enlazada simple no existe 1.- Leer (valor) 2.- Se crea un nodo y se asigna su referencia a top 3.- Inicializar su campo de no enlace Caso 2: Cuando el nodo se debe insertar antes de primero 1.- Leer (valor) 2.- Crear un nuevo nodo temporal 3.- Inicilizar el campo de no enlace del nodo temporal 4.-Asignar la referencia de inicio de la lista (top),al campo de enlace del nodo temporal 5.-Asignar la referencia del nodo temporal al inicio de la lista Caso 3: Cuando el nodo a insertarse despus del ltimo nodo 1.- Leer (valor) 2.-Crear un nodo temporal 3.- Inicializar el campo de no enlace del nodo temporal 4.- Declarar una variable de referencia aux (auxiliar) 5.- Recorrer la lista hasta el final 6.-Asignar la referencia del nodo temporal al campo de enlace del ltimo nodo de la lista Caso 4 : cuando el nodo debe insertarse entre nodos 1.- Leer(valor) 2.- Leer (valor) nodo predecesor 3.-Crear un nodo temporal 4.- Inicializar el campo de no enlace del nodo temporal 5.- Declarar una variable de referencia aux(auxiliar) 6.- Recorrer la lista hasta encontrar el nodo predecesor 7.-Asignar al campo de enlace del nodo temporal la referencia del nodo sucesor 8.- Asignar la referencia del nodo temporal al campo de enlace del nodo predecesor CASOS PARA LA ELIMINACIN DE NODOS: 1.- Borrar el primer nodo 2.- Borrar cualquier nodo que no sea el primero PASOS PARA LA SOLUCIN Caso1: borrar el primer nodo 1.- Asignar el enlace del campo siguiente del nodo referenciado por top a top. Caso 2 :borrar cualquier nodo que no sea el primero 1.- Leer(valor) 2.- Localizar el nodo predecesor al nodo que se desea eliminar

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

35

3.- Asignar al campo de enlace del nodo predecesor la referencia del nodo sucesor al que se desea eliminar. Si el nodo a eliminar es el ltimo asignar null al campo de enlace del nodo predecesor. BUSCAR UN NODO 1.- Leer (valor) 2.- Recorrer la lista hasta encontrar el valor MODELADO:
ListaSimple - dato: Object // campo dato - sig:ListaSimple // campo de enlace al siguiente nodo - top: ListaSimple // apuntador de cabecera de la lista simple + ListaSimple( ) + getDato ( ) : Object +getSig ( ) : ListaSimple +setDato( dato: Object): void +setSig(sig.ListaSimple):void +esVacia( ):Boolean //Insercin de Nodos +insertaVacia(d:Object):void //Caso 1 +insertaInicio(d:Object):void //Caso 2 +insertaFinal(d:Object):void //Caso 3 +entreNodos(np: Object, d:Object):void // Caso 4 //Eliminacin de Nodos +eliminaInicio( ): void // Caso 1 +eliminaNodo( d:Object): void //Caso 2 y 3 //Bsqueda +buscarNodo( ):boolean //Modificar nodo +modificaNodo(d:Object, nd:Object):void //Varios +presenta( ):void +cuentaNodos( ):int +cuentaRepetidos(d:Object):int

IMPLEMENTACIN EN JAVA
publicclassListaSimple{ privateObjectdato; privateListaSimplesig; privateListaSimpletop; publicListaSimple(){ setDato(null); setSig(null); } publicObjectgetDato(){ returndato; } publicvoidsetDato(Objectdato){ this.dato=dato; } publicListaSimplegetSig(){ returnsig; }

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

36

publicvoidsetSig(ListaSimplesig){ this.sig=sig; } publicbooleanesVacia(){ if(top==null){ returntrue; }else{ returnfalse; } } //InserciondeNodos publicvoidinsertaVacia(Objectd){ if(esVacia()){ top=newListaSimple(); top.setDato(d); System.out.println("Elnodoinsertadoeselprimero"); }else{ System.out.println("Noseejecutolaoperacion,lalistayacontineelementos."); } } publicvoidinsertarInicio(Objectd){ if(!esVacia()){ ListaSimpletemp=newListaSimple(); temp.setDato(d); temp.setSig(top); top=temp; }else{ System.out.println("Nopuedeinsertarsealinicio...Lalistanocontienennodos"); insertaVacia(d); } } publicvoidinsertaFinal(Objectd){ if(!esVacia()){ ListaSimpletemp=newListaSimple(); temp.setDato(d); ListaSimpleaux; aux=top; while(aux.getSig()!=null){ aux=aux.getSig(); } aux.setSig(temp); }else{ System.out.println("Nosepuedeinsertaralfinal...Lalistaestavacia"); } } publicvoidentreNodos(Objectnp,Objectd){ if(!esVacia()){ ListaSimpleaux; aux=top; while((aux.getDato().equals(np)==false)&&(aux.getSig()!=null)){ aux=aux.getSig(); } if(aux.getDato().equals(np)){ ListaSimpletemp=newListaSimple(); temp.setDato(d); temp.setSig(aux.getSig());

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

37

aux.setSig(temp); }else{ System.out.println("Nosepuedeinsertar...Nodopredecesornoexiste"); } }else{ System.out.println("Nosepuedeinsertar...Lalistaestavacia"); } }

EJERCICIOS PROPUESTOS
Implementar los mtodos correspondientes a la Lista Simple: eliminacin de nodos, bsqueda, modificacin y varios.

En java tambin existe un Api propio para trabajar con listas simples, con la clase ArrayList INVESTIGA..!!!

3.3.2 Lista Circulares Analiza: Piensa en varias aplicaciones informticas de la vida real, en donde se utilice la estructura: Lista Circular, comenta con tus compaeros y con tu profesora..!!!
aba|

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. Se obtiene al considerar el primer nodo de la lista es el sucesor del ltimo nodo. Se utilizan con frecuencia en procesamiento repetitivo de nodos en un orden especfico. Caractersticas No podemos hablar de primer y ltimo nodo, Para su implementacin es necesario utilizar un apuntador general a la lista No existen direcciones nulas, excepto cuando la lista est vaca Si la lista contiene un solo nodo, el campo de enlace entonces apuntara a si mismo Es posible llegar a cualquier nodo a partir de cualquier posicin donde se encuentre apuntando a la variable de referencia llamada lista Representacin

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

38

Nivel fsico: Implementacin de operaciones de Listas Circulares MODELADO:


ListaCircular - sig: ListaCircular - dato: Object + lista: ListaCircular + ListaCircular ( ) + ListaCircular(d: Object) +getDato( ):Object + getSig( ): ListaCircular +setDato (d: Object):void +setSig(nodo: ListaCircular):void +insert(d:Object):void +delete(d:Oject): void +search(d:Object):void +update(d:Object, nd:Object):void +printNodos( ): void

Algoritmo para Insertar Nodos - Leer (valor) - Crear un nodo temporal - Fijar el dato - Si la lista est vaca es el primero a insertarse, asignar la referencia del nuevo nodo a lista sino insertar el nuevo nodo a continuacin de lista. - Enlazar el nuevo nodo a lista - Asignar la referencia del nuevo nodo a lista Algoritmo para eliminar Nodos - Crear una variable auxiliar - Asignar la referencia de lista a la variable auxiliar - Recorrer la lista hasta encontrar el dato a eliminar y lista sea diferente de auxiliar - Si el dato existe verificar que si el ltimo asignar null a lista sino fijar en auxiliar la referencia del sucesor del nodo a eliminar. Algoritmo para imprimir Nodos - Crear una variable auxiliar - Asignar a la variable auxiliar la referencia del inicio de lista - Recorrer la lista mientras auxiliar sea diferente de lista - En el recorrido presentar el valor de cada nodo visitado
IMPLEMENTACIONDELALISTACIRCULAR publicclassListaCircular{

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

39

privateListaCircularsig; privateObjectdato; publicListaCircularlista=null; //ConstructorBasico publicListaCircular(Objectd){ //Fijamoseldato lista=newListaCircular(); lista.setDato(d); //Reseteamoselapuntador lista.setSig(lista); } publicListaCircular(){ setSig(null); setDato(null); } //Accesoaloselementosdeunnodo publicListaCirculargetSig(){ return(sig); } publicObjectgetDato(){ return(dato); } publicvoidsetSig(ListaCircularnodo){ sig=nodo; } publicvoidsetDato(Objectd){ dato=d; } publicvoidinsert(Objectd){ ListaCirculartemp=newListaCircular(); temp.setDato(d); if(lista==null){ lista=temp; lista.setSig(lista); }else{ temp.setSig(lista.getSig()); lista.setSig(temp); lista=temp; } System.out.println("Eldatohasidoinsertadocorrectamente."); } publicvoiddelete(Objectd){ if(lista!=null){ ListaCircularaux; aux=lista; do{ aux=aux.getSig(); }while((aux.getSig().getDato()!=d)&&(lista!=aux)); booleanexiste=false; if(aux.getSig().getDato()==d){ existe=true; } if(existe==true){ if(aux.getSig()!=lista){ //Variosnodos aux.setSig(aux.getSig().getSig());

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

40

}else{ if(aux.getSig()==aux){ //Existeunsolonodo lista=null; }else{ //Elnodoaeliminarestareferenciadoporlista lista=aux; aux.setSig(aux.getSig().getSig()); } } }else{ System.out.println("Nodoaeliminarnoexiste\n"); } }else{ System.out.println("Nosepuedeeliminarlalistaestavacia\n"); } } publicbooleansearch(Objectd){ booleanexiste=false; if(lista!=null){ ListaCircularaux; aux=lista; do{ aux=aux.getSig(); }while((aux.getSig().getDato()!=d)&&(lista!=aux)); if(aux.getSig().getDato()==d){ existe=true; } } returnexiste; } publicvoidupdate(Objectd,Objectnd){ if(lista!=null){ ListaCircularaux; aux=lista; do{ aux=aux.getSig(); }while((aux.getSig().getDato()!=d)&&(lista!=aux)); if(aux.getSig().getDato()==d){ aux.getSig().setDato(nd); System.out.println("Eldatohasidoactualizadoconexito.."); }else{ System.out.println("Eldatonoexiste...Lamodificacionnohatenidoexito"); } }else{ System.out.println("Lalistaestavacia...!!!"); } } publicvoidprint(){ ListaCircularaux; aux=lista; if(aux!=null){ do{ System.out.println("["+aux.getDato()+"]"); aux=aux.getSig(); }while(aux!=lista);

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

41

}else{ System.out.println("Lalistaestavacia"); }} }

3.3.3 Listas Ordenadas. Analiza: Piensa en varias aplicaciones informticas de la vida real, en donde se utilice la estructura: Lista ordenada, comenta con tus compaeros y con tu profesora..!!! Usa la estructura diccionario en la que se guarda pares de clave-elemento: la clave (k) y el elemento (e). Para lograr mayor generalidad se permite que las claves y los elementos que se guarden en el diccionario sean cualquier clase de objeto. Ejemplo: El registro de alumnos (k,e); k numero de cedula o identificacin y e nombre, direccin, telfono, calificacin. Tipo de Listas Ordenadas. 1. Diccionario no ordenado o genrico: Se supone que no hay relacin de orden entre las claves y solo se usa la prueba de igualdad entre ellas. 2. Diccionarios Ordenados. Existen entre las claves una relacin de orden total, adems determina el orden relativo de dos claves mediante un comparador. Representacin en Memoria.

TDA: DICCIONARIO Elementos: Se guardan como elementos cualquier objeto, como un par ordenado: clave K y elemento e. Estructura: Lineal entre cada artculo del diccionario D Dominio: depende de la aplicacin OPERACIONES: INSERT-ELEMENTO Utilidad: Aadir un articulo con elemento e y clave K en el diccionario D. Datos de Entrada: Clave K,objeto o elemento e Datos de Salida: Diccionario D modificado REMOVE- ELEMENTO Utilidad: quitar de D un articulo con clave K y regresar el elemento eliminado, si el artculo no existe en el diccionario regresar un mensaje clave no existe Datos de Entrada: Clave K Datos de Salida: Elemento e, o el mensaje en caso de que no hubo xito en la operacin ENCONTRAR- ELEMENTO Utilidad: si D contiene un articulo cuya clave sea igual a K, regresa al elemento de ese artculo y si no u n

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

42

mensaje indicando clave no existe Datos de Entrada: Clave K del objeto Datos de Salida: Elemento e, caso contrario el mensaje si no existe la clave . MODIFICAR- ELEMENTO Utilidad: si D contiene un articulo cuya clave sea igual a K, actualizando al elemento de ese artculo y si no u n mensaje indicando clave no existe Datos de Entrada: Clave K del objeto Datos de Salida: mensaje valor ha sido modificado correctamente, caso contrario el mensaje si no existe la clave .

Nivel fsico: Implementacin de operaciones de Listas Ordenadas MODELADO:


ListaOrdenada - clave: int - valor: String - sig:ListaOrdenada + top: ListaOrdenada +ListaOrdenada( ) +ListaOrdenada(clave:int, valor:String) +getClave( ): int +getSig( ):ListaOrdenada +getValor( ):String +setClave(clave:int):void +setSig(sig:ListaOrdenada):void +setValor(valor:String):void +esVacia( ):Boolean +insert(clave:int, valor:String):void +delete(clave:int):String +search(clave:int):String +update(clave:int, nd String):void +print( ):void

IMPLEMENTACIN LISTAS ORDENADAS


publicclassListaOrdenada{ privateintclave; privateStringvalor; privateListaOrdenadasig; publicListaOrdenadatop=null; //Constructor publicListaOrdenada(){ this.setClave(0); this.setValor(null); this.setSig(null); } publicListaOrdenada(intclave,Stringvalor){ top=newListaOrdenada(); top.setClave(clave); top.setValor(valor); top.setSig(null); } publicintgetClave(){ returnclave; } publicListaOrdenadagetSig(){ returnsig;

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

43

} publicStringgetValor(){ returnvalor; } publicvoidsetClave(intclave){ this.clave=clave; } publicvoidsetSig(ListaOrdenadasig){ this.sig=sig; } publicvoidsetValor(Stringvalor){ this.valor=valor; } publicbooleanesVacia(){ if(top==null){ returntrue; }else{ returnfalse; } } publicvoidinsert(intclave,Stringvalor){ if(esVacia()){ top=newListaOrdenada(); top.setClave(clave); top.setValor(valor); }else{ ListaOrdenadaaux,aux1; aux=aux1=top; booleanexiste=false; while((aux.getSig()!=null)&&(clave>aux.getClave())){ aux1=aux; aux=aux.getSig(); } if(aux.getClave()==clave){ existe=true; } if(existe==false){ ListaOrdenadatemp=newListaOrdenada(); temp.setClave(clave); temp.setValor(valor); //Elnodoainsertareselnodocabecera if((top==aux)&&(clave<aux.getClave())){ temp.setSig(top); top=temp; }else //Elnodoainsertaresmayoralapuntadoporaux if(clave>aux.getClave()){ temp.setSig(aux.getSig()); aux.setSig(temp); }else{ //Elnodoainsertaresmenoralapuntadoporaux aux1.setSig(temp); temp.setSig(aux); } }else{ System.out.println("Nosepuedeinsertar...Claverepetida");

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

44

} } } publicStringdelete(intclave){ ListaOrdenadaaux,aux1; aux1=aux=top; Stringdato=null; while((aux.getSig()!=null)&&(clave>aux.getClave())){ aux1=aux; aux=aux.getSig(); } booleanexiste=false; if(aux.getClave()==clave){ existe=true; dato=aux.getValor(); }else{ dato=null; } if(existe==true){ if(top==aux){ top=top.getSig(); }else{ if(aux.getSig()==null){ aux1.setSig(null); }else{ aux1.setSig(aux.getSig()); } } } returndato; } publicStringsearch(intclave){ Stringdato=null; ListaOrdenadaaux; aux=top; while((aux.getSig()!=null)&&(clave>aux.getClave())){ aux=aux.getSig(); } if(aux.getClave()==clave){ dato=aux.getValor(); }else{ dato="Noexiste"; } returndato; } publicvoidupdate(intclave,Stringnd){ ListaOrdenadaaux; aux=top; while((aux.getSig()!=null)&&(clave>aux.getClave())){ aux=aux.getSig(); } if(aux.getClave()==clave){ aux.setValor(nd); }else{ System.out.println("Clavenoexiste...Nosehamodificado"); }

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

45

} publicvoidprint(){ ListaOrdenadaaux; aux=top; System.out.print("["); while(aux!=null){ System.out.print(aux.getClave()+"="+aux.getValor()+""); aux=aux.getSig(); } System.out.print("]"); } } EnjavatambinexisteunapipropioparatrabajarconListasOrdenadasse tratadelaClaseHashTableoHashMapINVESTIGA..!!!

3.3.4 Listas Doblemente Enlazadas Analiza: Piensa en varias aplicaciones informticas de la vida real, en donde se utilice la estructura: Lista Doblemente Enlazada, comenta con tus compaeros y con tu profesora..!!! Problemas con las Listas Simples: Restringen el movimiento por los nodos a una sola direccin. No se puede atravesar la lista en direccin opuesta a menos que se utilice primeramente un algoritmo de inversin, lo que llevar algn tiempo. El borrado de nodos, se complica debido a que no se puede eliminar un nodo arbitrario sin acceder al predecesor del nodo. Una lista doblemente enlazada, es una lista enlazada de nodos, donde cada nodo tiene un par de campos de enlace, el que permite atravesar la lista hacia adelante mediante el campo de enlace sig (siguiente), y hacia atrs con el campo de ente ant(anterior). Es una coleccin de elementos homogneos que tiene una relacin lineal se da en ambos sentidos.

Caractersticas En cada nodo existe una referencia a su nodo predecesor y sucesor a ms del campo dato o de informacin. El recorrido se lo puede hacer en ambos sentidos Solo, en el nodo inicial o cabecera la referencia al nodo predecesor ser null o puede apuntar al ltimo nodo. Solo en el nodo final la referencia al nodo sucesor ser null o puede apuntar al primer nodo.

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

46

Se requiere de dos variables de referencia para el recorrido.

Partes de un Nodo Doble Campo de enlace anterior Campo dato o info Campo de enlace siguiente

Nivel fsico: Implementacin de operaciones de Listas Doblemente Enlazadas Si se utiliza un nodo cabecera en una lista de doble enlace ya no es necesario contar con las referencias primero y ltimo, puesto que el nodo cabecera tiene ambas referencias: su referencia siguiente es el primer elemento de la lista, y su referencia anterior es el ltimo elemento de la lista. De esta forma la lista de doble enlace queda circular de una manera natural, esto facilitar la implementacin de la lista doblemente enlazada, quedando la lista de la siguiente manera:

MODELADO:
NodoDoble ant: NodoDoble sig: NodoDoble dato:Object + NodoDoble() + setAnt(nodo:NodoDoble):void + setSig(nodo:NodoDoble):void +setDato(datos:Object):void + getAnt():NodoDoble +getSig():NodoDoble + setDato():Object + insertarAntes (despus: NodoDoble,d:Object):void

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

47

+ insertarDespues(antes: NodoDoble,d:Object):void + insertarEntre(antes: NodoDoble,d:Object,despus: NodoDoble):void

ListaDoble + top: NodoDoble - numeroNodos:int + ListaDoble() + longuitud():int - incLongitud():void -decLongitud():void +insertarAtHead(d:Object):void + insertarAtFinal(d: Object):void +insertarAt(indice:int, d: Object):void +deleteFirst()void +deleteNodo(ndice:int):void + getAt(indice: int): Object +printNodos():void

IMPLEMENTACION LISTAS DOBLES


Clase: NodoDoble publicclassNodoDoble{ //Referenciasalnodoanterioryposteriorenlalista privateNodoDoblesig; privateNodoDobleant; //Referenciaalosdatosactualesdelobjeto //Estonofuncionariacontiposbasicos,porqueno //sepuedenpasarcomoobjetos privateObjectdato; //ConstructorBasico publicNodoDoble(){ //Reseteamoslosapuntadores setSig(null); setAnt(null); //Enprincipio,nohaydatos setDato(null); } //Construimosunnuevonodoyloinsertamosenmedio //delosdosquenosindiquen publicNodoDoble(NodoDobleantes, NodoDobledespues,Stringd){ insertEntre(antes,despues,d); } //Insertaunnodoentredosdeterminados //Accesoaloselementosdeunnodo publicNodoDoblegetAnt(){ return(ant); } publicNodoDoblegetSig(){ return(sig); } publicObjectgetDato(){ return(dato); }

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

48

//Modificaciondeloselementosdeunnodo publicvoidsetAnt(NodoDoblenodo){ ant=nodo; } publicvoidsetSig(NodoDoblenodo){ sig=nodo; } publicvoidsetDato(Objectd){ dato=d; } //Insertaunnodoantesdelquenosindiquen publicvoidinsertAntes(NodoDobledespues,Objectd){ //Fijamosnuestrosapuntadores setAnt(despues.getAnt()); setSig(despues); //Fijamoslosapuntadoresdelosotrosnodosanosotros getAnt().setSig(this); despues.setAnt(this); //Fijamoslosdatosdelnodo setDato(d); } //Insertaunnododespuesdelquenosindiquen publicvoidinsertDespues(NodoDobleantes,Objectd){ //Fijamosnuestrosapuntadores setAnt(antes); setSig(antes.getSig()); //Fijamoslosapuntadoresdelosotrosnodosanosotros antes.setSig(this); getSig().setAnt(this); //Fijamoslosdatosdelnodo setDato(d); } publicvoidinsertEntre(NodoDobleantes,NodoDobledespues,Objectd){ //Fijamosnuestrosapuntadores setAnt(antes); setSig(despues); //Fijamoslosapuntadoresdelosotrosnodosanosotros antes.setSig(this); despues.setAnt(this); //Fijamoslosdatosdelnodo setDato(d); } publicvoiddeleteEntre(NodoDobleantes,NodoDobledespues){ //Fijamoslosapuntadores antes.setSig(despues); despues.setAnt(antes); } } Clase: Lista Doble publicclassListaDoble{ //Usaremosunnodo'top'paracontrolarelprincipioyfinal //delalistadoblementeenlazadaqueestamosimplementando, //loquenossimplificabastantelascosas publicNodoDobletop; //Mantenemosuncontadordelnumerodenodosenlalista

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

49

privateintnumNodos; //Constructorbasico publicListaDoble(){ //Inicialmente,nohayningunnodo numNodos=0; //Creamosnuestronodo top=newNodoDoble(); //Hacemosquelosapuntadoresdelnodolohagana //simismo,inclusoquesusdatosserefieranalossuyos top.insertEntre(top,top,null); } //Accesoalnumerodenodos publicintlongitud(){ return(numNodos); } //Modificaciondelnumerodenodos privatevoidincLongitud(){ numNodos++; } privatevoiddecLongitud(){ numNodos; } //Insertamoslosdatosquenosindiquencomonuevacabecera //delalista publicvoidinsertAtHead(Objectd){ NodoDobletemp=newNodoDoble(); temp.insertDespues(top,d); incLongitud(); } //Insertamoslosdatosquenosindiquenalfinaldelalista publicvoidinsertAtFinal(Objectd){ NodoDobletemp=newNodoDoble(); temp.insertAntes(top,d); incLongitud(); } //Insertamoslosdatosenlaposicionquenosdigan,oal //finaldelalistaencasodequenoseatanlargacomo //indiqueelindice publicvoidinsertAt(intindice,Objectd){ //Comprobamosquelalistatengasuficientesnodos if(longitud()<indice) { //Sinolostiene,insertamosalfinal insertAtFinal(d); } else { NodoDobletemp; NodoDobleaux; //Vamossaltandodenodoennodohastallegaralindicado aux=top; for(inti=0;i<indice1;i++) aux=aux.getSig(); //Creamosunnuevonodoenesaposicionyloincorporamosa

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

50

//lalista //temp=newNodoDoble(aux,aux.getSig(),d); temp=newNodoDoble(); temp.insertEntre(aux,aux.getSig(),d); incLongitud(); } } //Recuperalosdatosdeundeterminadonodo(odelultimoelemento //silalistanotienetantosnodos),odevuelvenullsila //listaestavacia publicvoiddeleteFirst(){ if(longitud()==0){ System.out.println("Listavacia...Nosepuedeeliminarelnododelinicio"); }else{ System.out.println("Nodoaeliminar:"+top.getSig().getDato()); top.setSig(top.getSig().getSig()); decLongitud(); } } publicvoiddeleteEnd(){ if(longitud()==0){ System.out.println("Listavacia...Nosepuedeeliminarelnododelfinal"); }else{ System.out.println("Nodoaeliminar:"+top.getAnt().getDato()); top.setAnt(top.getAnt().getAnt()); decLongitud(); } } publicObjectgetAt(intindice){ //Comprobamossilalistatienetantosnodoscomoindicaelindice if(longitud()<indice) { //Comprobamosquelalistanoestevacia if(longitud()==0) //Lalistaestatodaviavacia return(null); else return(top.getDato()); } else { //Estamosdentrodelrangodelalista NodoDobleaux; //Vamossaltandoporlosnodoshastaalcanzarelpedido aux=top.getSig(); for(inti=0;i<indice;i++) aux=aux.getSig(); //Devolvemoslosdatosdeesenodo return(aux.getDato()); } } publicvoidprintInverso(){ //Comprobamossilalistatienetantosnodoscomoindicaelindice if(longitud()==0){ //Comprobamosquelalistanoestevacia

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

51

System.out.print("Lalistaestavacia"); }else{ //Estamosdentrodelrangodelalista NodoDobleaux; //Vamossaltandoporlosnodoshastaalcanzarelpedido aux=top.getAnt(); System.out.println("PRESENTACIONENORDENDESCENDENTE\n"); for(inti=longitud();i>0;i){ //presentamoslosdatosdeesenodo System.out.println("Valornodo:"+i+"\t"+aux.getDato()); //avanzaralanteriornododelalista aux=aux.getAnt(); } } } publicvoidPrintNodos(){ //Comprobamossilalistatienetantosnodoscomoindicaelindice if(longitud()==0){ //Comprobamosquelalistanoestevacia System.out.print("Lalistaestavacia"); }else{ //Estamosdentrodelrangodelalista NodoDobleaux; //Vamossaltandoporlosnodoshastaalcanzarelpedido aux=top; //System.out.println("PRESENTACIONENORDENASCENDENTE\n"); for(inti=1;i<longitud();i++){ //avanzaralsiguientenododelalista aux=aux.getSig(); System.out.println("\t"+aux.getDato()); //presentamoselvalordelnodo }}}}

EJERCICIOS PROPUESTOS Implementar el mtodo de eliminacin de nodos para la lista doble, segn el cdigo fuente desarrollado en clases.
En java tambin existe un api propio para trabajar con Listas Dobles se trata de la Clase LinkedList INVESTIGA..!!!

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

52

4 PILAS
Analiza:
Ejemplos donde estn aplicadas las pilas es: En la opcin deshacer o rehacer en aplicaciones de ofimticas. En el retroceso de pginas de los exploradores de internet.

Piensa en varias aplicaciones informticas de la vida real, en donde se utilice la estructura: Lista ordenada, comenta con tus compaeros y con tu profesora..!!!

Es una estructura lineal de objetos ordenados tales que estos se obtienen por un solo lado de la estructura siguiendo un sistema definido entre los que tenemos: UEPS = ultimo en entrar, primero en salir LIFO= Last in Firts out Una pila es una estructura de datos en la cual el acceso est limitado al ltimo elemento insertado (el ms reciente). Todas las operaciones que se definan sobre una pila deben de tener costo constante, independientemente del nmero de elementos de la pila. Las Operaciones bsicas son: Insert Push Delete Pop Search Tope

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

53

Representacin

TDA: Pila Elementos: Cualquier objeto, esto depende de la aplicacion a implementarse. Estructura: Lineal Dominio: La pila tendr la capacidad de almacenar la cantidad de elementos dependiendo de la aplicacin. OPERACIONES: 1. METER (PUSH) Utilidad: Agrega un elemento a la pila. Datos de Entrada: Elemento (e), pila (p) Datos de Salida: La pila con un elemento mas Precondiciones: Que la pila este creada y no est llena Postcondiciones: La pila con un elemento adicional agregado por el tope de la pila 2. SACAR(POP) Utilidad: eliminar el ltimo elemento que se agrego a la pila. Datos de Entrada: pila (p) Datos de Salida: La pila con un elemento menos y el elemento que se saca a la pila Precondiciones: Que la pila no este vaca Postcondiciones: La pila con un elemento menos que fue eliminado por el tope de la pila. 3. VACIA Utilidad: Verifica si una determinada pila esta vaca o no. Datos de Entrada: la pila que se va a verificar Datos de Salida: valor booleano (true, false) Precondiciones: Que la pila exista Postcondiciones: 4. LLENA Utilidad: Verifica si una determinada pila est llena o no Datos de Entrada: la pila (p) que se va a verificar Datos de Salida: valor booleano (true, false) Precondiciones: que la pila exista Postcondiciones:

Nivel fsico: Implementacin de operaciones de Pilas MODELADO:


Pila - dato: String - sig: Pila + top: Pila + Pila ( ) + getDato( ): String + getSig( ): Pila + setDato( dato:String):void + setSig( sig: Pila):void + esVacia( ):Boolean

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

54

+ hacePush(d: String):void + hacePop( ): void + query( ): String +print( ): void

Algoritmo: PUSH/INSERTAR/METER/APILAR 1.-Leer valor 2.-Crear un nuevo nodo que sea tipo pila 3.-Inicilizar su campo de no enlace 4.-Enlazar la referencia de top con el nuevo nodo 5.-Avanza top Algoritmo: POP/ELIMINAR/SACAR/DESAPILAR 1._ Verificar si la pila est vaca si no lo est retornar el elemento. 2._ Asignar a top, la referencia del siguiente elemento apuntado por top
IMPLEMENTACIONDEPILAS publicclassPila{ privateStringdato; privatePilasig; publicPilatop=null; publicPila(){ setSig(null); setDato(null); } publicStringgetDato(){ returndato; } publicvoidsetDato(Stringdato){ this.dato=dato; } publicPilagetSig(){ returnsig; } publicvoidsetSig(Pilasig){ this.sig=sig; } publicbooleanesVacia(){ if(top==null) returntrue; else returnfalse; } publicvoidhacePush(Stringd){ Pilatemp=newPila(); temp.setDato(d); temp.setSig(top); top=temp; System.out.println("push("+top.getDato()+")"); } publicvoidhacePop(){ if(esVacia()){ System.out.print("Nohayelementosenlapila");}

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

55

else{ System.out.println("pop("+top.getDato()+")"); top=top.getSig(); } } publicStringinfo(){ if(esVacia()) returnnull; else returntop.getDato(); } publicvoidprint(){ Pilaaux; aux=top; System.out.print("Pila:["); while(aux!=null){ if(aux.getSig()!=null){ System.out.print(aux.getDato()+","); }else{ System.out.print(aux.getDato()); } aux=aux.getSig(); } System.out.print("]\n"); } publicstaticvoidmain(String[]args){ Pilap=newPila(); p.print(); p.hacePush("Franklin"); p.hacePush("Mireya"); p.hacePush("Wilson"); p.hacePush("Gabrielita"); System.out.println("Elementodelacimadelapilaes:"+p.info()); p.hacePush("Xavier"); p.hacePush("July"); p.print(); System.out.println("Elementodelacimadelapilaes:"+p.info()); p.hacePop(); p.hacePop(); p.hacePop(); p.hacePop(); p.hacePush("Nuevo"); p.print(); }

En java tambin existe un Api propio para trabajar con la Estructura Pila, se trata de la Clase Stack... INVESTIGA..!!!

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

56

5 Colas o Filas
Analiza:
Ejemplos donde se pueden aplicar las colas son: Los drivers de la impresora, todos los trabajos que reciben para su impresin, siempre los colocan en una cola de acuerdo a cmo han llegado. Las colas de los bancos. En los sistemas operativos al momento de asignar algn recurso a los procesos.

Piensa en varias aplicaciones informticas de la vida real, en donde se utilice la estructura: Lista ordenada, comenta con tus compaeros y con tu profesora..!!!

Una cola es una estructura de datos en la cual el acceso est limitado al elemento insertado recientemente. Adems una cola es una coleccin ordenada de elementos homogneos en la que solo se puede aadir por el final y eliminar por el frente y se requiere dos punteros, para su manipulacin. Aplica la filosofa FIFO(first in first out) o PEPS (primero en entrar, primero en salir) Las operaciones bsicas son: Insert Encolar Delete Desencolar Search Tope Representacin

TDA: COLA O FILA Elementos: cualquier clase de objetos, dependiendo de la aplicacin. Estructura: Lineal. Dominio: se maneja cantidades de objetos de acuerdo a la aplicacin. OPERACIONES: 1._ INSERTAR /ENCOLAR: Utilidad: Agregar un elemento e, a la fila o cola. Dato de entrada: El elemento e y la cola. Dato de Salida: La cola con un elemento adicional. Precondiciones: que la cola este creada y no est llena

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

57

Postcondiciones: La cola con un elemento ms agregado por el final. 2._ ELIMINAR/DESENCOLAR: Utilidad: elimina el primer elemento que se agreg a una cola Dato de entrada: La cola a la que se va a quitar el elemento Dato de salida: La cola con un elemento menos y el elemento que se elimin Precondiciones: La cola este creada y no este vaca. Postcondiciones: La cola con un elemento menos eliminado por el frente de la 3._ VACIA: Utilidad: Verificar si una determinada cola se encuentra vaca o no. Datos de entrada: La cola que se va a verificar. Datos de salida: Booleano, que indique si la cola est vaca o no. Precondiciones: Que la cola a verificar exista Postcondiciones: Ninguna 4._ LLENA: Utilidad: Verificar si una determinada cola este llena o no. Dato de entrada: La cola que se va a verificar Dato de salida: Valor booleano que indique si la cola est llena o no Precondiciones: la cola este creada. Postcondiciones: Ninguna

cola.

Nivel fsico: Implementacin de operaciones de Colas MODELADO:


Cola - dato: Object - sig : Cola + top : Cola + last: Cola + Cola( ) + Cola (dato: Object) + getDato( ): Object + getSig ( ): Cola + setDato( dato: Object) + setSig(nodo:Cola ) + esVacia( ):boolean + encolar(Object d):void + desencolar( ):void + print( ):Object

IMPLEMENTACIN DE COLAS
publicclassCola{ privateObjectdato; privateColasig; publicColatop; publicColalast; publicCola(){ top=last=null; } publicCola(Objectdato){ this.dato=dato; this.sig=null; } publicObjectgetDato(){ returndato; } publicColagetSig(){ returnsig;

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

58

} publicvoidsetSig(Colanodo){ this.sig=nodo; } publicbooleanesVacia(){ if(top==null){ returntrue; }else{ returnfalse; } } publicvoidvaciar(){ top=last=null; } publicvoiddesencolar(){ if(esVacia()){ System.out.print("\nErroraldesencolar..."); }else{ System.out.print("\n>["+top.getDato()+"]"); top=top.getSig(); } } //Implementaciondelexamen publicObjectdesencolarDato(){ Objectd=null; if(esVacia()){ System.out.print("\nErroraldesencolar..."); }else{ d=top.getDato(); top=top.getSig(); } returnd; } publicvoidencolar(Objectd){ Colatemp=newCola(d); if(esVacia()){ top=last=temp; }else{ last.setSig(temp); last=temp; } System.out.print("\n<["+last.getDato()+"]"); } publicvoidprint(){ Colaaux; aux=top; System.out.print("\nCola:["); while(aux!=null){ if(aux.getSig()!=null){ System.out.print(aux.getDato()+","); }else{ System.out.print(aux.getDato()); } aux=aux.getSig(); }

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

59

System.out.print("]"); } publicstaticvoidmain(String[]args)throwsException{ Colac=newCola(); c.encolar("Maria"); c.encolar("Jose"); c.encolar("Juan"); c.encolar("Andres"); c.print(); c.desencolar(); c.desencolar(); c.desencolar(); c.desencolar(); c.desencolar(); c.encolar("Xavier"); c.encolar("Gabrielita"); c.encolar("Franklin"); System.out.println("\nNododesencolado:"+c.desencolarDato()); c.desencolar(); c.print(); } } En java tambin existe un Api propio para trabajar con la Estructura Cola, se trata de la Interfaz Queue, podrias utilizar la colas con prioridad instanciando objetos de la Clase PriorityQueue... INVESTIGA..!!!

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

60

RECURSIN
La recursividad: es una nueva forma de ver las acciones repetitivas permitiendo que un mtodo se llame as mismo para resolver una versin ms pequea del problema original.

El concepto de recursividad va ligado al de repeticin. Son recursivos aquellos algoritmos que, estando encapsulados dentro de un mtodo, son llamados desde ella misma una y otra vez, en contraposicin a los algoritmos iterativos, que hacen uso de bucles while, do-while, for, etc. 6.1 Definicin La recursividad es una funcin que se llama a s misma para dividir un problema en problemas ms sencillos, el mtodo recursivo debe estar compuesto de una caso base para el cual ya se conoce un resultado y una llamada al mismo mtodo con una versin ligeramente ms sencilla del problema inicial. Algo es recursivo si se define en trminos de s mismo (cuando para definirse hace mencin a s mismo). Para que una definicin recursiva sea vlida, la referencia a s misma debe ser relativamente ms sencilla que el caso considerado. 6.2 Elementos de la Recursin En la resolucin de algoritmos recursivos es imprescindible encontrar estos dos elementos. Axioma: Es un caso donde el problema puede resolverse sin tener que hacer uso de una nueva llamada a s mismo. Evita la continuacin indefinida de las partes recursivas. Formula recursiva:Relaciona el resultado del algoritmo con resultados de casos ms simples. Se hacen nuevas llamadas a la funcin, pero estn ms prximas al caso base. 6.3 Tipos de Recursin

Directa: es la que la funcin se llama as misma. Indirecta: es la recursin que se produce cuando la funcin se llama no as misma sino a otra funcin (y esta quizs a otra) que termina llamando a la funcin inicial. Se produce as una cadena: f (a) g(b) h(c) . . . f (a0)

6.4

Modos de recursin

Existen distintos modos de hacer la recursin:

De cabeza: la recursin de cabeza se produce cuando la llamada recursiva se hace justo al principio del mtodo recursivo, antes que ninguna otra operacin. De cola: por el contrario, en la de cola la llamada se hace al final despus de todas las

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

61

operaciones intermedias implica la existencia de operaciones antes y despus de la llamada recursiva. Mltiple: se producen varias llamadas, recursivas en distintos puntos del mtodo. Anidada: la anidada o no primitiva es aquella en la que la recursin se produce en un parmetro de la propia llamada recursiva. Es decir, al hacer la llamada recursiva se utiliza un parmetro que es el resultado de una llamada recursiva. 6.5 Implementacin interna en un ordenador En un lenguaje de programacin, cuando se llama a un mtodo, lo que se hace es que se guarda la direccin de la sentencia llamante como direccin de retorno; se asigna nueva memoria para las variables locales del procedimiento, y al finalizar la ejecucin del procedimiento, se libera la memoria asignada a las variables locales y se vuelve la ejecucin al punto en que se hizo la llamada haciendo uso de la direccin de retorno, direccin de la instruccin que sigue a la instruccin de llamada al mtodo. Por otro lado, tenemos que estudiar dos conceptos ms. Uno es la pila (stack ) y el otro son los registros de activacin de los procedimientos. Una pila es una estructura de datos en la que solo cabe aadir o quitar un dato cada vez, pero, tal y como se hace con una pila de libros, por ejemplo, para el dato a extraer solo es accesible el ltimo libro que se apilo. El registro de activacin de un mtodo es un bloque de memoria que contiene informacin sobre las constantes, variables locales declaradas en el procedimiento y los parmetros que se le pasen en esa llamada al mtodo, junto con la direccin de retorno que corresponde a esa llamada. Los lenguajes de programacin actuales utilizan una pila especial que el sistema tiene para las llamadas a subrutinas. En esta pila el cdigo mquina del programa cada vez que tiene que llamar a un procedimiento guarda su registro de activacin. Si dentro de esta subrutina se llama de nuevo as misma en forma recurrente, dado que la creacin del registro de activacin del propio mtodo se hace sobre una pila sin borrar los registros de activacin anteriores, se puede generar uno nuevo para cada llamada recursiva. Al final nos encontramos con que con cada llamada recursiva se estn apilando registros de activacin sobre los registros de activacin de las llamadas anteriores. Cuando una de las llamadas recursivas se resuelve por fin sin recursin, su registro de activacin se quita de la pila (se desapila) siguiendo la ejecucin del programa por donde iba cuando se llam esta ltima vez. Y por tanto siguiendo tambin con las variables y parmetros que se tenan en aqu el momento. De nuevo, cuando esta llamada se resuelve sin recursin, se repite la disminucin de la pila y vuelta al estado anterior. Debido a la sobrecarga (overhead ) que producen las operaciones sobre la pila, la creacin y borrado de los registros de activacin, los mtodos recursivos consumen

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

62

mas tiempo y memoria que los programas no recursivos. Solo en determinadas ocasiones, debido a la estructura de datos usada en el problema o al planteamiento del mismo la recursin es preferible, y evitar la recursin es bastante ms difcil que dar una solucin recursiva al problema. 6.6 Verificacin de la correccin de un algoritmo recursivo Para comprobar que un algoritmo recursivo funciona correctamente es necesario que siga las tres reglas siguientes: 1. Existe un caso base (por cada llamada recursiva que se haga dentro del algoritmo debe haber un valor) para el cual el algoritmo finalice sin recursin. Por ejemplo, fact(0) =0 sin recursin. En el algoritmo factorial se produce una llamada recursiva con lo cual es suficiente con un caso base. 2. Todos los posibles argumentos de las llamadas recursivas se renvan tendiendo sus valores hacia un caso base. En el caso del factorial, ya que la llamada recursiva que se hace es con fact(n-1) y n se supona natural, tienden para valores de n > 0 al valor 0. 3. La funcin es correcta, para valores distintos del caso base. En el caso del factorial, por induccin, tendramos que si fact(n) = n!, entonces fact(n + 1) = n fact(n) = (n + 1)! En general la bsqueda de una solucin recursiva de los algoritmos se facilita mediante la localizacin de los casos bases. Una vez respondidos a ellos, se trata de que el argumento en general tienda a estos valores. 6.7 Conveniencia del uso de la recursividad La recursin debera de evitarse siempre que se pueda por motivos de eficiencia, Sin embargo, seria justificable emplearla cuando: Se sabe que la funcin no va a generar demasiada profundidad de llamadas recursivas; particularmente por que la pila del sistema donde se guardan todos las variables locales y parmetros, es relativamente pequea y podra colapsar el sistema. Se sabe que la funcin no va a utilizar estructuras de datos locales demasiado grandes. Si as fuese el caso, aunque la solucin se mantuviese como recursiva habra que recurrir a otra forma de mantener los datos. Cada llamada no genera a su vez llamadas ya resueltas en otras llamadas que se generarn o se han generado antes. Este problema hay que analizarlo antes y es frecuente en recursin. Es una fuente de ineficiencia usual en recursin el que una funcin se evalu mltiples veces con el mismo valor de parmetro en las llamadas recursivas generadas internamente. La solucin no es planteable de forma sencilla de otra manera. Ocurre en muchos casos que la forma recursiva es muy mas clara que la iterativa.

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

63

6.8

Ejemplos de programas recursivos


Ejemplo 1:Factorial de un nmero

public classFactorial{ staticintfac(intn){ if(n==1){ return1; }else{ return(n*fac(n1)); } } publicstaticvoidmain(String[]arg){ System.out.println("Elfactorialde5es:"+fac(5)); } } Ejemplo 2:Fibonacci

//presenta los n primeros fibonacci publicclassFibonacci{ publicstaticintfibo(intn){ if(n<2){ returnn; } else{ returnfibo(n1)+fibo(n2); } } publicstaticvoidmain(String[]arg){ for(inti=0;i<10;i++){ System.out.print(fibo(i)+","); } } }

EJERCICIOS PARA RESOLVER EN CLASE Ejercicio 1. Programar un algoritmo recursivo que permita hacer la divisin por restas sucesivas. Ejercicio 2. Programar un algoritmo recursivo que permita invertir un nmero. Ejemplo: Entrada: 123 Salida: 321

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

64

Ejercicio 3. Programar un algoritmo recursivo que permita sumar los dgitos de un nmero. Ejemplo: Entrada: 123 Resultado:6 Ejercicio 4. Programar un algoritmo recursivo que permita sumar los elementos de un vector. Ejercicio 5. Programar un algoritmo recursivo que calcule el Mximo comn divisor de dos nmeros. Ejercicio 6. Programar un algoritmo recursivo que muestre el numero menor de un vector. Ejercicio 7. Programar un algoritmo recursivo que muestre el numero mayor de un vector.

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

65

MTODOS DE BUSQUEDA Y ORDENACIN

7.1 Anlisis de Algoritmos Las estructuras pueden implementarse de diferentes maneras, y es ms, existen algoritmos para implementar dichas estructuras. El uso de estructuras de datos adecuadas pueden hacer trivial el diseo de un algoritmo, o un algoritmo muy complejo puede usar estructuras de datos muy simples. Uno de los algoritmos ms antiguos conocidos es el algoritmo del matemtico griego Euclides. El trmino algoritmo proviene del matemtico Mohammed ibn Musa alKhowarizmi, matemtico Persa (actual Irn), que vivi aproximadamente entre los aos 780 y 850 d.C. (Siglo IX) El describi la realizacin de operaciones elementales en el sistema de numeracin decimal. De al-Khwarizmi se obtuvo la derivacin algoritmo. 7.2 Clasificacin de algoritmos Algoritm o determinista: en cada paso del algoritmo se determina de forma nica el siguiente paso. Algoritmo no determinista: deben decidir en cada paso de la ejecucin entre varias alternativas y agotarlas todas antes de encontrar la solucin. Todo algoritmo tiene una serie de caractersticas, entre otras que requiere una serie de recursos, algo que es fundamental considerar a la hora de implementarlos en una mquina. Estos recursos son principalmente: El tiempo: perodo transcurrido entre el inicio y la finalizacin del algoritmo. La memoria: la cantidad (la medida vara segn la mquina) que necesita el algoritmo para su ejecucin. Obviamente, la capacidad y el diseo de la mquina pueden afectar al diseo del algoritmo. En general, la mayora de los problemas tienen un parmetro de entrada que es el nmero de datos que hay que tratar, esto es: N. La cantidad de recursos del algoritmo es tratada como una funcin de N. De esta manera puede establecerse un tiempo de ejecucin del algoritmo que suele ser proporcional a una de las siguientes funciones: Tiempo de ejecucin constante. Significa que la mayora de las instrucciones se ejecutan una vez o muy pocas. N: Tiempo de ejecucin lineal. Un caso en el que N valga 40, tardar el doble que otro en que N valga 20. Un ejemplo sera un algoritmo que lee N nmeros enteros y devuelve la media aritmtica. N2: Tiempo de ejecucin cuadrtico. Suele ser habitual cuando se tratan pares de elementos de datos, como por ejemplo un bucle anidado doble. Si N se duplica, el tiempo de ejecucin aumenta cuatro veces. El peor caso de entrada del algoritmo Quick Sort se ejecuta en este tiempo. logN: Tiempo de ejecucin logartmico. Se puede considerar como una gran constante. La base del logaritmo (en informtica la ms comn es la base 2) cambia la constante, pero no demasiado. El programa es ms lento cuanto ms crezca N, pero es inapreciable, pues logN no se duplica hasta que N llegue a N2. NlogN: El tiempo de ejecucin es NlogN. Es comn encontrarlo en algoritmos como Quick Sort y otros del estilo divide y vencers. Si N se duplica, el tiempo de ejecucin es ligeramente mayor del doble. N3 : Tiempo de ejecucin cbico. Como ejemplo se puede dar el de un bucle anidado triple. Si N se duplica, el tiempo de ejecucin se multiplica por ocho.

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

66

N 2N :Tiempo de ejecucin exponencial. No suelen ser muy tiles en la prctica por el elevadsimo tiempo de ejecucin. El problema de la mochila resuelto por un algoritmo de fuerza bruta -simple vuelta atrs- es un ejemplo. Si N se duplica, el tiempo de ejecucin se eleva al cuadrado. k Algoritmos polinomiales: aquellos que son proporcionales a N . Son en general factibles. Algoritmos exponenciales: aquellos que son proporcionales a kN. En general son infactibles salvo un tamao de entrada muy reducido. Notacin O-grande: en general, el tiempo de ejecucin es proporcional, esto es, multiplica por una constante a alguno de los tiempos de ejecucin anteriormente propuestos, adems de la suma de algunos trminos ms pequeos. As, un 2 algoritmo cuyo tiempo de ejecucin sea T = 3N + 6N se puede considerar 2 2 proporcional a N . En este caso se dira que el algoritmo es del orden de N , y se 2 escribe O(N ) 2 Los grafos definidos por matriz de adyacencia ocupan un espacio O(N ), siendo N, el nmero de vrtices de ste. La notacin O-grande ignora los factores constantes, es decir, ignora si se hace una mejor o peor implementacin del algoritmo, adems de ser independiente de los datos de entrada del algoritmo. Es decir, la utilidad de aplicar esta notacin a un algoritmo es encontrar un lmite superior del tiempo de ejecucin, es decir, el peor caso. A veces ocurre que no hay que prestar demasiada atencin a esto. Conviene diferenciar entre el peor caso y el esperado. Por ejemplo, el tiempo de 2 ejecucin del algoritmo Quick Sort es de O(N ). Sin embargo, en la prctica este caso no se da casi nunca y la mayora de los casos son proporcionales a NlogN. Es por ello que se utiliza esta ltima expresin para este mtodo de ordenacin. Una definicin rigurosa de esta notacin es la siguiente: Una funcin g(N) pertenece a O(f(N)) si y slo si existen las constantes c 0 y N0 tales que: |g(N)| <= |c 0f(N)| , para todo N >= N0.

7.3 Clasificacin de problemas Los problemas matemticos se pueden dividir en primera instancia en dos grupos: Problemas indecidibles: aquellos que no se pueden resolver mediante un algoritmo. Problemas decidibles: aquellos que cuentan al menos con un algoritmo para su cmputo. Sin embargo, que un problema sea decidible no implica que se pueda encontrar su solucin, pues muchos problemas que disponen de algoritmos para su resolucin son inabordables para un computador por el elevado nmero de operaciones que hay que realizar para resolverlos. Esto permite separar los problemas decidibles en dos:

Intratables: aquellos para los que no es factible obtener su solucin. Tratables: aquellos para los que existe al menos un algoritmo capaz de resolverlo en un tiempo razonable.

Los problemas pueden clasificarse tambin atendiendo a su complejidad. Aquellos problemas para los que se conoce un algoritmo polinmico que los resuelve se denominan clase P. Los algoritmos que los resuelven son deterministas. Para otros

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

67

problemas, sus mejores algoritmos conocidos son no deterministas. Esta clase de problemas se denomina clase NP. Por tanto, los problemas de la clase P son un subconjunto de los de la clase NP, pues slo cuentan con una alternativa en cada paso. 7.4 BSQUEDA La bsqueda de un elemento dentro de un array es una de las operaciones ms importantes en el procesamiento de la informacin, y permite la recuperacin de datos previamente almacenados. El tipo de bsqueda se puede clasificar como interna o externa, segn el lugar en el que est almacenada la informacin (en memoria o en dispositivos externos). Todos los algoritmos de bsqueda tienen dos finalidades: Determinar si el elemento buscado se encuentra en el conjunto en el que se busca. Si el elemento est en el conjunto, hallar la posicin en la que se encuentra. Nos centramos en la bsqueda interna. Como principales algoritmos de bsqueda en arrays tenemos la bsqueda secuencial, la binaria y la bsqueda mediante transformacin de claves hash. 7.4.1 Bsqueda secuencial Consiste en recorrer y examinar cada uno de los elementos del array hasta encontrar el o los elementos buscados, o hasta que se han mirado todos los elementos del array. Implementacin de la Bsqueda Secuencial
publicintsecuencial(intA[],intelemb){ inti; for(i=0;i<A.length;i++){ if(A[i]==elemb) returni; } return1; } //Elarreglodebeestarordenado publicintsecuencialOpt(intA[],intelemb){ inti; for(i=0;A[i]<=elemb&&i<A.length;i++){ } if(A[i1]==elemb){ returni1; }else{ return1; } }

7.4.2 Bsqueda binaria o dicotmica La condicin ms importante para poder utilizar este algoritmo, es que el array debe estar ordenado. La bsqueda binaria consiste en dividir el array por su elemento medio en dos subarrays ms pequeos, y comparar el elemento con el del centro. Si coinciden, la bsqueda se

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

68

termina. Si el elemento es menor, debe estar (si est) en el primer subarray, y si es mayor est en el segundo. Ejemplo: Para buscar el elemento 3 en el array {1, 2, 3, 4, 5, 6, 7, 8, 9} se realizaran los siguientes pasos: Se toma el elemento central y se divide el array en dos: {1, 2, 3, 4}- 5 -{ 6, 7, 8, 9} Como el elemento buscado (3) es menor que el central (5), debe estar en el primer subarray: {1,2,3,4} Se vuelve a dividir el array en dos: {1}- 2 -{3, 4} Como el elemento buscado es mayor que el central, debe estar en el segundo subarray: {3,4} Se vuelve a dividir en dos: {}- 3 -{4} Como el elemento buscado coincide con el central, lo hemos encontrado. Si al final de la bsqueda todava no lo hemos encontrado, y el subarray a dividir est vaco {}, el elemento no se encuentra en el array. En general, este mtodo realiza log(2,n+1) comparaciones antes de encontrar el elemento, o antes de descubrir que no est. Este nmero es muy inferior que el necesario para la bsqueda lineal para casos grandes. Este mtodo tambin se puede implementar de forma recursiva, siendo la funcin recursiva la que divide al array en dos ms pequeos.
publicintbinaria(intA[],intelemb){ intdesde,hasta,medio,pos; desde=0; hasta=A.length1; pos=1; while(desde<=hasta){ if(desde==hasta){ if(A[desde]==elemb) pos=desde; else pos=1; break; } medio=(desde+hasta)/2; if(A[medio]==elemb){ pos=medio; break; }else{ if(A[medio]>elemb) hasta=medio1; else desde=medio+1; } } returnpos;

Implementacin de la Bsqueda Binaria

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

69

7.5 ORDENACIN Los mtodos de ordenacin, bsqueda e intercambio, son operaciones bsicas en las que las computadoras emplean la mitad de su tiempo. Su mayor utilizacin se d en las estructuras arreglos y archivos. La ordenacin tambin es conocida como clasificacin, no es ms que la operacin de organizar un conjunto da datos en un orden dado, que puede ser creciente o decreciente. Existe gran cantidad de algoritmos diseados para clasificar listas de elementos, la eleccin del mejor mtodo depende del tamao del vector o archivo, el tipo de datos a ordenar y la cantidad de memoria fsica disponible. Categoras Interna: Se utiliza para la ordenacin de vectores o arreglos, tablas etc. Externa: Se utiliza para la ordenacin de datos de un archivo. Diferencias entre ordenacin interna y externa Interna Externa Los datos se almacenan en Los datos se almacenan en memoria interna, que es de gran soportes de almacenamiento velocidad y acceso aleatorio externo: discos, cintas, que resultan ms lentos pero contienen mayor cantidad de informacin. 7.5.1 Mtodo de Intercambio El mtodo de intercambio es el ms sencillo de todos. Se basa en: la lectura sucesiva de la lista a ordenar, comparando el elemento inferior o superior (dependiendo de la forma del recorrido) de la lista con todos los restantes, efectuando el Intercambio de posiciones cuando el orden resultante no sea correcto. Ejemplo: a = { 8, 4, 6, 2 } Pasada 1: Se compara a[0] con todos, as primero se cambia a[0] con a[1] pues a[0] > a[1] y debe ser Ascendente, es decir a[0]<a[1] y por utimo a[0] con a[3]. 26 {4, 8, 6, 2} => Se intercambia 4 por 8. {4, 8, 6, 2} {2, 8, 6, 4} => Se intercambia 2 por 4. Pasada 2: El elemento ms pequeo esta en a[0] y se analiza la sublista restante, es decir comenzamos en el siguiente elemento a[1]. Al cabo de la pasada, el segundo ms chico esta en a[1] y as sucesivamente. {2, 6, 8, 4} => Se intercambia 6 por 8. {2, 4, 8, 6} => Se intercambia 4 por 6. Pasada 3: Ahora nos toca comparar con el elemento a[2]. {2, 4, 6, 8} => Se intercambia 6 por 8.

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

70

Se terminan las pasadas y el arreglo o lista queda ordenado. Anlisis del mtodo: Nmero de Pasadas = n 1; Nmero Mximo de Comparaciones = (n-1) (n-2) Tiempo de Ejecucin = 0 (n2); donde n es el nmero de elementos en el arreglo o lista. Implementacin del Mtodo de Intercambio
//Ordena ascendentemente por el mtodo de Intercambio publicvoidintercambio(inta[]){ intaux; for(inti=0;i<=a.length2;i++){ for(intj=i+1;j<=a.length1;j++){ if(a[i]>a[j]){ aux=a[i]; a[i]=a[j]; a[j]=aux; } } } }

7.5.2 Mtodo de la burbuja Es un mtodo mejorado con respecto al intercambio, en donde los elementos burbujean, es decir, los ms grandes, caen al fondo del array (posicin n-1) y los ms mas chicos suben a la cima (posicin 0). Estudia parejas de elementos Adyacentes, a[0] y a[1], a[1] y a[2]a[i] y a[i+1] a[n 2] y a[n1]. Si a[i+1] < a[i] Entonces los INTERCAMBIA Ejemplo: {40,21,4,9,10,35}: Pasada 1: {21, 40, 4, 9, 10, 35} <-- Se cambia el 21 por el 40. {21, 4, 40, 9, 10, 35} <-- Se cambia el 40 por el 4. {21, 4, 9, 40, 10, 35} <-- Se cambia el 9 por el 40. {21, 4, 9, 10, 40, 35} <-- Se cambia el 40 por el 10. {21, 4, 9, 10, 35, 40} <-- Se cambia el 35 por el 40. Pasada 2: {4, 21, 9, 10, 35, 40} <-- Se cambia el 21 por el 4. {4, 9, 21, 10, 35, 40} <-- Se cambia el 9 por el 21. {4, 9, 10, 21, 35, 40} <-- Se cambia el 21 por el 10. {4, 9, 10, 21, 35, 40} Ya estn ordenados, pero habra que hacer una tercera, cuarta y quinta pasada. Anlisis del mtodo:

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

71

Nmero de Pasadas = n 1; Nmero Mximo de Comparaciones = n(n-1)/2 Tiempo de Ejecucin = 0 (n2); dnde n es el nmero de elementos en el arreglo o lista. Implementacin del Mtodo de la Burbuja
//Ordena ascendentemente por el mtodo de la Burbuja publicvoidburbuja(inta[]){ intaux; for(inti=0;i<=a.length1;i++){ for(intj=0;j<a.lengthi1;j++){ if(a[j+1]<a[j]){ aux=a[j+1]; a[j+1]=a[j]; a[j]=aux; } } } }

7.5.3 Mtodo de seleccin. Este mtodo consiste en buscar el elemento ms pequeo del array y ponerlo en la primera posicin; luego, entre los restantes, se busca el elemento ms pequeo y se coloca en segundo lugar, y as sucesivamente hasta colocar el ltimo elemento. Por lo tanto, debe realizar sucesivas pasadas hasta que no haya posiciones restantes. Ejemplo: {40, 21, 4, 9, 10, 35} Pasada 1: {4, 21, 40, 9, 10, 35} <-- Se coloca el 4, el ms pequeo, en primera posicin: se cambia el 4 por el 40. Pasada 2: {4, 9, 40, 21, 10, 35} <-- Se coloca el 9, en segunda posicin: se cambia el 9 por el 21. Pasada 3: {4, 9, 10, 21, 40, 35} <-- Se coloca el 10, en tercera posicin: se cambia el 10 por el 40. Pasada 4: {4, 9, 10, 21, 40, 35} <-- Se coloca el 21, en cuarta posicin: ya est colocado. Pasada 5: {4, 9, 10, 21, 35, 40} <-- Se coloca el 35, en quinta posicin: se cambia el 35 por el 40. Anlisis del mtodo: Nmero de Pasadas = n 1; Nmero Mximo de Comparaciones = n(n-1)/2

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

72

Tiempo de Ejecucin = 0 (n2); dnde n es el nmero de elementos en el arreglo o lista. Implementacin del Mtodo de Seleccin
//Ordena ascendentemente por el mtodo de Seleccin publicvoidseleccion(inta[]){ intaux,idmenor; for(inti=0;i<=a.length1;i++){ aux=a[i]; idmenor=i; for(intj=i+1;j<a.length;j++){ if(a[j]<aux){ idmenor=j; aux=a[j]; } } a[idmenor]=a[i]; a[i]=aux; } }

7.5.4 Mtodo de insercin directa Este mtodo lo que se hace es tener una sublista ordenada de elementos del array e ir insertando el resto en el lugar adecuado para que la sublista no pierda el orden. La sublista ordenada se va haciendo cada vez mayor, de modo que al final la lista entera queda ordenada, u otra forma de entender es que, consiste en insertar un elemento en su posicin correcta, dentro de una lista que ya est Ordenada Ejemplo: se tiene {40, 21, 4, 9, 10, 35} {40, 21, 4, 9, 10, 35} <== La primera sublista ordenada es {40}. Insertamos el 21: {40, 40, 4, 9, 10, 35} <== aux=21; {21, 40, 4, 9, 10, 35} <== Ahora la sublista ordenada es {21,40}. Insertamos el 4: {21, 40, 40, 9, 10, 35} <== aux=4; {21, 21, 40, 9, 10, 35} <== aux=4; {4, 21, 40, 9, 10, 35} <== Ahora la sublista ordenada es {4,21,40}. Insertamos el 9: {4, 21, 40, 40, 10, 35} <== aux=9; {4, 21, 21, 40, 10, 35} <== aux=9; {4, 9, 21, 40, 10, 35} <== Ahora la sublista ordenada es {4,9,21,40}. Insertamos el 10: { 4, 9, 21, 40, 40, 35} <== aux=10; {4, 9, 21, 21, 40, 35} <== aux=10; {4, 9, 10, 21, 40, 35} <== Ahora la sublista ordenada es {4,9,10,21,40}. Y por ltimo insertamos el 35: { 4, 9, 10, 21, 40, 40} <== aux=35; {4, 9, 10, 21, 35, 40} <== El array est ordenado. Anlisis del mtodo:

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

73

Dnde n es el nmero de elementos en el arreglo o lista. Peor de los casos: Nmero Mximo de Comparaciones = n*(n+1)/2-1; Tiempo de Ejecucin = 0 (n2); Mejor de los casos (cuando la lista o arreglo ya esta ordenada): Nmero Mximo de Comparaciones = n 2; (Todas ellas falsas). Tiempo de Ejecucin = 0 (n); El caso medio depender de cmo estn inicialmente distribuidos los elementos. Vemos que cuanto ms ordenada est inicialmente ms se acerca a O(n) y cuanto ms desordenada, ms se acerca a O(n2). El peor caso es igual que en los mtodos de burbuja y seleccin, pero el mejor caso es lineal, algo que no ocurra en stos, con lo que para ciertas entradas podemos tener ahorros en tiempo de ejecucin. Implementacin del Mtodo de Insercin Directa
//Ordena ascendentemente por el mtodo de Insercin Directa publicvoidinsercionDirecta(inta[]){ intaux; intj; for(inti=0;i<a.length;i++){ aux=a[i]; for(j=i1;j>=0;j){ if(aux>a[j]){ a[j+1]=aux; break; }else{ a[j+1]=a[j]; } } if(j==1) a[0]=aux; } }

7.5.5 Mtodo shell Debe su nombre a su inventor D.L.Shell, es un Mtodo Avanzado que se le suele llamar Ordenacin Por Insercin con Intervalos Decrecientes, lo cual es una mejora al mtodo de Insercin directa cuando el arreglo o lista tiene una gran cantidad de elementos. En este mtodo no se compara a cada elemento con el de su izquierda, como en el de insercin, sino con el que est a un cierto nmero de lugares (llamado salto) a su izquierda. Este salto es constante, y su valor inicial es N/2 (siendo N el nmero de elementos, y siendo divisin entera). Se van dando pasadas hasta que en una pasada no se intercambie ningn elemento de sitio. Entonces el salto se reduce a la mitad, y se vuelven a dar pasadas hasta que no se intercambie ningn elemento, y as sucesivamente hasta que el salto vale 1. Ejemplo: se tiene {40, 21, 4, 9, 10, 35}

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

74

n=6 Salto = 3; dnde n/2; Primera pasada: {9, 21, 4, 40, 10, 35} <== se intercambian el 40 y el 9. {9, 10, 4, 40, 21, 35} <== se intercambian el 21 y el 10. {9, 10, 4, 40, 21, 35} Salto = 1; dnde salto/2 ; Primera pasada: {9, 10, 4, 40, 21, 35} {9, 4, 10, 40, 21, 35} <== se intercambian el 10 y el 4. {9, 4, 10, 40, 21, 35} {9, 4, 10, 21, 40, 35} <== se intercambian el 40 y el 21. { 9, 4, 10, 21, 35, 40} <== se intercambian el 35 y el 40. Segunda pasada: {4, 9, 10, 21, 35, 40} <== se intercambian el 4 y el 9. Con slo 6 intercambios se ha ordenado el array, cuando por insercin se necesitaban muchos ms. Anlisis del mtodo: Tiempo de Ejecucin = O(n*(Log2 n)); Dnde n es el nmero de elementos en el arreglo o lista. Implementacin del Mtodo Shell
//Ordena ascendentemente por el mtodo de Shell publicvoidshellsm(inta[]){ intaux,c,s; s=a.length; while(s!=1){ s=s/2; c=1; while(c==1){ c=0; for(inti=0;i<a.lengths;i++){ if(a[i]>a[i+s]){ aux=a[i]; a[i]=a[i+s]; a[i+s]=aux; c=1; } } } } }

7.5.6 Mtodo de ordenacin rpida (quicksort) Este mtodo se basa en la tctica "divide y vencers" que consiste en ir subdividiendo el array en arrays ms pequeos, y ordenar stos. Para hacer esta divisin, se toma un valor del array como pivote, y se mueven todos los elementos menores que este pivote a

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

75

su izquierda, y los mayores a su derecha. A continuacin se aplica el mismo mtodo a cada una de las dos partes en las que queda dividido el array. Normalmente se toma como pivote el primer elemento de array, y se realizan dos bsquedas: una de izquierda a derecha, buscando un elemento mayor que el pivote, y otra de derecha a izquierda, buscando un elemento menor que el pivote. Cuando se han encontrado los dos, se intercambian, y se sigue realizando la bsqueda hasta que las dos bsquedas se encuentran. Ejemplo: Para dividir el array {21,40,4,9,10,35}, los pasos seran: {21, 40, 4, 9, 10, 35} <== se toma como pivote el 21. La bsqueda de izquierda a derecha encuentra el valor 40, mayor que pivote, y la bsqueda de derecha a izquierda encuentra el valor 10, menor que el pivote. Se intercambian: {21, 10, 4, 9, 40, 35} <== Si seguimos la bsqueda, la primera encuentra el valor 40, y la segunda el valor 9, pero ya se han cruzado, as que paramos. Para terminar la divisin, se coloca el pivote en su lugar (en el nmero encontrado por la segunda bsqueda), el 9, quedando: {9, 10, 4, 21, 40, 35} <== Ahora tenemos dividido el array en dos arrays ms pequeos: el {9,10,4} y el {40,35}, y se repetira el mismo proceso. La implementacin es claramente recursiva y suponiendo el pivote el primer elemento del array, el programa sera (en el mtodo main): ordenar(array,0,array.length); // Para llamar a la funcin. Anlisis del mtodo: Tiempo de Ejecucin = O(n(Log n)); Dnde n es el nmero de elementos en el arreglo o lista. Implementacin del Mtodos Quicksort
//Ordena ascendentemente por el mtodo de Quick Sort publicvoidquicks(int[]a,intizq,intder){ inti=izq; intj=der; intpivote=a[(izq+der)/2]; do{ while(a[i]<pivote){ i++; } while(a[j]>pivote){ j; } if(i<=j){ intaux=a[i]; a[i]=a[j]; a[j]=aux; i++; j; } }while(i<=j);

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

76

if(izq<j){ quicks(a,izq,j); } if(i<der){ quicks(a,i,der); } } //Presenta los elementos del arreglo publicvoidpresenta(Stringmsg,inta[]){ System.out.print(msg+":"); System.out.print("["); for(inti=0;i<=a.length1;i++){ if(i<a.length1){ System.out.print(a[i]+","); }else{ System.out.print(a[i]+"]"); } } System.out.print("\n"); }

EJERCICIOS PROPUESTOS
Investigar y desarrollar una variacin del algoritmo burbuja denominada ordenacin por hueco.

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

77

RBOLES
Introduccin Analiza: Ejemplos donde se aplican los rboles: son los
sistemas de ficheros, diagrama modular, eliminatorias deportivas, organigramas de empresas etc, etc

8.1

Piensa en otras aplicaciones informticas de la vida real, en donde se utilice la estructura: Arbol, comenta con tus compaeros y con tu profesora..!!!

Los rboles tienen una gran variedad de aplicaciones. Por ejemplo, se pueden utilizar para representar frmulas matemticas, para organizar adecuadamente la informacin, para construir un rbol genealgico, para el anlisis de circuitos elctricos y para numerar los captulos y secciones de un libro. Los rboles representan las estructuras no lineales y dinmicas de datos ms importantes en computacin. Dinmicas porque las estructuras de rbol pueden cambiar durante la ejecucin de un programa. No lineales, puesto que a cada elemento del rbol pueden seguirle varios elementos. Los rboles pueden ser construidos con estructuras estticas y dinmicas. Las estticas son arreglos, registros y conjuntos, mientras que las dinmicas estn representadas por listas. La definicin de rbol es la siguiente: Es una estructura jerrquica aplicada sobre una coleccin de elementos u objetos llamados nodos; uno de los cuales es conocido como raz. Adems se crea una relacin o parentesco entre los nodos dando lugar a trminos como padre, hijo, hermano, antecesor, sucesor, ancestro, etc. Formalmente se define un rbol de tipo T como una estructura homognea que es la concatenacin de un elemento de tipo T junto con un nmero finito de rboles disjuntos, llamados subrbols. Una forma particular de rbol puede ser la estructura vaca. Terminologa bsica de la Estructura rbol

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

78

Raz: nico nodo que no tiene antecesor, es decir, sin padre. Rama: arista formado entre dos nodos. Antecesor: un nodo X es el antecesor de un nodo Y si por alguna de las ramas de X se puede llegar a Y. Sucesor: un nodo X es sucesor de un nodo Y si por alguna de las ramas de Y se puede llegar a X. Grado de un nodo: nmero de descendientes directos que tiene un nodo. Grado del rbol: es el mayor grado entre sus nodos. Nodo interno: es aquel que tiene al menos un descendiente o nodo hijo. Nodo hoja (externo): nodo que no tiene descendientes o no tiene nodos hijos, posee grado 0. Descendiente directo: hijo Descendientes: hijo, nieto... Subrbol: rbol formado por un nodo y sus descendientes

rbol binario: rbol de grado 2, en donde cada nodo tiene como mucho dos descendientes directos. rbol multicamino: Cada nodo puede tener n descendientes directos. Lista: rbol degenerado de grado 1. Nivel: nmero de ramas que hay que recorrer para llegar de la raz a un nodo; la raz siempre tiene un nivel de 0. Profundidad de un nodo: nmero de predecesores.

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

79

Altura del rbol: profundidad mxima de cualquier nodo o el nivel ms alto del rbol

Camino: Existe un camino del nodo X al nodo Y, o si existe una sucesin de nodos que permitan llegar desde X a Y.

Formas de representar un rbol 1. Mediante un grafo:

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

80

Se utiliza la recursin para definir un rbol porque representa la forma ms apropiada y porque adems es una caracterstica inherente de los mismos. 2. Mediante un diagrama encolumnado:

A continuacin veremos en java como se puede declarar una estructura de datos bsica (se indicar solamente atributos) para un rbol cualesquiera. class NodoArbol { int dato; // informacin del nodo // es un arbol con ramas de hasta 3; NodoArbol nodo1, nodo2, nodo3; // si queremos ms ramas deberamos declarar un array de // objetos de tipo NodoArbol o utilizar Collections, // Vector, ArrayList, que son propias de Java. ..... // Constructor y mtodos propios del nodo. }

Importante: En java tambin existe un api propio para trabajar con rboles tanto en forma visual como es la clase javax.swing.JTree y todo el paquete javax.swing.tree, as como tambin clases no visuales como java.util.TreeMap y java.util.TreeSet INVESTIGA..!!! 8.2 rboles binarios Analiza: Algunas aplicaciones de los rboles binarios pueden
ser: expresiones aritmticas, rboles de decisin, bsqueda (ABB).

Piensa en otras aplicaciones informticas de la vida real, en donde se utilice la estructura: Arbol Binario, comenta con tus compaeros y con tu profesora..!!!
A continuacin se muestra un ejemplo de rbol binario para expresiones aritmticas, donde los nodos internos son los operadores y los nodos hojas son los operandos.

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

81

Un rbol Binario es como un conjunto finito de elementos que bien est vaco o est formado por una raz con dos rboles binarios disjuntos, llamados subrbol izquierdo y derecho de la raz. Las aplicaciones de los arboles binarios son muy variadas ya que se les puede utilizar para representar una estructura en la cual es posible tomar decisiones con dos opciones en distintos puntos. La representacin grfica de un rbol binario es la siguiente:

Terminologa bsica rboles binarios

Nodo raz: es el primer elemento de un rbol binario; un rbol binario slo tiene un nodo raz. Nodo padre: son los nodos que tienen al menos un hijo (derecho y/o izquierdo). Hijo derecho: nodo que se encuentra al lado derecho de otro nodo. Hijo izquierdo: nodo que est al lado izquierdo de otro nodo. Nodo hoja: nodos que no tienen hijos. (Un nodo de un rbol binario puede tener ninguno, uno o dos hijos.) Nodo hermano: nodos que tienen un mismo padre. Ancestros: nodo padre de un nodo o el padre de algn nodo ancestro. (El nodo raz es un ancestro de todos los nodos del rbol.) Nodo descendiente: el hijo de un nodo o el hijo de otro descendiente de ese nodo. (Todos los nodos del rbol son descendientes del nodo raz.) Subrbol izquierdo: todos los descendientes por la izquierda de un nodo forman un subrbol izquierdo, cuya raz es el hijo izquierdo de ese nodo. Subrbol derecho: todos los descendientes por la derecha de un nodo forman un subrbol derecho, cuya raz es el hijo derecho de ese nodo.

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

82

Nivel de un nodo: distancia desde la raz. La raz est en el nivel cero. Cantidad de nodos por los que se tiene que pasar para llegar a un nodo. (El nmero mximo de nodos en el nivel n es 2".)

Propiedades de los rboles binarios

Representacin en Memoria Hay dos formas tradicionales de representar un rbol binario en memoria:
Por medio de datos tipo punteros tambin conocidos como variables dinmicas

o listas. Por medio de arreglos. Sin embargo la ms utilizada es la primera, puesto que es la ms natural para tratar este tipo de estructuras. Los nodos del rbol binario sern representados como registros que contendrn como mnimo tres campos. En un campo se almacenar la informacin del nodo. Los dos restantes se utilizarn para apuntar al subarbol izquierdo y derecho del subarbol en cuestin. Cada nodo se representa grficamente de la siguiente manera:

Operaciones Bsicas

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

83

a) Recorrido de un rbol binario Existen dos formas de recorrer un rbol: Recorrido en amplitud: Consiste en ir visitando el rbol por niveles. Primero se visitan los nodos de nivel 0(como muchos hay uno, la raz), despus los nodos de nivel 1, as hasta que ya no quedan ms. Si se hace el recorrido del rbol siguiente quedar: 4, 2, 6, 5, 8

Recorrido en profundidad: Recorre el rbol por subrboles. Y hay tres maneras de recorrer un rbol: en inorden, preorden y postorden. Cada una de ellas tiene una secuencia distinta para analizar el rbol como se puede ver a continuacin:

1.

PREORDEN Consiste en visitar el nodo actual (visitar puede ser simplemente mostrar la posicin del nodo por pantalla), y despus visitar el subrbol izquierdo y una vez visitado, visitar el subrbol derecho Presorden: 4, 2, 6, 5, 8

2.

INORDEN Se visita el subrbol izquierdo, el nodo actual y luego se visita el subrbol derecho. Inorden: 2, 4, 5, 6, 8

POSTORDEN Se visita primero el subrbol izquierdo, despus el derecho y por ltimo el nodo actual. Postorden: 2, 5, 8, 6, 4 b) Insercin La insercin tampoco es complicada. Es ms, resulta prcticamente idntica a la bsqueda. Cuando se llega a un rbol vaco se crea el nodo en el puntero que se pasa como parmetro por referencia, de esta manera los nuevos enlaces mantienen la coherencia. Si el elemento a insertar ya existe entonces no se hace nada.

3.

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

84

c) Borrado La operacin de borrado si resulta ser algo ms complicada. Se recuerda que el rbol debe seguir siendo de bsqueda tras el borrado. Pueden darse tres casos, una vez encontrado el nodo a borrar: 1) El nodo no tiene descendientes. Simplemente se borra. 2) El nodo tiene al menos un descendiente por una sola rama. Se borra dicho nodo, y su primer descendiente se asigna como hijo del padre del nodo borrado.
Ejemplo de recorridos en la siguiente expresin aritmtica: 2 x (a-1)+(3xb), sin parntesis.

TDA:ARBOLBINARIO Elementos: guardaunconjuntodenodos.Cadaunodeelloscontieneundatohomogneo(simpleo estructurado)nicoenelrbol. Estructura: La organizacin de los datos es una estructura en forma jerrquica o de niveles, restringiendolarelacindeunoadoscomomximo,sincumplirordenamientoalguno. Dominio:Dependedelaaplicacin OPERACIONES: - INSERCIN Utilidad:Insertaunnuevoelementodentrodelrbolbinario Datosdeentrada:elrbolb,dondesevaainsertar,yelnuevoelementoe Datosdesalida:elrbolb,tieneunnuevoelementoinsertadocomohoja Precondicin:elrbolbexisteyelelementoenoestenelrbol Postcondicin:elrbolbcontienealelementonuevoinsertadocomounahoja - ELIMINACIN Utilidad:eliminaunelementodentrodelrbolbinario Datosdeentrada:elrbolb,dondesevaaeliminar,yelelementoodatoaeliminar Datosdesalida:regresafalsosieldatonoseencuentraenelrbol;verdaderosiloencontrylo pudoeliminar,encuyocaso,regresaelrbolmodificado. Precondicin:elrbolbexisteyelelementoodatoestenelrbol Postcondicin:elrbolbcontienealelementomenos. - BUSCAR Utilidad:buscaunelementodentrodelrbolbinario Datosdeentrada:elrbolb,dondesevaabuscar,yelnuevoelementoeporlocalizar Datosdesalida:regresafalsosielvalornoseencuentraenelrbolyunapuntadorpalmacenarla posicindentrodelrboldondeestelvalor. Precondicin:elrbolbexiste Postcondicin:ninguna. - RECORRER Utilidad:despliegaloselementosalmacenadosenunrbolbinario Datosdeentrada:elrbolbadesplegaryelordenenquesedesplegarnloselementos Datosdesalida:cadanodoenelrbolseprocesaexactamenteunavez.Elordenenelquese procesarnlosnodosdependedelvalordelorden.Sielordenes:

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

85

PreOrden:razsubrbolizquierdosubrbolderecho PostOrden:subrbolizquierdosubrbolderechoraz InOrden:subrbolizquierdorazsubrbolderecho. Precondicin:elrbolbexiste Postcondicin:ninguna.

Clasificacin Existen cuatro tipos de rbol binario: A. B. Distinto. A. B. Similares. A. B. Equivalentes. A. B. Completos. B. Distinto Se dice que dos rboles binarios son distintos cuando sus estructuras son diferentes.

A. B. Similares Dos rboles binarios son similares cuando sus estructuras son idnticas, pero la informacin que contienen sus nodos es diferente.

A. B. Equivalentes Son aquellos arboles que son similares y que adems los nodos contienen la misma informacin.

A. B. Completos Son aquellos arboles en los que todos sus nodos excepto los del ltimo nivel, tiene dos hijos; el subarbol izquierdo y el subarbol derecho.

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

86

Implementacin de Arboles binarios


CLASE NODO BINARIO //DefiniciondelaclaseNodoBinario classNodoBinario{ intdato; NodoBinarioHizq,Hder; //Constructores NodoBinario(intElem){ dato=Elem; NodoBinarioHizq,Hder=null; } //Inserciondeunelemento publicvoidInsertaBinario(intElem){ if(Elem<dato){ if(Hizq==null) Hizq=newNodoBinario(Elem); else Hizq.InsertaBinario(Elem); } else{ if(Elem>dato){ if(Hder==null) Hder=newNodoBinario(Elem); else Hder.InsertaBinario(Elem); } } } } CLASE NODO LISTA ARBOL

//Definicion de la Clase NodoLista


classNodosListaA{ NodoBinariodatos; NodosListaAsiguiente; //ConstrutorCreaunnododeltipoObject NodosListaA(NodoBinariovalor){ datos=valor; siguiente=null;//siguienteconvalordenulo } //ConstructorCreaunnododelTipoObjectyalsiguientenododelalista NodosListaA(NodoBinariovalor,NodosListaAsignodo){ datos=valor; siguiente=signodo;//siguienteserefierealsiguientenodo }

} CLASE COLA PARA EL RECORRIDO(ANCHURA) classCola{ NodosListaAPrimerNodo; NodosListaAUltimoNodo; StringNombre;

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

87

//ConstructorconstruyeunalistavaciaconunnombredeList publicCola(){ this("Lista"); } //Constructor publicCola(Strings){ Nombre=s; PrimerNodo=UltimoNodo=null; } //RetornaTruesiListaVacia publicbooleanVaciaLista(){ returnPrimerNodo==null; } //InsertaunElementoalFrentedelaLista publicvoidInsertaInicio(NodoBinarioElemInser){ if(VaciaLista()) PrimerNodo=UltimoNodo=newNodosListaA(ElemInser); else PrimerNodo=newNodosListaA(ElemInser,PrimerNodo); } //InsertaalFinaldelaLista publicvoidInsertaFinal(NodoBinarioElemInser){ if(VaciaLista()) PrimerNodo=UltimoNodo=newNodosListaA(ElemInser); else UltimoNodo=UltimoNodo.siguiente=newNodosListaA(ElemInser); } //EliminaralInicio publicvoidEliminaInicio(){ if(VaciaLista()) System.out.println("Nohayelementos"); //RestablecerlasreferenciasdePrimerNodoyUltimoNodo if(PrimerNodo.equals(UltimoNodo)) PrimerNodo=UltimoNodo=null; else PrimerNodo=PrimerNodo.siguiente; } //Eliminaalfinal publicvoidEliminaFinal(){ if(VaciaLista()) System.out.println("Nohayelementos"); //RestablecerlasreferenciasdePrimerNodoyUltimoNodo if(PrimerNodo.equals(UltimoNodo)) PrimerNodo=UltimoNodo=null; else{ NodosListaAActual=PrimerNodo; while(Actual.siguiente!=UltimoNodo)

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

88

Actual=Actual.siguiente; UltimoNodo=Actual; Actual.siguiente=null; } } } CLASE ARBOL classArbol{ ColaCola=newCola(); NodoBinarioPadre; NodoBinarioRaiz; //Constructor publicArbol(){ Raiz=null; } //Inserciondeunelementoenelarbol publicvoidInsertaNodo(intElem){ if(Raiz==null) Raiz=newNodoBinario(Elem); else Raiz.InsertaBinario(Elem); } //PreordenRecursivodelarbol publicvoidPreorden(NodoBinarioNodo){ if(Nodo==null) return; else{ System.out.print(Nodo.dato+""); Preorden(Nodo.Hizq); Preorden(Nodo.Hder); } } //PostOrdenrecursivodelarbol publicvoidPostOrden(NodoBinarioNodo){ if(Nodo==null) return; else{ PostOrden(Nodo.Hizq); PostOrden(Nodo.Hder); System.out.print(Nodo.dato+""); } } //InordenRecursivodelarbol publicvoidInorden(NodoBinarioNodo){ if(Nodo==null) return; else{ Inorden(Nodo.Hizq);

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

89

System.out.print(Nodo.dato+""); Inorden(Nodo.Hder); } } CLASE ARBOL BINARIO classArbolBinario{ publicstaticvoidmain(String[]args){ ArbolA=newArbol(); A.InsertaNodo(10); A.InsertaNodo(7); A.InsertaNodo(8); A.InsertaNodo(6); A.InsertaNodo(12); A.InsertaNodo(11); A.InsertaNodo(5); A.InsertaNodo(4); A.InsertaNodo(3); A.InsertaNodo(2); System.out.print("ElrecorridoenPreordenes:"); A.Preorden(A.Raiz); System.out.println(); System.out.print("ElrecorridoenInordenes:"); A.Inorden(A.Raiz); System.out.println(); System.out.print("ElrecorridoenPostordenes:"); A.PostOrden(A.Raiz); System.out.println(); System.out.println("Laalturadelarboles:"+A.Altura(A.Raiz)); A.Anchura(A.Raiz); } } SALIDAPORCONSOLA ElrecorridoenPreordenes:1076543281211 ElrecorridoenInordenes:2345678101112 ElrecorridoenPostordenes:2345687111210 Laalturadelarboles:6 ElrecorridoenAnchuraes:1071268115432

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

90

9 RBOLES BINARIOS DE BSQUEDA (ABB)


Un rbol binario de bsqueda es aquel que dado un nodo, todos los datos del subrbol izquierdo son menores que los datos de ese nodo, mientras que todos los datos del subrbol, derecho son mayores que sus propios datos. Tambin, se denominan arboles binarios de bsqueda, debido a que se pueden buscar en ellos un valor utilizando un algoritmo de bsqueda binaria similar al empleado en arrays. Los rboles de bsqueda se pueden utilizar como diccionarios y como colas de prioridad. Propiedad de un rbol bsqueda binaria Sea x un nodo en un rbol de bsqueda binaria. Si y es un nodo del sub-rbol izquierdo de x, entonces la clave de y tiene que ser a la clave de x. Si z es un nodo del sub-rbol derecho de x, entonces la clave de x tiene que ser a la clave de z. La propiedad del rbol de bsqueda nos permite imprimir o recorrer sus nodos en el orden de sus claves haciendo uso de un simple algoritmo recursivo. Ejemplo: Construya un rbol binario de bsqueda para la siguiente lista de nmeros: 65, 75, 30, 4, 41, 85. rbol binario de bsqueda para nodos con el campo de datos de tipo int. 30 menor que 55 41 mayor que 30 75 mayor que 55 85 mayor que 75 4 menor que 30
4 5 5

3 0

7 5 8 5

4 1

Claves y valores

Si los rboles binarios de bsqueda estn ordenados, deben estarlo segn alguna clave incluida en cada nodo del rbol. Un nodo puede contener nicamente la clave, pero suele resultar til permitir que cada nodo contenga una clave y un valor. Pueden ser de cualquier clase que desee, pero todos los nodos deben contener claves y valores que sean instancias de la misma clase. La clave se utiliza para analizar el nodo. El valor es un dato adicional del nodo indexado por la clave. Las estructuras de datos con pares clave/valor suelen recibir el nombre de mapas.

Como ejemplo, consideramos las entradas de una agenda de telfonos tal como se insertaran en un rbol binario de bsqueda. El apellido del abonado sera la clave y el nmero de telfono sera el valor.

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

91

Una ventaja fundamental de los rboles de bsqueda es que son en general mucho ms rpidos para localizar un elemento que una lista enlazada. Por tanto, son ms rpidos para insertar y borrar elementos. Si el rbol est perfectamente equilibrado esto es, la diferencia entre el nmero de nodos del subrbol izquierdo y el nmero de nodos del subrbol derecho es a lo sumo 1, para todos los nodos- entonces el nmero de comparaciones necesarias para localizar una clave es aproximadamente de logN en el peor caso. Adems, el algoritmo de insercin en un rbol binario de bsqueda tiene la ventaja sobre los arrays ordenados, donde se empleara bsqueda dicotmica para localizar un elemento de que no necesita hacer una reubicacin de los elementos de la estructura para que esta siga ordenada despus de la insercin. Dicho algoritmo funciona avanzando por el rbol escogiendo la rama izquierda o derecha en funcin de la clave que se inserta y la clave del nodo actual, hasta encontrar su ubicacin. El algoritmo de borrado en rboles es algo ms complejo, pero ms eficiente que el de borrado en un array ordenado. Eficacia de la bsqueda binaria

Parece intuitivo pensar que las operaciones bsicas del rbol binario de bsqueda deberan requerir un tiempo O (h), donde h es la altura del rbol. Pero se deduce que la altura de un rbol binario equilibrado es, aprox., log2(n), donde n es el nmero de elementos si el rbol permanece equilibrado. Se puede demostrar que, si las claves se insertan aleatoriamente en un rbol binario de bsqueda, esta condicin se cumplir y que el rbol permanecer lo suficientemente equilibrado para que la hora de bsqueda y de insercin sea aproximadamente O (log n).

Creacin de un rbol binario de bsqueda Para crear un rbol binario de bsqueda consideramos el siguiente ejemplo: Se desea almacenar los nmeros 8, 3, 1, 20, 10, 5, 4 en un rbol binario de bsqueda. Siguiendo la regla, dado un nodo en el rbol todos los datos a su izquierda deben ser menores que todos los datos del nodo actual, mientras que todos los datos a la derecha deben ser mayores que el nodo actual; inicialmente el nodo estn vaco y se desea insertar el 8. La nica opcin es almacenar el nodo en la raz:
8

A continuacin viene el 3, ya que tres es menor que ocho, el 3 debe ir en el subrbol izquierdo:
8

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

92

A continuacin se debe insertar 1, ya que es menor que 8 y que 3, ir a la izquierda y debajo de 3.


8

El siguiente nmero es 20, mayor que 8, por lo tanto ir a la derecha de ste nmero:
8

2 0

Cada nuevo elemento se inserta como una nueva hoja del rbol. El resto de elementos se pueden situar fcilmente, lo cual se muestra en las siguientes figuras:

8 8

3 3 2 0 1 1 1 0 5 1 0

2 0

2 0

1 0

Nodo de un rbol binario de bsqueda NO difiere en nada de los nodos de un rbol binario, tiene un campo de datos y dos punteros a los subrboles izquierdo y derecho respectivamente.

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

93

Operaciones en un ABB 1. Insertar un nodo Una caracterstica fundamental que debe poseer el algoritmo de insercin es que el rbol resultante de una insercin en un rbol de bsqueda tambin ha de ser de bsqueda. El algoritmo de insercin se apoya en la localizacin de un elemento, de modo que si se encuentra el elemento (clave) buscado, no es necesario hacer nada, en caso contrario se inserta el nuevo elemento justo en el lugar donde se acabado la bsqueda(Es decir donde hacia estado en el estado de existir). La interseccin de un nuevo nodo en un rbol de bsqueda siempre se hace como nodo hoja. Para ello se baja por el rbol segn el camino de bsqueda. Por ejemplo: supongamos que queremos construir un ABB a partir del conjunto de enteros {10, 5, 14, 7,12} aplicando reiteradamente el proceso de insercin. El resultado es el que muestra la figura

2. Funcin de insertar Se debe declarar dos argumentos un puntero a la raz del rbol y el dato que tendr el nodo. La funcin creara un nuevo nodo y lo inserta en el lugar correcto en el rbol de modo que el rbol permanezca como binario de bsqueda. Los pasos a seguir son: 1.- Asignar memoria para una nueva estructura nodo. 2.- Buscar en el rbol para encontrar la posicin de interseccin del nuevo nodo, que se colocara como nodo hoja. 3.- Enlazar el nuevo nodo al rbol. 3. Eliminacin La operacin de borrado si resulta ser algo ms complica debido a que el elemento a borrar puede ser cualquier. Se recuerda que el rbol debe seguir siendo de bsqueda tras el borrado. Pueden darse tres casos, una vez encontrado el nodo a borrar:

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

94

Caso 1: Borrar un nodo sin hijos nodo hoja: simplemente se borra y se establece a nulo el apuntador de su padre. Antes Despus

Ejemplo: En el rbol de ejemplo, borrar el nodo 3. 1. Localizamos el nodo a borrar, al tiempo que mantenemos un puntero a 'Padre'. 2. Hacemos que el puntero de 'Padre' que apuntaba a 'nodo', ahora apunte a NULL. 3. Borramos el 'nodo'.

Caso 2: El nodo es una hoja o tiene al menos un descendiente por una sola rama: Se borra dicho nodo, y su primer descendiente se asigna como hijo del padre del nodo borrado es decir asignar el enlace del nodo padre. En el rbol se borra el nodo cuya clave es -1. El rbol resultante es: Antes Despus

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

95

Ejemplo: En el rbol de ejemplo, borrar el nodo 4. 1. 2. 3. 4. 5. Localizamos el nodo a borrar ('raz'). Buscamos el nodo ms a la derecha del rbol izquierdo de 'raz', en este caso el 3, al tiempo que mantenemos un puntero a 'Padre' a 'nodo'. Intercambiamos los elementos 3 y 4. Hacemos que el puntero de 'Padre' que apuntaba a 'nodo', ahora apunte a NULL. Borramos el 'nodo'.

Caso 3: Borrar un nodo con dos subrboles hijo no vacas: para mantener la estructura de rbol se pueden seguir dos alternativas: Reemplazar el dato del nodo por la menor de las claves mayores en su subrbol derecho. 2. Reemplazar el dato del nodo por la mayor de las clases menores en su subrbol izquierdo. Se elige la segunda para lo cual como las claves menores estn en la rama izquierda, se baja al primer nodo de la rama izquierda, y como la clave mayor est en la rama derecha, se contina bajando por la rama derecha hasta alcanzar el nodo hoja. Este es el mayor de los menores que reemplaza a la clave del nodo a eliminar. 3. El nodo tiene al menos un descendiente por cada rama. Al borrar dicho nodo es necesario mantener la coherencia de los enlaces, adems de seguir manteniendo la estructura como un rbol binario de bsqueda. La solucin consiste en sustituir la informacin del nodo que se borra por el de una de las hojas, y borrar a continuacin dicha hoja. Puede ser cualquier hoja? No, debe ser la que contenga una de estas dos claves: la mayor de las claves menores al nodo que se borra. Suponer que se quiere borrar el nodo 4 del rbol Se sustituir la clave 4 por la clave 2. la menor de las claves mayores al nodo que se borra. Suponer que se quiere borrar el nodo 4 del rbol. Se sustituir la clave 4 por la clave 5.
1.

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

96

Ms ejemplos: 1. Eliminar el 5 2. Buscamos en menor de las claves mayores. 3. Intercambiamos el valor, y enlazamos el descendiente derecho.

Finalmente el rbol queda as:

Otro Ejemplo: En ste borraremos el elemento 6.

1. Localizamos el nodo a borrar ('raz'). 2. Buscamos el nodo ms a la izquierda del rbol derecho de 'raz', en este caso el 12, ya que el rbol derecho no tiene nodos a su izquierda, si optamos por la rama izquierda, estaremos en un caso anlogo. Al mismo tiempo que mantenemos un puntero a 'Padre' a 'nodo'. 3. Intercambiamos los elementos 6 y 12. 4. Ahora tenemos que repetir el bucle para el nodo 6 de nuevo, ya que no podemos eliminarlo.

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

97

5. Localizamos de nuevo el nodo a borrar ('raz'). 6. Buscamos el nodo ms a la izquierda del rbol derecho de 'raz', en este caso el 16, al mismo tiempo que mantenemos un puntero a 'Padre' a 'nodo'. 7. Intercambiamos los elementos 6 y 16. 8. Hacemos que el puntero de 'Padre' que apuntaba a 'nodo', ahora apunte a NULL. 9. Borramos el 'nodo', observamos los pasos indicados en la siguiente figura. Antes Despus

Los recorridos en un ABB, es similar que en los rboles binarios Implementacin de Arboles BB CLASE NODO
publicclassNodoArbol{ //miembrosdeaccesodelpaquete NodoArbolnodoIzquierdo; intdatos; NodoArbolnodoDerecho; //inicializardatosyhacerdeestenodounnodohoja publicNodoArbol(intdatosNodo){ datos=datosNodo; nodoIzquierdo=nodoDerecho=null;//elnodonotienehijos } publicNodoArbol(){ datos=0; nodoIzquierdo=nodoDerecho=null;//elnodonotienehijos } //localzarpuntodeinserccioneinsertarnuevonodo;ignorarvaloresduplicados publicsynchronizedvoidinsertar(intvalorInsertar){ //insertarensubarbolizquierdo if(valorInsertar<datos){ //insertarnuevoNodoArbol if(nodoIzquierdo==null){ nodoIzquierdo=newNodoArbol(valorInsertar); }else//continuarrecorriendosubarbolizquierdo nodoIzquierdo.insertar(valorInsertar); } //insertarensubarbolderecho elseif(valorInsertar>datos){ //insertarnuevonodoArbol if(nodoDerecho==null)

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

98

nodoDerecho=newNodoArbol(valorInsertar); else//continuarrecorriendosubarbolderecho nodoDerecho.insertar(valorInsertar); } }//findelmetodoinsertar }//findelaclasenodoArbol CLASEARBOL publicclassArbol{ publicNodoArbolraiz; //construirunobjetoarbolvaciodeenteros publicArbol(){ raiz=null; } //insertarunnuevonodoenelarboldebusquedabinaria publicsynchronizedvoidinsertarNodo(intvalorInsertar){ if(raiz==null) raiz=newNodoArbol(valorInsertar);//crearelnodoraizaqui else raiz.insertar(valorInsertar);//llamaralmetodoinsertar } //empezarrecorridopreorden publicsynchronizedvoidrecorridoPreorden(){ ayudantePreorden(raiz); } //metodorecursivopararealizarrrecorridopostorden privatevoidayudantePreorden(NodoArbolnodo){ if(nodo==null){ return; } System.out.print(nodo.datos+"");//mostrardatosdelnodo ayudantePreorden(nodo.nodoIzquierdo);//rrecorrersubarbolizquierdo ayudantePreorden(nodo.nodoDerecho);//rrecorrersubarbolDerecho } //empezarrrecorridoinorden publicsynchronizedvoidrecorridoInorden(){ ayudanteInorden(raiz); } //metodorecursivopararealizarrrecorridoinorden privatevoidayudanteInorden(NodoArbolnodo){ if(nodo==null){ return; } ayudanteInorden(nodo.nodoIzquierdo);//rrecorridosubarbolizquierdo System.out.print(nodo.datos+"");//mostrardatosdelnodo ayudanteInorden(nodo.nodoDerecho);//rrecorrersubarbolderecho } //iniciarrrecorridopostorden publicsynchronizedvoidrecorridoPostorden(){ ayudantePostorden(raiz);

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

99

} //metodorecursivopararealizarrrecorridopostorden privatevoidayudantePostorden(NodoArbolnodo){ if(nodo==null){ return; } ayudantePostorden(nodo.nodoIzquierdo);//recorrensubarbolizquierdo ayudantePostorden(nodo.nodoDerecho);//recorrensubarbolDerecho System.out.print(nodo.datos+"");//mostrardatosdelnodo } publicsynchronizedvoidayudanteliminar(intdato){ eliminar(dato,this.raiz); } NodoArbolaux=this.raiz; NodoArbolaux1=this.raiz; publicvoideliminar(intdato,NodoArbolr){ if(r==null){ System.out.println("nodonoencontrado"); }else{ if(dato<r.datos){ if(r.nodoIzquierdo!=null){ if(r.nodoIzquierdo.datos==dato){ aux=r; } } eliminar(dato,r.nodoIzquierdo); }elseif(dato>r.datos){ if(r.nodoDerecho!=null){ if(r.nodoDerecho.datos==dato){ aux1=r; } } eliminar(dato,r.nodoDerecho); }else{ NodoArbolq; q=r; if(q.nodoDerecho==null&&q.nodoIzquierdo==null){ if(aux!=null){ aux.nodoIzquierdo=null; }elseif(aux1!=null){ aux1.nodoDerecho=null; } }else{ reemplazar(q); } aux=this.raiz; aux1=this.raiz; System.out.println("sehaeliminadoelelemento"); } } } publicvoidreemplazar(NodoArbolat){ NodoArbola,b; b=at;

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

100

a=at.nodoIzquierdo; while(a.nodoDerecho!=null){ b=a; a=a.nodoDerecho; } at.datos=a.datos; if(b==at){ b.nodoIzquierdo=a.nodoIzquierdo; }else b.nodoDerecho=a.nodoIzquierdo; at=a; } } //esteprogramapruebalaclasearbol packagearbol; importjava.io.BufferedReader; importjava.io.IOException; importjava.io.InputStreamReader; publicclassPruebaArbol{ publicstaticvoidmain(String[]args)throwsIOException{ InputStreamReaderteclado=newInputStreamReader(System.in); BufferedReaderlec=newBufferedReader(teclado); Arbolarbol=newArbol(); intvalor; System.out.println("Ingreseunnumerodeelementosparaelarbol"); intnum=Integer.parseInt(lec.readLine()); System.out.println("insertandolossiguientesvalores"); //insertar10enterosaleatoriosdel0al99enarbol for(inti=0;i<num;i++){ valor=(int)(Math.random()*100); if(i==0){ System.out.println("raiz:"+valor); } System.out.print(valor+""); arbol.insertarNodo(valor); } System.out.println("\n\nRcorridopreorden"); arbol.recorridoPreorden();//realizarrecorridopreordendearbol System.out.println("\n\nRcorridoInorden"); arbol.recorridoInorden();//realizarrecorridoinordendearbol System.out.println("\n\nRcorridopostorden"); arbol.recorridoPostorden();//realizarrecorridopostordendearbol booleansigue=true; do{ System.out.println("ingreseunnumeroaeliminar"); intnomb=Integer.parseInt(lec.readLine()); arbol.eliminar(nomb,arbol.raiz); System.out.println("\n\nRcorridoInorden"); arbol.recorridoInorden();//realizarrecorridoinordendearbol System.out.println("deseaeliminarmasnodos"); Stringstr=lec.readLine();

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

101

if(str.equals("no")){ sigue=false; } }while(sigue); } }//findelaclasepruebaarbol

9.1 rboles balanceados Se considera que un rbol binario esta balanceado cuando todos sus niveles, excepto el ultimo, estn integrados a la mxima capacidad de nodos. Las investigaciones respecto a esta estructura de datos no han logrado encontrar una tcnica eficiente para manejar rboles de bsqueda completamente balanceados; las propuestas han llegado solo a presentar rboles parcialmente balanceados, sin repercutir en la eficiencia de las operaciones de insercin y eliminacin de nodos. La ms comn y usada de las tcnicas es la de los rboles AVL. Arbol AVL Un rbol AVL es un rbol binario de bsqueda que trata de mantenerse lo ms balanceado posible, conforme se realizan operaciones de insercin y eliminacin. Fueron propuestos en 1962 por los matemticos rusos Adelson-Velskii y Landis, de donde surge su nombre. Su contribucin principal consisti en presentar algoritmos eficientes de insercin y eliminacin de elementos considerando un balanceo en el rbol que, a su vez, repercute en la eficiencia de las bsquedas. Formalmente, en los rboles AVL se debe cumplir el hecho de que para cualquier nodo del rbol, la diferencia entre las alturas de sus subrboles no exceda una unidad

La especificacin del TDA rbol AVL es idntica a la del TDA rbol binario (ABB), y slo se considera un cambio en las postcondiciones de las operaciones de INSERTAR y BORRAR para obtener un rbol que cumpla con las restricciones de altura ya explicadas.

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

102

TDA: ARBOL AVL Elementos: guarda un conjunto de nodos. Cada uno de ellos contienen un dato homogneo (simple o estruturado) nico en el rbol. Estructura: La organizacin de los datos es una estructura en forma jerrquica o de niveles, restringiendo la relacin de uno a dos como mximo, cumpliendo un orden y equilibrio. Dominio: Depende de la aplicacin OPERACIONES: - INSERCIN Inicialmente, el proceso de insercin de un elemento en un rbol AVL es idntico al de un ABB: se busca la posicin en el rbol en que el nuevo elemento quede como un nodo hoja (puesto que el nuevo nodo es hoja, tendr un FB igual a cero). Una vez hecha la insercin como si fuera un ABB, se deber verificar si afecta el balanceo del rbol, segn las reglas de los AVL. El mejor de los casos ser cuando el nuevo nodo no provoque un desbalanceo, implicando slo la modificacin de los FB de los ancestros al nuevo nodo. El otro caso ser cuando ocurra un desbalanceo que obligue a hacer movimientos de apuntadores y de FB para balancearlo. La forma de detectar algortmicamente en qu caso se har o no un balanceo en el AVL, se basa en la bsqueda de un nodo pivote. Un nodo pivote es aquel que tiene un FB diferente de cero y es el ms cercano de los ancestros del nodo recin insertado. Basados en este concepto, se pueden detectar los siguientes casos: 1. El rbol AVL carece de nodo pivote. Esto significa que todos los ancestros del nuevo nodo tienen un PB igual a cero. En este caso, el nuevo nodo no desbalancea el rbol y slo se tendrn que ajustar los valores de los FB de todos los ancestros, volvindose positivos o negativos, segn el valor del nuevo elemento.

2. El rbol AVL tiene nodo pivote y el nuevo se ha insertado en el subrbol ms pequeo del pivote. En este caso tampoco habr desbalanceo, pues se igualan las alturas de los dos subrboles del nodo pivote, y slo se tendrn que ajustar los FB de los ancestros que estn a partir del nodo pivote, volvindose positivos o negativos segn el valor del nuevo elemento.

3. El rbol AVL tiene nodo pivote y en el subrbol ms grande de ste se inserta el nuevo nodo. En este caso se desbalancea el rbol a partir del nodo pivote y tendr que realizarse un balanceo.

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

103

ELIMINACIN Para eliminar un nodo de un rbol AVL se aplica inicialmente el algoritmo ya conocido para dar de baja un nodo en un ABB normal. Fsicamente, este algoritmo slo da de baja nodos que tienen un hijo o ninguno. Para el caso en que el nodo tiene dos hijos, se hace una sustitucin con algn nodo que no tenga hijos o que tenga uno, aplicando el mtodo de el mayor de los menores, o el de el menor de los mayores. Una vez dado de baja el nodo correspondiente, pueden ocurrir dos situaciones: 1. El nodo que se borr no provoc un desbalanceo en el rbol; en este caso, slo se ajustan algunos factores de balance. 2. El nodo que se borr provoc un desbalanceo en el rbol; en este caso, tendrn que ajustarse algunos apuntadores a travs de rotaciones y algunos factores de balance. A diferencia del procedimiento de insercin de un nodo, ahora no se utilizar un nodo pivote, pues una baja puede ocasionar un desbalanceo total en el rbol y ms de una rotacin. Al dar de baja un nodo se tendr que analizar el balanceo de todos los ancestros de la ruta de bsqueda, desde el padre del nodo borrado, hasta el nodo raz del rbol. Esto se debe a que pueden modificarse las alturas de los subrboles por el balanceo.

Factor de balanceo FB o Factor de Equilibrio FE Los nodos de un rbol AVL guardan un valor entre 1 y -1, lo que se conoce como Factor de Balance (FB), y representa la diferencia entre las alturas de sus subrboles. Un FB igual a cero en un nodo significa que las alturas de sus subrboles son iguales; Un FB positivo significa que el subrbol derecho es ms grande que el izquierdo, y Un FB negativo que el subrbol izquierdo es ms grande que el derecho.

Propiedad de los de arboles AVL La propiedad de equilibrio: que debe cumplir un rbol para ser AVL asegura que la profundidad del rbol sea O(log(n)), por lo que las operaciones sobre estas estructuras no debern recorrer mucho para hallar el elemento deseado. Como se ver, el tiempo de ejecucin de las operaciones sobre estos rboles es, a lo sumo O (log(n)) en el peor caso, donde n es la cantidad de elementos del rbol. Sin embargo, y como era de esperarse, esta misma propiedad de equilibrio de los rboles AVL implica una dificultad a la hora de insertar o eliminar elementos: estas operaciones pueden no conservar dicha propiedad.

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

104

Balanceo en un arbol AVL Adelson-Velskii y Landis detectaron que, ante un problema de desbalance, todos los casos podan resolverse aplicando uno de los cuatro esquemas sencillos de balanceo; a estos esquemas los llamaron rotaciones (por la forma en que se mueven los nodos), y consisten en modificar los apuntadores de ciertos nodos, segn el esquema, junto con algunos FB. Lo ms valioso de esta propuesta es que el balanceo afecta slo los nodos que forman parte del subrbol, cuya raz es el nodo pivote, dejando intactos los nodos del resto del rbol. El esquema de la rotacin simple, que puede ser izquierda (RSI) o derecha (RSD) implica el movimiento de tres apuntadores y El esquema de la rotacin doble, que tambin puede ser izquierda (RDI) o derecha (RDD), implica el movimiento de cinco apuntadores. Tipos de rotaciones
1.

Rotacin simple a la derecha (RD):Para ello debe cumplir con las siguientes condiciones: El subrbol izquierdo de un nodo sea 2 unidades ms alto que el derecho, es decir, cuando su FE sea de -2. Y adems, la raz del subrbol izquierdo tenga una FE de -1, es decir, que est cargado a la izquierda.

Ejemplo: Se inserta el nmero 17 a la izquierda del 22.

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

105

2.

Rotacin simple a la izquierda (RI): Para ello debe cumplir con las siguientes condiciones: El subrbol derecho de un nodo sea 2 unidades ms alto que el izquierdo, es decir, cuando su FE sea de 2. Y adems, la raz del subrbol derecho tenga una FE de 1, es decir, que est cargado a la derecha.

Ejemplo: Se insertara el nmero 3 a la derecha del nodo 2.

3.

Rotacin doble derecha Izquierda (DI): Para ello se debe considerar lo siguiente: Cuando el subrbol izquierdo de un nodo sea 2 unidades ms alto que el derecho, es decir, cuando su FE sea 2. Y adems, la raz del subrbol derecho tenga una FE de -1, es decir, que est cargado a la izquierda.

Ejemplo: Se inserta el nmero 39 a la izquierda del 48

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

106

Rotacin doble Izquierda Derecha (ID): Se observa las siguientes condiciones: Cuando el subrbol derecho de un nodo sea 2 unidades ms alto que el izquierdo, es decir, cuando su FE sea -2. Y adems, la raz del subrbol izquierdo tenga una FE de 1, es decir, que est cargado a la derecha. Ejemplo: Se inserta el nmero 71 a la derecha del 29
4.

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

107

Anlisis de eficiencia El anlisis matemtico de los algoritmos de insercin y eliminacin demuestran que es posible buscar, insertar y eliminar un elemento en un rbol balanceado de n nodos en O (logn) unidades de tiempo. Diversos anlisis demuestran que son ms frecuentes las rotaciones en las operaciones de insercin que en las de eliminacin. Mientras se produce aproximadamente una rotacin por cada dos inserciones, se produce una rotacin por cada cinco eliminaciones.

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

108

10

ALMACENAMIENTO HASH

10.1 Bsqueda mediante transformacin de claves hash Es un mtodo de bsqueda que aumenta la velocidad de bsqueda, pero que no requiere que los elementos estn ordenados. Consiste en asignar a cada elemento un ndice mediante una transformacin del elemento. Esta correspondencia se realiza mediante una funcin de conversin, llamada 10.1.1 Funcin hash. La correspondencia ms sencilla es la identidad, esto es, al nmero 0 se le asigna el ndice 0, al elemento 1 el ndice 1, y as sucesivamente. Pero si los nmeros a almacenar son demasiado grandes esta funcin es inservible. Por ejemplo, se quiere guardar en un array la informacin de los 1000 usuarios de una empresa, y se elige el nmero de DNI como elemento identificativo. Es inviable hacer un array de 100.000.000 elementos, sobre todo porque se desaprovecha demasiado espacio. Por eso, se realiza una transformacin al nmero de DNI para que nos d un nmero menor, por ejemplo coger las 3 ltimas cifras para guardar a los empleados en un array de 1000 elementos. Para buscar a uno de ellos, bastara con realizar la transformacin a su DNI y ver si est o no en el array. La funcin de hash ideal debera ser biyectiva, esto es, que a cada elemento le corresponda un ndice, y que a cada ndice le corresponda un elemento, pero no siempre es fcil encontrar esa funcin, e incluso a veces es intil, ya que puedes no saber el nmero de elementos a almacenar. La funcin de hash depende de cada problema y de cada finalidad, y se pueden utilizar con nmeros o cadenas, pero las ms utilizadas son: Restas sucesivas: Esta funcin se emplea con claves numricas entre las que existen huecos de tamao conocido, obtenindose direcciones consecutivas. Por ejemplo, si el nmero de expediente de un alumno universitario est formado por el ao de entrada en la universidad, seguido de un nmero identificativo de tres cifras, y suponiendo que entran un mximo de 400 alumnos al ao, se le asignaran las claves: 1998-000 --> 0 = 1998000-1998000 1998-001 --> 1 = 1998001-1998000 1998-002 --> 2 = 1998002-1998000 ... 1998-399 --> 399 = 1998399-1998000 1999-000 --> 400 = 1999000-1998000+400 ... yyyy-nnn --> n = yyyynnn-1998000+(400*(yyyy-1998)) Aritmtica modular: El ndice de un nmero es resto de la divisin de ese nmero entre un nmero n prefijado, preferentemente primo. Los nmeros se guardarn en las direcciones de memoria de 0 a n-1. Este mtodo tiene el problema de que cuando hay n+1 elementos, al menos un ndice es sealado por dos elementos (teorema del palomar). A este fenmeno se le llama colisin, y es tratado ms adelante. Si el nmero n es el 13, los nmeros siguientes quedan transformados en: 13000000 --> 0 12345678 --> 7 13602499 --> 1 71140205 --> 6 73062138 --> 6

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

109

Mitad del cuadrado: Consiste en elevar al cuadrado la clave y coger las cifras centrales. Este mtodo tambin presenta problemas de colisin: 123*123 = 15129 --> 51 136*136 = 18496 --> 84 730*730 = 532900 --> 29 301*301 = 90601 --> 06 625*625 = 390625 --> 06 Truncamiento: Consiste en ignorar parte del nmero y utilizar los elementos restantes como ndice. Tambin se produce colisin. Por ejemplo, si un nmero de 8 cifras se debe ordenar en un array de 1000 elementos, se pueden coger la primer, la tercer y la ltima cifras para formar un nuevo nmero: 13000000 --> 100 12345678 --> 138 13602499 --> 169 71140205 --> 715 73162135 --> 715 Plegamiento: Consiste en dividir el nmero en diferentes partes, y operar con ellas (normalmente con suma o multiplicacin). Tambin se produce colisin. Por ejemplo, si dividimos los nmero de 8 cifras en 3, 3 y 2 cifras y se suman, dar otro nmero de tres cifras (y si no, se cogen las tres ltimas cifras): 13000000 --> 130 = 130+000+00 12345678 --> 657 = 123+456+78 71140205 --> 118 --> 1118 = 711+402+05 13602499 --> 259 = 136+024+99 25000009 --> 259=250+000+09 10.1.2 Tratamiento de colisiones Pero ahora se nos presenta el problema de qu hacer con las colisiones, qu pasa cuando a dos elementos diferentes les corresponde el mismo ndice. Pues bien, hay tres posibles soluciones: 1. Cuando el ndice correspondiente a un elemento ya est ocupada, se le asigna el primer ndice libre a partir de esa posicin. Este mtodo es poco eficaz, porque al nuevo elemento se le asigna un ndice que podr estar ocupado por un elemento posterior a l, y la bsqueda se ralentiza, ya que no se sabe la posicin exacta del elemento. 2. Tambin se pueden reservar unos cuantos lugares al final del array para alojar a las colisiones. Este mtodo tambin tiene un problema: Cunto espacio se debe reservar? Adems, sigue la lentitud de bsqueda si el elemento a buscar es una colisin. 3. Lo ms efectivo es, en vez de crear un array de nmero, crear un array de punteros, donde cada puntero seala el principio de una lista enlazada. As, cada elemento que llega a un determinado ndice se pone en el ltimo lugar de la lista de ese ndice. El tiempo de bsqueda se reduce considerablemente, y no hace falta poner restricciones al tamao del array, ya que se pueden aadir nodos dinmicamente a la lista.

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

110

Implementacin de la Bsqueda mediante transformacin de claves hash


En sta implementacin se aplica la funcin hash: Aritmtica Modular y el mtodo para la resolucin de colisiones es la Prueba Lineal o Sondeo Lineal. //Implementacinaplicandolaaritmticamodular publicclassHash{ //Atributo Object[]th; //Constructor publicHash(intn){ th=newObject[n]; for(inti=0;i<n;i++){ th[i]=null; } } //Mtodos publicvoidcreaTabla(Object[]a,intnmax){ intpos; for(inti=0;i<a.length;i++){ //Generalaposicindelelementoainsertar //Haciendousodeunafuncinhash pos=a[i].hashCode()%nmax; System.out.println("Elemento:"+a[i]+"pos="+pos); //cuandolafuncindevuelveunvalornegativo if(pos<0){ pos*=1; } if(th[pos]==null){ //Insertaenlatablasincolisin th[pos]=a[i]; }else{ while(th[pos]!=null){ pos++; if(pos==th.length){ pos=0; } } //Insertaelvalorenlatablahashdespuesdeunacolicion th[pos]=a[i]; } } presenta("TABLAHASH",th); } publicvoidbuscarHash(Objectelemb,intnmax){ inte=elemb.hashCode(); if(e<0){ e*=1; } intpos=e%nmax; if(th[pos]==null){ System.out.print("Elementonoencontrado"); }else{ if(th[pos].equals(elemb)){ System.out.print("Elementoencontrado,"+elemb+"suposiciones:"+pos); }else{

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

111

intj=pos+1; if(j==th.length){ j=0; } while((th[j]!=elemb)&&(th[j]!=null)&&(j!=pos)){ j++; if(j>=th.length1){ j=0; } } if(th[j].equals(elemb)){ System.out.print("Elementoencontrado,"+elemb+"suposiciones:"+j); }else{ System.out.print("Elementonoencontrado"); } } } } publicvoidpresenta(Stringmsg,Objecta[]){ System.out.print(msg+"["); for(inti=0;i<=a.length1;i++){ if(i<a.length1){ System.out.print(a[i]+","); }else{ System.out.print(a[i]+"]"); } } System.out.print("\n"); } publicstaticvoidmain(Stringargs[]){ Objectl[]={12,45,76,34,90,45,56,78}; Hashbh=newHash(l.length*2); bh.presenta("ElementosainsertarenlaTablaHash",l); bh.creaTabla(l,l.length); bh.buscarHash(34,l.length); } } CORRIDA run: ElementosainsertarenlaTablaHash[12,45,76,34,90,45,56,78] Elemento:12pos=4 Elemento:45pos=5 Elemento:76pos=4 Elemento:34pos=2 Elemento:90pos=2 Elemento:45pos=5 Elemento:56pos=0 Elemento:78pos=6 TABLAHASH[56,null,34,90,12,45,76,45,78,null,null,null,null,null,null,null] Elementoencontrado,34suposiciones:2 BUILDSUCCESSFUL(totaltime:0seconds)

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

112

11 GRAFOS
11.1 Introduccin Analiza: Entre las principales aplicaciones de los grafos tenemos:
Circuitos electrnicos, Tarjetas impresas, Circuitos integrados, Redes de transporte, Autopistas, Vuelos, Redes de ordenadores, LANs, Internet, Web, Bases de datos, Diagramas entidad/relacin, entre otros

Piensa en otras aplicaciones informticas de la vida real, en donde se utilice la estructura: Grafo, comenta con tus compaeros y con tu profesora..!!!

Un grafo es un objeto matemtico que se utiliza para representar circuitos, redes, etc. Los grafos son muy utilizados en computacin, ya que permiten resolver problemas muy complejos. Aplicacin

Imaginemos que disponemos de una serie de ciudades y de carreteras que las unen. De cada ciudad saldrn varias carreteras, por lo que para ir de una ciudad a otra se podrn tomar diversos caminos. Cada carretera tendr un coste asociado (por ejemplo, la longitud de la misma). Gracias a la representacin por grafos podremos elegir el camino ms corto que conecta dos ciudades, determinar si es posible llegar de una ciudad a otra, si desde cualquier ciudad existe un camino que llegue a cualquier otra, etc. 11.2 Representacin de grafos Una caracterstica especial en los grafos es que podemos representarlos utilizando dos estructuras de datos distintas. En los algoritmos que se aplican sobre ellos veremos que adoptarn tiempos distintos dependiendo de la forma de representacin elegida. En particular, los tiempos de ejecucin variarn en funcin del nmero de vrtices y el de aristas, por lo que la utilizacin de una representacin u otra depender en gran medida de si el grafo es denso o disperso.

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

113

Para nombrar los nodos utilizaremos letras maysculas, aunque en el cdigo deberemos hacer corresponder cada nodo con un entero entre 1 y V (nmero de vrtices) de cara a la manipulacin de los mismos. 11.3 Conceptos Elementales
1. 2.

3. 4. 5. 6.

Vrtice ( Vertex ): Un punto o un nodo de un grafo. Arco ( Edge ): Una lnea que une un vrtice con otro vrtice del mismo grafo, en grafos no direccionados, o una fecha que une dos vrtices del mismo grafo, en grafos direccionados. Cabeza ( Head ): En grafos direccionados, es el vrtice donde llega la flecha. Cola ( Tail ): En grafos direccionados, es el vrtice desde donde sale la fecha. Vrtices Adjacentes ( Adjancent Edges ): Son dos vrtices que estn unidos por un arco. Arcos Incidentes ( Incident Edges ): Son los arcos que inciden en un determinado vrtice.

11.4 Clasificacin de los Grafos: 1. Segn el tipo y cantidad de arcos


o

Grafo No Direccionado ( Undirected Graph ): Son grafos donde los arcos unen un par de vrtices desordenados. As, el par (v1,v2) y el (v2,v1) representa el mismo arco.

Grafo ( Graph ): Es un sinnimo de grafo no direccionado. Los grafos no direccionados, normalmente se los llama grafos a secas. Grafo Completo ( Completed Graph ): Es un grafo no direccionado donde existe un arco entre cada par de vrtices cualesquiera del mismo. El nmero mximo de arcos que puede tener un grafo de n vrtices es n * ( n - 1 ) / 2. Grafo Direccionado ( Directed Graph ): Son grafos donde los arcos unen un par de vrtices ordenados. As, el par [v1,v2] y [v2,v1] representan arcos distintos. En el caso del arco [v1,v2], v1 es la cola del arco y v2 en la cabeza. Los arcos de un grafo direccionado se representan con flechas.

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

114

o o

Digrafo ( Digraph ): Es un sinnimo de grafo direccionado. Digrafo Completo ( Completed Digraph ): Es un grafo direccionado donde existe un arco entre cada dos vertices cualesquiera del mismo, tanto el que va desde un vrtice al otro, como el que retorna. El nmero mximo de arcos que puede tener un digrafo de n vrtices es n * ( n - 1 ). Multigrafo ( Multigraph ): Se aceptan ms de un arco uniendo dos vertices. En trminos formales, no son grafos. Subgrafo ( Subgraph ): Un subgrafo de G es un grafo G', tal que V(G') est incluido en V(G) y E(G') est incluido en E(G).

2. Segn la conectividad o Componentes Conectados ( Connected Component ): Tiene distinto significado segn se trate de grafos direccionados o no direccionados.
o

Fuertemente Conectado ( Strongly Connected ): Tiene distinto significado segn se trate de grafos direccionados o no direccionados.

11.5 Conceptos vinculados al grado Grado de un Vrtice ( Vertex Degree ): Es el nmero de arcos que inciden sobre el

vrtice. Grado Entrante de un Vrtice ( Vertex In Degree ): Es el nmero de arcos para los cuales el vrtice es la cabeza. Grado Saliente de un Vrtice ( Vertex Out Degree ): Es el nmero de arcos para los cuales el vrtice es la cola. Conceptos vinculados al paso
Paso ( Path ): El paso desde un vrtice vp a un vrtice vq, en un grafo G, es una

secuencia de vrtices vp, vi1, vi2, ..., vin, vq, tal que (vp,vi1), (vi1,vi2), ..., (vin,vq) son arcos en E(G). Si G es un grafo direccionado, el paso consiste de [vp,vi1], [vi1,vi2], ..., [vin,vq], arcos en E(G). Paso Simple ( Simple Path :) Es un paso, donde todos los vrtices, excepto, posiblemente, el primero y el ltimo, son distintos. Paso Ciclo ( Cycle Path ): Es um paso simple, donde el primero y ltimo vrtice es el mismo vrtice. Longitud del Paso ( Path Length ): El nmero de vrtices en un paso.
11.6 Representacin de grafos

1. Matriz de adyacencias Son matrices cuadradas de tantas filas y columnas como vrtices tenga el grafo a representar. En las celdas de la matriz se indica si existe un arco entre los vrtices que determinan la celda. Un grafo G = (V;A) se representa como G: matriz[V; V ] de bolanos. La componente G [u; v] es 1 si (u; v) 2 A; sino G[u; v] = 0.

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

115

Memoria Tiempo de acceso:

grafos densos Lista adyacentes: Lista incidentes:

2. Listas de adyacencia Partiendo de los nodos de cada vrtice, evoluciona una lista que informa los nodos que son adyacentes del inicial. Un grafo G = (V;A) se representa como un vector de listas de vrtices indexado por vrtices; es decir, G: vector[V ] de V . Cada componente G[v] es una lista de los vrtices emergentes y/o incidentes de/a v 2 V. Memoria: grafos dispersos

Tiempo de acceso: O(grado(G)). Lista adyacentes: O (grado(G)). (Lista incidentes: O(grado(G)) con listas de incidencia.)

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

116

11.7 Recorridos o exploracin de grafos A la hora de explorar un grafo, nos encontramos con dos mtodos distintos. Ambos conducen al mismo destino (la exploracin de todos los vrtices o hasta que se encuentra uno determinado), si bien el orden en que stos son "visitados" decide radicalmente el tiempo de ejecucin de un algoritmo, como se ver posteriormente. En primer lugar, una forma sencilla de recorrer los vrtices es mediante una funcin recursiva, lo que se denomina bsqueda en profundidad. La sustitucin de la recursin (cuya base es la estructura de datos pila) por una cola nos proporciona el segundo mtodo de bsqueda o recorrido, la bsqueda en amplitud o anchura.

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

117

Suponiendo que el orden en que estn almacenados los nodos en la estructura de datos correspondiente es A-B-C-D-E-F... (el orden alfabtico), tenemos que el orden que seguira el recorrido en profundidad sera el siguiente: A-B-E-I-F-C-G-J-K-H-D En un recorrido en anchura el orden sera, por contra: A-B-C-D-E-G-H-I-J-K-F Es destacable que el nodo D es el ltimo en explorarse en la bsqueda en profundidad pese a ser adyacente al nodo de origen (el A). Esto es debido a que primero se explora la rama del nodo C, que tambin conduce al nodo D. En estos ejemplos hay que tener en cuenta que es fundamental el orden en que los nodos estn almacenados en las estructuras de datos. Si, por ejemplo, el nodo D estuviera antes que el C, en la bsqueda en profundidad se tomara primero la rama del D (con lo que el ltimo en visitarse sera el C), y en la bsqueda en anchura se explorara antes el H que el G. Recorrido y Bsqueda Primero en Profundidad Se implementa de forma recursiva, aunque tambin puede realizarse con una pila. Se utiliza un array val para almacenar el orden en que fueron explorados los vrtices. Para ello se incrementa una variable global id (inicializada a 0) cada vez que se visita un nuevo vrtice y se almacena id en la entrada del array val correspondiente al vrtice que se est explorando. Sus pasos a seguir seran: Visitar vrtice inicial vi Visitar vrtice adyacente a vi ... proceder as hasta encontrar uno ya visitado... Volver atrs hasta llegar a un vrtice con adyacentes sin visitar El recorrido termina cuando volviendo atrs llegamos al vrtice inicial vi y no quedan adyacentes por recorrer

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

118

Ejemplo de recorrido primero en profundidad:

Recorrido y Bsqueda Primero en Anchura La diferencia fundamental respecto a la bsqueda en profundidad es el cambio de estructura de datos: una cola en lugar de una pila. Sus pasos a seguir son: Visitar vrtice inicial vi Visitar todos los vrtices adyacentes a vi Al terminar, comenzar a visitar los adyacentes a los adyacentes a vi ... proceder as hasta que no queden vrtices por visitar

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

119

Ejemplo de recorrido primero en anchura:

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

120

Implementacin de Grafos: Algoritmo Prim PROBLEMA: Descripcin del problema Dado un grafo conectado y no dirigido, su rbol abarcador mnimo es un subgrafo en forma de rbol que mantiene la conectividad del grafo y tal que la suma de los pesos de las ramas seleccionadas es mnimo. El algoritmo de Prim resuelve este problema en tiempo polinmico mediante una estrategia voraz(esto es, seleccionar en cada paso lo que ms convenga). Las aplicaciones de los rboles abarcadores mnimos son mltiples: obtencin de redes elctricas o de comunicaciones eficientes, creacin de laberintos aleatorios, solucin aproximada de problema del viajante (TSP - Traveling Salesman Problem), etc. Solucin al problema Para lograr este objetivo, hemos utilizado un algoritmo voraz, que empezar seleccionando la arista de menor coste partiendo de un nodo inicial, es decir el camino de menor recorrido desde un nodo determinado. Luego repetir dicho proceso seleccionando una nueva arista hasta que todos los nodos sean visitados. Cada uno de estas nuevas aristas ser la de menor peso entre las que no estn repetidas y, por lo tanto, permitir el acceso a un nodo nuevo. El grafo creado para probar el funcionamiento del algoritmo es de cinco nodos y est representado por una matriz de memoria esttica. Dicha matriz se inicializa en su totalidad con un valor muy grande (Integer.MaxValue) para que los pesos conocidos de antemano sean menores a dicho valor y el algoritmo funcione correctamente. El algoritmo est implementado en el cuerpo del mtodo caminoMinimo, el cul ante una invocacin en la que se especifique como parmetro real el nodo de partida, devolver un vector de enteros cuyos valores se irn modificando a medida que se obtengan nuevos caminos de coste menor a los calculados en iteraciones anteriores. Por otra parte, para asegurarse de que un nodo no se repita, se har uso del mtodo estaRepetido, que recibe como parmetro el vector donde se va almacenando la solucin y un nmero a buscar dentro de dicho vector. La llamada a dicho mtodo retorna verdadero en caso de que el nodo ya forme parte del recorrido y falso en caso contrario. IMPLEMENTACIN DE GRAFOS Para la implementacin se ha considerado, empezar con el camino de menor coste repetir seleccionar un nuevo camino hasta que est completa una red que conecte todos los nodos.
packagealgoritmoprim; publicclassCamino{ //Matrizbidimensionaldeenterosquerepresentaelgrafo. privateintgrafo[][]; publicCamino(intcaminos[][]){ grafo=caminos; }

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

121

/** *Mtodoquerecorreunvectorparacomprobarsiseencuentraenlunvalor *recibido. *@paramVectordeenterosdondevaalmacenandolasolucin. *@paramiNmeroabuscardentrodelvector. *@returnDevuelvetruesiloencuentra. */ privatebooleanestaRepetido(intvector[],inti){ for(intj=0;j<vector.length;j++){ if(vector[j]==i){ returntrue; } } returnfalse; } /** *Mtodoquerecorreelgrafoyalmacenaelcaminomnimoenunvector. *@paraminicioValorquerepresentaelnododondecomienzaelrecorrido. *@returnElcaminominimoenunvectordeenteros. */ publicint[]caminoMinimo(intinicio){ intnumNodos=grafo.length; intminimo[]=newint[numNodos]; //Inicializarelvectordemnimosa1(paraelcasodelnodocero). for(inti=0;i<minimo.length;i++){ minimo[i]=1; } intlongitudCamino=0; intmenor=0; intactual=inicio; minimo[0]=inicio; while(longitudCamino<(numNodos1)){ //Encontrarelcaminomnimoalsiguientenodo for(inti=0;i<numNodos;i++){ if((grafo[actual][i]<grafo[actual][menor])&& (!estaRepetido(minimo,i))){//Paraevitarrepetirnodos. menor=i; //Ahora,elnodosiguienteeseldelcaminomnimoanterior. } } longitudCamino++; actual=menor; minimo[longitudCamino]=actual; } returnminimo; } /** *MtodomaindelaclaseCaminodondesecreaelgrafoutilizadoparael *ejemplo. *@paramargsStringParametrosdelaclase */ publicstaticvoidmain(Stringargs[]){

Estructuras de Datos Orientada a Objetos

Septiembre/12-Marzo/13

122

//Vectordesoluciones: intsolucion[]; //Crearungrafodecincovrticesrepresentadoporunamatriz: intgrafo[][]=newint[5][5]; //Inicializarlamatrizrepresentandoelgrafo: for(inti=0;i<5;i++){ for(intj=0;j<5;j++){ grafo[i][j]=Integer.MAX_VALUE; } } //Rellenarelgrafoconlassiguientesaristasconsusrespectivospesos: grafo[0][1]=30; grafo[1][0]=30; grafo[0][2]=15; grafo[2][0]=15; grafo[0][3]=80; grafo[3][0]=80; grafo[1][2]=10; grafo[2][1]=10; grafo[1][3]=60; grafo[3][1]=60; grafo[1][4]=45; grafo[4][1]=45; grafo[2][3]=50; grafo[3][2]=50; grafo[2][4]=25; grafo[4][2]=25; grafo[4][3]=40; grafo[3][4]=40; //Instanciadelaclasecamino. Caminoc=newCamino(grafo); //Encontrarelcaminomnimo(empiezadesdeelnodo0). solucion=c.caminoMinimo(0); //Mostrarelrbolmnimoabarcador. System.out.print("\nRBOLMNIMOABARCADOR>Solucin:"); for(inti=0;i<5;i++){//n1aristasentrennodos. System.out.print(solucion[i]+""); } } }

Tiempo de ejecucin Para calcular la complejidad del algoritmo lo que hicimos fue obtener el Tiempo de Ejecucin (T(n)), separando las operaciones bsicas (de duracin constante) obtenindose: T(n) = 11 n + 8. Por lo tanto, eliminando las constantes sabemos que la complejidad del algoritmo es O(n).

También podría gustarte