Top Banner

of 101

Port a Folio de Evidencias EST DAT

Jul 12, 2015

Download

Documents

dani-513
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript

Instituto Tecnolgico de Tuxtepec

MATERIA: Estructura de Datos

PRESENTA: Daniela Gpe. Balbuena Saldivar CATEDRATICO: L.I. Tomas Torres Ramrez

TUXTEPEC, OAX. .15 de Diciembre del 2011

0

INSTITUTO TECNOLOGICO de Tuxtepec

Estructura de Datos

Unidad 1Introduccin a las Estructuras de Datos

Prof.: Tomas Torres Ramrez Alumna: Daniela Guadalupe Balbuena Saldivar Ingeniera en Informtica Tercer Semestre Grupo A

1

ndiceIntroduccin Tipo de Dato Abstracto (TDA) Modularidad Uso de TDA Mapa conceptual de TDAs Ejemplo de TDA en Java Memoria esttica y dinmica 3 4 6 7 8 9 10

2

IntroduccinLa principal razn para que las personas aprendan lenguajes y tcnicas de programacin es utilizar la computadora como una herramienta para resolver problemas. La abstraccin de datos es la tcnica de inventar nuevos tipos de datos que sean ms adecuados y por consiguiente, facilitar la estructura del programa. La tcnica de abstraccin de datos es una tcnica potente de propsito general que cuando se utiliza adecuadamente, puede producir programas cortos, mas legibles y flexibles. Los lenguajes de programacin soportan tipos de datos fundamentales o bsicos (predefinidos), tales como int, char y float en C++ y Java. Un tipo de dato definido por el programador se denomina tipo abstracto de dato TAD (Abstract Data Type, ADT). El trmino abstracto se refiere al medio en que un programador abstrae algunos conceptos de programacin, creando un nuevo tipo de dato. La popularizacin de un programa utiliza la nocin tipo abstracto de dato (TAD), siempre que sea posible si el lenguaje de programacin soporta los tipos que desea el usuario y el conjunto de operaciones sobre cada tipo, se obtiene un nuevo tipo de dato denominado TAD.

3

Tipo de Dato Abstracto (TDA)Un tipo de dato abstracto es un modelo matemtico compuesto por una coleccin de operaciones definidas sobre un conjunto de datos para el modelo. El concepto de tipo de dato abstracto (TDA, Abstract Data Type), fue propuesto por primera vez hacia 1974 por John Guttag y otros, pero no fue hasta 1975 que por primera vez Liskov lo propuso para el lenguaje CLU. El lenguaje Turbo Pascal fue determinante para la comn aceptacin de los TDAs con la introduccin de las Units, si bien estas no cumplen con las caractersticas bsicas de un Tipo de dato Abstracto como por ejemplo la encapsulacin de los datos. El lenguaje Ada pudo implementar exitosamente los TDAs con sus Packages. Con mucha frecuencia se utilizan los trminos TDA y Abstraccin de Datos de manera equivalente, y esto es debido a la similitud e interdependencia de ambos. Sin embargo, es importante definir por separado los dos conceptos. Como ya se mencion, los Lenguajes de Programacin Orientados a Objetos son lenguajes formados por diferentes mtodos o funciones y que son llamados en el orden en que el programa lo requiere, o el usuario lo desea. La abstraccin de datos consiste en ocultar las caractersticas de un objeto y obviarlas, de manera que solamente utilizamos el nombre del objeto en nuestro programa. Al hecho de guardar todas las caractersticas y habilidades de un objeto por separado se le llama Encapsulamiento y es tambin un concepto importante para entender la estructuracin de datos. Es frecuente que el Encapsulamiento sea usado como un sinnimo del Ocultacin de informacin.

4

CaracterizacinUn TDA est caracterizado por un conjunto de operaciones (funciones) al cual se denomina usualmente como interfaz pblica y representa el comportamiento del TDA; mientras que la implementacin como la parte privada del TDA est oculta al programa cliente que lo usa. Los TDA que nos van a interesar de ahora en adelante son aquellos que reflejen cierto comportamiento organizando cierta variedad de datos estructuradamente. A esta forma estructurada de almacenar los datos ser a la que nos refiramos para caracterizar cada TDA. Los TDA que tienen informaciones simples pero dependientes de un comportamiento estructural sern llamados polilticos y aquellos TDA simples, como son los tipos predefinidos donde la informacin no es relacionada mediante ninguna estructura y no admiten ms que un valor en cada momento sern denominados TDA monolticos. Un TDA tendr una parte que ser invisible al usuario la cual hay que proteger y que se puede decir que es irrelevante para el uso del usuario y est constituida tanto por la maquinaria algortmica que implemente la semntica de las operaciones como por los datos que sirvan de enlace entre los elementos del TDA, es decir, informacin interna necesaria para la implementacin que se est haciendo para ese comportamiento del TDA. Resumiendo podemos decir, que tanto la implementacin de las operaciones como los elementos internos del TDA sern privados al acceso externo y ocultos a cualquier otro nivel. Un TDA representa una abstraccin:

Se destacan los detalles (normalmente pocos) de la especificacin (el qu). Se ocultan los detalles implementacin (el cmo). (casi siempre numerosos) de la

5

ModularidadSe denomina Modularidad a la propiedad que permite subdividir una aplicacin en partes ms pequeas (llamadas mdulos), cada una de las cuales debe ser tan independiente como sea posible de la aplicacin en s y de las restantes partes. Estos mdulos que se puedan compilar por separado, pero que tienen conexiones con otros mdulos. Al igual que la encapsulacin, los lenguajes soportan la Modularidad de diversas formas. Segn Bertrand Meyer "El acto de particionar un programa en componentes individuales para reducir su complejidad en algn grado. . . . A pesar de particionar un programa es til por esta razn, una justificacin ms poderosa para particionar un programa es que crea una serie de lmites bien definidos y documentados en el programa. Estos lmites, o interfaces, son muy valiosos en la comprensin del programa". Por su parte Barbara Liskov establece que "modularizacin consiste en dividir un programa en mdulos que pueden ser compilados de forma separada, pero que tienen conexiones con otros mdulos". Ventajas de la Modularizacin Un programa modular es fcil de mantener y modificar. Un programa modular es ms fcil de escribir y depurar (ejecutar, probar y poner a punto). Un programa modular es ms fcil de controlar. El desglose de un problema en mdulos permite encomendar los mdulos ms complejos a los programadores ms experimentados y los ms sencillos a los programadores nveles. Posibilita el uso repetitivo de las rutinas en el mismo o en diferentes programas. Desventajas de la Modularizacin

6

No se dispone de algoritmos formales de modularidad, por lo que a veces los programadores no tienen claras las ideas de los mdulos. La programacin modular requiere ms memoria y tiempo de ejecucin.

Uso de los TDAAlgunos ejemplos de utilizacin de TDAs en programacin son:

Conjuntos: Implementacin de conjuntos con sus operaciones bsicas (unin, interseccin y diferencia), operaciones de insercin, borrado, bsqueda... rboles Binarios de Bsqueda: Implementacin de rboles de elementos, utilizados para la representacin interna de datos complejos. Aunque siempre se los toma como un TDA separado son parte de la familia de los grafos. Pilas y Colas: Implementacin de los algoritmos FIFO y LIFO. Grafos: Implementacin de grafos; una serie de vrtices unidos mediante una serie de arcos o aristas.

7

Mapa conceptual de TDAs

8

Ejemplo de TDA en Javapublic class TDA { public static int valor; TDA () {valor = 0;}; public static void Mdato (){ Valor = Integer.parseInt (JOptionPane.showInputDialog(Valor));} public static int Sdato () { return valor; } }

9

Memoria esttica y dinmica

Memoria esttica: Es la asignacin de memoria para algunos elementos fijos del programa que es controlada por el compilador. Define la cantidad de memoria necesaria para un programa durante el tiempo de compilacin. El tamao no puede cambiar durante el tiempo de ejecucin del programa. Algunos lenguajes de programacin utilizan la palabra static para especificar elementos del programa que deben almacenarse en memoria esttica. Elementos que residen en memoria esttica: o Cdigo del programa. o Las variables definidas en la seccin principal del programa, las cuales pueden solo cambiar su contenido no su tamao. o Todas aquellas variables declaradas como estticas en otras clases o mdulos.

Memoria dinmica: Es la asignacin y posible recuperacin de memoria durante la ejecucin de un programa y bajo su control. Define el tamao del espacio de memoria necesario para un programa en tiempo de ejecucin.

10

El tamao de los elementos puede cambiar durante la ejecucin del programa. Almacena todos los elementos definidos con la palabra new en un programa. Sus variables crecen de tamao o se reducen durante la ejecucin del programa. Estas se almacenan en un espacio de memoria llamado heap; el cual se localiza en la regin de memoria que esta encima del stack. Algunos lenguajes de programacin permiten que el programador asigne y desasigne manualmente la memoria Pero JAVA utiliza un recolector de basura.

11

INSTITUTO TECNOLOGICO de Tuxtepec

Estructura de Datos

Unidad 2Recursividad

Prof.: Tomas Torres Ramrez Alumna: Daniela Guadalupe Balbuena Saldivar Ingeniera en Informtica Tercer Semestre Grupo A

12

ndiceInvestigacin sobre recursividad Ejemplos de casos recursivos 14 20

13

Recursividad La recursividad consiste en realizar una definicin de un concepto en trminos del propio concepto que se est definiendo. Ejemplo: La ensima potencia de un nmero x, es 1 si n es igual a 0, o el producto de x por la potencia (n-1)-ensima de x, cuando n es mayor que 0. En este ejemplo se utiliza el concepto definido en la propia definicin. 2.2.- Diseo de mdulos recursivos. Mdulo M con una llamada a s mismo: mdulo recursivo directo. Mdulo M con una llamada a otro F, que hace una llamada a M: Mdulo recursivo indirecto. Ejemplo: Implementacin del factorial de un nmero. public long factorial (long n) { if (n == 0) return 1; else return n * factorial(n-1); } Dos partes principales: 8. La llamada recursiva, que expresa el problema original en trminos de otro ms pequeo, y 9. El valor para el cual se conoce una solucin no recursiva. Esto es lo que se conoce como caso base: una instancia del problema cuya solucin no requiere de llamadas recursivas. El caso base

14

10. Acta como condicin de finalizacin de la funcin recursiva. Sin el caso base la rutina recursiva se llamara indefinidamente y no finalizara nunca. 11. Es el cimiento sobre el cual se construir la solucin completa al problema.

La recursividad forma parte del repertorio para resolver problemas en Computacin y es de los mtodos ms poderosos y usados. Los algoritmos recursivos ofrecen soluciones estructuradas, modulares y elegantemente simples. La recursividad es un concepto fundamental en matemticas y en computacin. Una definicin recursiva dice cmo obtener conceptos nuevos empleando el mismo concepto que intenta describir. En toda situacin en la cual la respuesta pueda ser expresada como una secuencia de movimientos, pasos o transformaciones gobernadas por un conjunto de reglas no ambiguas, la frmula recursiva es un buen candidato para resolver el problema. Los razonamientos recursivos se encuentran en la base misma de las matemticas porque son necesarios para describir conceptos centrales como el de nmero: Ejemplo: 1. Factorial Definicin: factorial (n) = n! si n > 0 factorial (n) = n*n-1*n-2* ... * 1 si n > 0 el valor de 0! se define como factorial (0) = 1

15

Su definicin recursiva es: factorial (n) = 1 si n = 0 factorial (n) = n* factorial (n-1) si n > 0 as para calcular el factorial de 4: factorial (4) = 4 * factorial (3) = 4 * 6 = 24 factorial (3) = 3 * factorial (2) = 3 *2 = 6 factorial (2) = 2 * factorial (1) = 2 * 1 = 2 factorial (1) = 1 * factorial (0) = 1 * 1 = 1 esttica int factorial (int n) comienza si n = 0 entonces regresa 1 otro regresa factorial (n-1) * n termina Versin iterativa: esttica int factorial (int n) comienza fact ??? 1 para i ??? 1 hasta n fact ??? i * fact regresa fact termina

16

Las definiciones recursivas de funciones en matemticas que tienen como argumentos nmeros enteros, se llaman relaciones de recurrencia. Forma de una ecuacin de recurrencia: coar +c1ar-1 + c2ar-2 + ....+ ckar-k = f(r) funcin matemtica discreta donde ci son constantes, es llamada una ecuacin de recurrencia de coeficientes constantes de orden k, condicionada a que c0 y ck = 0. Una definicin recursiva dice cmo obtener conceptos nuevos empleando el mismo concepto que intenta definir. El poder de la recursividad es que los procedimientos o conceptos complejos pueden expresarse de una forma simple. Un razonamiento recursivo tiene dos partes: la base y la regla recursiva de construccin. La base no es recursiva y es el punto tanto de partida como de terminacin de la definicin. Ejemplo: Base: La secuenciacin, iteracin condicional y seleccin son estructuras vlidas de control que pueden ser consideradas como enunciados. Regla recursiva: Las estructuras de control que se pueden formar combinando de manera vlida la secuenciacin iteracin condicional y seleccin tambin son vlidos. Un conjunto de objetos est definido recursivamente siempre que: (B) algunos elementos del conjunto se especifican explcitamente (R) el resto de los elementos del conjunto se definen en trminos de los elementos ya definidos donde (B) se llama base (R) se llama clusula recursiva

17

Observaciones: 1. El procedimiento se llama a si mismo 2. El problema se resuelve, resolviendo el mismo problema pero de tamao menor 3. La manera en la cual el tamao del problema disminuye asegura que el caso base eventualmente se alcanzar La recursividad es un mtodo poderoso usado en inteligencia artificial, su poder es que algunos conceptos complejos pueden expresarse en una forma simple. Una definicin recursiva difiere de una definicin circular en que tiene una forma de escapar de su expansin infinita. Este escape se encuentra en la definicin o porcin no recursiva o terminal de la definicin. Las frmulas recursivas pueden aplicarse a situaciones tales como prueba de teoremas, solucin de problemas combinatorios, algunos acertijos, etc. Ejemplo: 1. Nmeros de Fibonacci Los nmeros de Fibonacci se definen como: FN = FN-1 + FN-2 para N > 2 F0 = F1 = 1 que definen la secuencia: 1,1,2,3,5,8,13,21,34,55,89,144, ..... Por ejemplo, si quisiramos encontrar Fibonacci de 5, entonces: Fibonacci (5) = Fibonacci (4) + Fibonacci (3) Fibonacci (4) = Fibonacci (3) + Fibonacci (2) Fibonacci (3) = Fibonacci (2) + Fibonacci (1)

18

Fibonacci (2) = Fibonacci (1) + Fibonacci (0) De manera iterativa el algoritmo podra ser: esttica int Fibonacci (int n) // versin iterativa 3 comienza fibo [0] ??? 1 fibo [1]??? 1 para i ???1 hasta n fibo [i] ??? fibo [i-1]+ fibo [i-2] regresa fibo [n] termina Resolviendo el mismo problema pero de manera recursiva, obtenemos: esttica int Fibonacci (int n) //versin recursiva comienza si n < 1 entonces regresa 1 otro regresa Fibonacci (n-1) + Fibonacci (n-2) termina Definicin: Cuando una llamada recursiva es la ltima posicin ejecutada del procedimiento se llama recursividad de cola, recursividad de extremo final o recursin de extremo de cola.

19

Definicin: Cuando un procedimiento incluye una llamada a si mismo se conoce como recursin directa. Definicin: Cuando un procedimiento llama a otro procedimiento y este causa que el procedimiento original sea invocado, se conoce como recursin indirecta. Al principio algunas personas se sienten un poco incmodas con la recursividad, tal vez porque da la impresin de ser un ciclo infinito, pero en realidad es menos peligrosa una recursin infinita que un ciclo infinito, ya que una recursividad infinita pronto se queda sin espacio y termina el programa, mientras que la iteracin infinita puede continuar mientras no se termine en forma manual. Cuando un procedimiento recursivo se llama recursivamente a si mismo varias veces, para cada llamada se crean copias independientes de las variables declaradas en el procedimiento. Ejemplos de casos recursivos El factorial de un numero natural es 1 si dicho numero es 0, o n multiplicado por el factorial del numero n-1, en caso contrario n= 4 24=4! 4*3!= 4 3*2!=3 2*1!=2 1*0!=1 1=0 Modelo recursivo directo: se llama asi mismo (m) (m) Modelo recursivo indirecto: llama a otros dentro del mismo programa. Otros ejemplos de recursividad:

20

Potencias de nmeros Divisin de restas sucesivas Factorial de nmeros Secuencia de Fibonacci

21

INSTITUTO TECNOLOGICO de Tuxtepec

Estructura de Datos

Unidad 3Estructuras Lineales

Prof.: Tomas Torres Ramrez Alumna: Daniela Guadalupe Balbuena Saldivar Ingeniera en Informtica Tercer Semestre Grupo A

22

ndiceInvestigacin sobre Pilas Cdigo fuente programa Pilados Cdigo fuente programa Pila modificado Cdigo fuente programa operaciones con pilas Investigacin sobre Listas Cdigo fuente programa Lista Cdigo fuente programa Colas 24 27 30 33 38 42 47

23

Investigacin sobre PilasUna pila (stack en ingls) es una estructura de datos de tipo LIFO (del ingls Last In First Out, ltimo en entrar, primero en salir) que permite almacenar y recuperar datos. Para el manejo de los datos se cuenta con dos operaciones bsicas: Apilar (push), que coloca un objeto en la pila, y su operacin inversa, Retirar (o desapilar, pop), que retira el ltimo elemento apilado.

En cada momento slo se tiene acceso a la parte superior de la pila, es decir, al ltimo objeto apilado (denominado TOS, top of stack en ingls). La operacin retirar permite la obtencin de este elemento, que es retirado de la pila permitiendo el acceso al siguiente (apilado con anterioridad), que pasa a ser el nuevo TOS. TDA Pilas Las pilas son una subclase de las listas lineales, en las que las operaciones sobre ellas se llevan a cabo por uno de los extremos, por lo que obedecen a una orden LIFO (Last Input First Output) (Ultimo en Entrar, Primero en Salir). Las operaciones bsicas de las pilas son Meter (Push) y sacas (Pop), adems del recorrido. La operacin Push inserta elementos en la pila y Pop elimina elementos de la pila. Las operaciones de insercin y eliminacin se hacen por el extremo final de la pila. Para controlar los elementos en la pila se uso de una variable auxiliar llamada Tope, el cual indica el ltimo elemento insertado en la pila, que es el mismo que debe eliminarse.

Operaciones con pilasLas operaciones elementales que pueden realizarse en una pila son: Poner un elemento (Push)

24

Quitar un elemento (Pop)

Considerando que se tiene una pila que puede almacenar un mximo nmero de elementos y que el ltimo de ellos est indicando por TOPE, los algoritmos son los siguientes: Pone (Push) Pone (Pila, Max, Tope, Dato) (Este algoritmo pone el elemento Dato en Pila. Actualiza el valor de Tope. Max es el mximo nmero de elementos que puede almacenar Pila). 1. Si Tope < Max {Verifica que haya espacio libre} entonces Hacer Tope Tope + 1 {actualiza Tope} y Pila [Tope] Dato {pone el nuevo elemento en el Tope de Pila} Si no Escribir Desbordamiento 2. {Fin del condicional del paso 1} Quita (Pop) Quita (Pila, Top, Dato) {Este algoritmo saca el ltimo elemento de Pila y lo guarda en Dato. Actualiza el valor de tope} 1. Si Tope > 0 {verifica que la pila no este vaca} Entonces Hacer Dato Pila [Tope] y Tope Tope-1 {actualiza Tope} Si no

25

Escribir Subdesbordamiento 2. {fin del condicional del paso 1} Algoritmo para insertar en Pila Push (Dato) Si Pila llena Pila llena De otro modo Tope ++ Pila [Tope] Dato Fin Si Algoritmo para quitar en Pila Si Pila Vacia Pila Vacia De otro modo Dato Pila [Tope] Tope Fin Si

26

Cdigo fuente programa Piladospublic class pilados{ class Nodo{ int info; Nodo sig; } private Nodo raiz; public pilados(){ raiz=null; } public void insertar(int x){ Nodo nuevo; nuevo= new Nodo(); nuevo.info=x; if (raiz==null) { nuevo.sig=null; raiz=nuevo; } System.out.println("\n"+x); } public int extraer(){

if(raiz!=null){ int informacion=raiz.info; raiz=raiz.sig; return informacion;

27

} else{ return Integer.MAX_VALUE;} // } public void imprimir(){ Nodo reco=raiz; System.out.println("listado de todos los elementos de la pila."); while (reco!=null){ System.out.print(reco.info+"."); } System.out.println(); } public static void main(String[]ar){ pilados pila1=new pilados(); int op=4,dato; do{ String menu="\n\n Menu de opciones \n\n 1)Insertar \n\n 2)Eliminar \n\n 3)Listar \n\n 4)Salir \n\n Elige una opcion:"; op=Integer.parseInt(JOptionPane.showInputDialog(menu)); switch(op){ case 1:dato=Integer.parseInt(JOptionPane.showInputDialog("Dato a insertar:")); pila1.insertar(dato); break; case 2:dato=pila1.extraer(); JOptionPane.showMessageDialog(null,"El dato eliminado es:"+dato); break; case 3:pila1.imprimir(); break; System.out.println(raiz);

28

case 4: JOptionPane.showMessageDialog(null,"Fin del programa"); } } while(op!=4); } }

29

Cdigo fuente programa Pila modificadoimport javax.swing.*; public class Pila2{ class Nodo{ int info; Nodo sig; } private Nodo raiz; public Pila2(){ raiz=null; } public void insertar(int x){ Nodo nuevo; nuevo= new Nodo(); nuevo.info=x; if (raiz==null) { nuevo.sig=null; raiz=nuevo; } System.out.println("\n"+x); } public int extraer(){

if(raiz!=null){ int informacion=raiz.info; raiz=raiz.sig; return informacion;

}

30

else{ return Integer.MAX_VALUE;} // } public void imprimir(){ Nodo reco=raiz; System.out.println("listado de todos los elementos de la pila."); while (reco!=null){ System.out.print(reco.info+"."); } System.out.println(); } public static void main(String[]ar){ Pila2 pila1=new Pila2(); int op=4,dato; do{ String menu="\n\n Menu de opciones \n\n 1)Insertar \n\n 2)Eliminar \n\n 3)Listar \n\n 4)Salir \n\n Elige una opcion:"; op=Integer.parseInt(JOptionPane.showInputDialog(menu)); switch(op){ case 1:dato=Integer.parseInt(JOptionPane.showInputDialog("Dato a insertar:")); pila1.insertar(dato); break; case 2:dato=pila1.extraer(); JOptionPane.showMessageDialog(null,"El dato eliminado es:"+dato); break; case 3:pila1.imprimir(); break; case 4: JOptionPane.showMessageDialog(null,"Fin del programa"); } System.out.println(raiz);

31

} while(op!=4); } }

32

Cdigo fuente programa operaciones con pilasimport javax.swing.*; import java.awt.*; import java.awt.event.*; public class operacionespila { public static void main(String args[]) { menupila obj=new menupila(); int maxpila=Integer.parseInt(JOptionPane.showInputDialog("Ingresa la cantidad de numeros que se almacenara en la pila")); int vector[]=new int[maxpila]; int ultele=0, e=0, a=0, cn; String txt=""; String txt1=""; while(a==0) { int opc=obj.opciones(); if (opc>=1 && opc