Estructura de Datos En C++

Slides:



Advertisements
Presentaciones similares
Complejidad Computacional
Advertisements

Complejidad Computacional
Diseño y análisis de algoritmos
Diseño y análisis de algoritmos
Programación II Recursividad
Programación Básica con NQC Pedro F. Toledo – Patricio Castillo 18/08/2006.
Funciones y recursividad
Estructura de Datos En C++
Programación Científica
Elementos básicos del Lenguaje
Programación I Teoría III
Tipos de Datos Básicos y Estructurados
FUNCIONES EN C.
Funcionamiento, programación
ALGORÍTMICA Dpto. Ingeniería de Sistemas y Automática
Unidad 3 Punteros.
Recursión Se dice que un método es recursivo si forma parte de sí mismo o se define en función de sí mismo. La recursión es un medio particularmente poderoso.
Simulación de la recursión Estructuras de datos. Llamada y regreso de una función Al llamar a una función se realizan los siguientes tres pasos: 1. Transferencia.
2.1 Recursividad El hecho de que una función pueda llamarse a sí misma.
CI TEORIA semana 8 Subprogramas o funciones Definición de funciones.
Programación I Teoría VI: Recursividad
FUNCIONES Y PROCEDIMIENTOS
Estructura de Datos En C++
REPRESENTACIÓN GRÁFICA DE ALGORITMOS
Nombre, Alcance y Asociaciones (Bindings). Agenda Definición Nombre y Bindings Binding Time Importancia del Binding Time Eventos relacionados a la Asociación.
LENGUAJE “C” Programación.
Semana 5 Subprogramas..
Programación en Matlab
Análisis de Algoritmos
Recursión en programación
UNIDAD V Arreglos y Cadenas
Estructura de Datos En C++
Índice. Revisando conceptos acerca de la memoria.

Programación Científica
Introducción al análisis de algoritmos
Algoritmos.
Estructura de Datos En C++
Estructura de Datos y Algoritmos
ESTRUCTURA DE DATOS EN JAVA
Estructuras de Datos Arreglos.
Estructura de Datos En C++
Programación IMC José Andrés Vázquez Flores. Definición Un arreglo es un conjunto finito e indexado de elementos homogéneos, que se referencian por un.
Material de apoyo Unidad 4 Estructura de datos
Análisis de algoritmos
Figure: Algoritmos Conceptos básicos. Programación: 1.Establecer una secuencia de acciones que: puedan ser ejecutadas por el procesador realicen una.
Computación I Primer Semestre 2006 Capítulo IV Ciclos y Colecciones (con un sabor a algoritmos)
Recursividad.
Recursividad (2 clases) 1. Nivelación Funciones Menú Vectores String
Estructuras de control Resolución de problemas y algoritmos.
Programación Procedural y Recursiva en C++
Conceptos Avanzados de Programación
ELEMENTOS DE COMPUTACIÓN Profesor: Guillermo Figueroa
Oscar Bedoya. Edificio 331, 2º piso, E.I.S.C. Estructuras de datos y algoritmos.
Ing. Betty Suárez Torres
2008 Escuela de Informática y Telecomunicaciones, DuocUC Escuela de Informática y Telecomunicaciones Clase 9: Funciones, variables y arreglos en BASH Nombre.
Fundamentos de Programación
METODOS DE BUSQUEDA EN C++ Oscar Michel Ruiz León
Unidad V Recursión. Objetivos del Aprendizaje Explicar el concepto de recursión. Discutir las diferentes condiciones que deben ser satisfechas para que.
Conalep Coacalco Algoritmos Recursivos
Estructura de Datos En C++
Introducción a los TADs
Estructura de Datos En C++
 Las funciones son un conjunto de instrucciones que realizan una tarea específica. En general toman unos valores de entrada, llamados parámetros y proporcionan.
MEMORIA DINÁMICA.
ESTRUCTURAS DE DATOS “Conceptualización de estructuras de datos” Por: Eduardo Robayo.
UNIVERSIDAD TECNOLÓGICA DE PANAMÁ Facultad de Ingeniería de Sistemas Computacionales Programa de Lic. en Informática Educativa Computación.
Lenguaje de Programación II Prof. Rafael Montenegro B. Carrera: T.S.U en Informática Periodo: 2014-I.
Recursividad.
UNIVERSIDAD AUTÓNOMA DEL ESTADO DE MÉXICO FACULTAD DE INGENIERÍA COORDINACIÓN DE MATERIAS PROPEDÉUTICAS INGENIERÍA EN SISTEMAS ENERGÉTICOS SUSTENTABLES.
Transcripción de la presentación:

Estructura de Datos En C++ Dr. Romeo Sánchez Nigenda. E-mail: romeo.sanchez@gmail.com http://yalma.fime.uanl.mx/~romeo/ Oficina: 1er. Piso del CIDET. Oficina con Dr. Oscar Chacón Horas de Tutoría: 10am-11am Martes y Jueves, 3:30pm-4:30pm Miércoles, 2:00pm-4:00pm Viernes. Website: http://yalma.fime.uanl.mx/~romeo/ED/2011/ Sesiones: 48

Objetivo General: Conocerá y manejará las estructuras internas de información Temario: Conceptos Básicos La Pila Colas Recursión Listas Árboles Ordenamiento Búsqueda Administración de Almacenamiento Total a calificar: 110 puntos. 40% Tareas 30% Examen Parcial 30% Examen Final 10% Participación

Material de apoyo: Software: Estructura de Datos con C y C++. Yedidyah Langsam, Moshe J. Augenstein, Aaron M. Tenenbaum, Brooklyn College Segunda Edición, Prentice-Hall. Algorithms. Third Edition. Parts 1-4, Fundamentals Data Structures Sorting Searching Robert Sedgewick. Estructura de Datos. Román Martínez, Elda Quiroga. Thomson Learning. Cualquier libro de Estructura de Datos! Software: Compiladores GCC (GNU Compiler Collection) IDEs (Integrated Development Environment): http://www.eclipse.org/downloads/ http://kdevelop.org/ http://www.bloodshed.net/devcpp.html

4. Recursión Objetivo: El alumno comprenderá la representación y manejo de datos en forma recursiva Temario: Definición Ejemplos Factorial de un número Serie de Fibonacci Cálculo de una inversión Funcionamiento interno de la recursión Uso de pilas para simular recursión

Recursividad Es la forma en la cual se especifica un proceso basado en su propia definición. Es evidente que el proceso especificado debe terminar con un resultado definido. Un problema que pueda ser definido en función de su tamaño, sea este N, puede ser dividido en instancias más pequeñas del mismo problema, aplicándose inducción sobre las más pequeñas para resolver el problema en general. Ejemplo: Función Factorial n! Dado un entero positivo n, se define al factorial de n como el producto de todos los enteros entre n y 1. Por ejemplo el factorial de 5 = 5 * 4 * 3 * 2 * 1 = 120 Entonces: n! = 1 if n==0 Otra manera n! = n * (n – 1) * (n – 2) … * 1 si n>0

Factorial Solución iterativa: Características de una función factorial prod = 1 for(int x = n; x > 0; x++) { prod *= x; } return prod; Características de una función factorial 0! = 1 1! = 1 * 0! 2! = 2 * 1! 3! = 3 * 2! … n! = n * (n-1)!

Factorial y Funcionamiento Interno Siguiendo nuestra definición, el factorial de 5! es: 5! = 5 * 4! 4! = 4 * 3! 3! = 3 * 2! 2! = 2 * 1! 1! = 1 * 0! 0! = 1 0! = 1, 1! = 1 * 1 = 1 2! = 2 * 1 = 2 3! = 3 * 2 = 6 4! = 4 * 6 = 24 5! = 5 * 24 = 120 Internamente, las funciones recursivas utilizan pilas para mantener las generaciones sucesivas de variables locales y parámetros. Cualquier referencia a una variable local se hace través del tope de la pila Cada vez que se introduce una función recursiva se agrega al tope de la pila una nueva asignación de sus variables. old Cuando retorna la función, se remueve la pila, se libera la asignación en el tope, y la asignación previa se convierte en el tope actual de la pila. new

Factorial Función Recursiva Multiplicación de Números Naturales int factorial(int n) { if (n == 0) return 1; else if(n<0) return 0; //Error no existe factorial de números negativos return n * factorial(n – 1); } Multiplicación de Números Naturales El producto a * b se define como a sumado a sí mismo b veces, es decir: a * b = a if b==1 a * b = a * (b – 1) + a if a>1 5 * 3 = 5 * 2 + 5 = 5 * 1 + 5 + 5 = 5 + 5 + 5 = 15 int natural(int a, int b){ if(b == 1) return a; else return natural(a, b-1) + a;

Secuencia Fibonacci Secuencia de enteros en la que cada elemento en la secuencia es la suma de los dos elementos anteriores 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, … donde fib(0) = 0, y fib(1) = 1 Definición recursiva Fib(n) = n if n==0 || n==1 Fib(n) = Fib(n-2) + Fib(n-1) if (n>=2) Ejemplo: Fib(6) = Fib(4) + Fib(5) = Fib(2) + Fib(3) + Fib(5) = Fib(0) + Fib(1) + Fib(3) + Fib(5) = 0 + 1 + Fib(3) + Fib(5) = 1 + Fib(1) + Fib(2) + Fib(5) = 1 + 1 + Fib(0) + Fib(1) + Fib(5) = 1 + 1 + 0 + 1 + Fib(5) = 3 + Fib(5) = 3 + Fib(3) + Fib(4) = 3 + Fib(1) + Fib(2) + Fib(4) = 3 + 1 + Fib(0) + Fib(1) + Fib(4) = 4 + 0 + 1 + Fib(4) = 5 + Fib(2) + Fib(3) = 5 + Fib(0) + Fib(1) + Fib(3) = 5 + 1 + Fib(3) = 6 + Fib(1) + Fib(2) = 6 + 1 + Fib(2) = 7 + Fib(0) + Fib(1) = 8

Secuencia Fibonacci Algoritmo iterativo Algoritmo Recursivo int lfib=0, hfib=1, x; for(int i=2;i<=n;i++){ x = lfib; lfib = hfib; hfib = x+lfib; } return hfib; Algoritmo Recursivo int fibonacci(int n){ if (n == 0 || n == 1) { return n; return fibonacciR(n - 1) + fibonacciR(n - 2);

Búsqueda Binaria > < Considere un conjunto de elementos ordenados La búsqueda secuencial checaría elemento por elemento 2 5 8 9 10 20 25 33 45 80 32? La búsqueda binaria reduce los elementos a buscar por la mitad al considerar la primera mitad del arreglo si el elemento a buscar es menor que el elemento intermedio, o la segunda mitad si es mayor intermedio N-1 2 5 8 9 10 20 25 33 45 80 min max < > 32? A considerar

Búsqueda Binaria > < < > > intermedio N-1 intermedio 2 intermedio N-1 intermedio 2 5 8 9 10 20 25 33 45 80 (Min+max) /2 min max 4 > < 32? A considerar 2 5 8 9 10 20 25 33 45 80 7 Descartados! min max < > 32? A considerar 2 5 8 9 10 20 25 33 45 80 5 min max > 32?

Búsqueda Binaria int busqueda_binaria(int a[], int min, int max, int elem){ //No encontramos el elemento cuando los dos extremos se cruzan if(min>max) return -1; //Index intermedio int pivote = (int)(min+max)/2; //Regresa el intermedio si es igual que el elemento que busco if(elem == a[pivote]) return pivote; if(elem < a[pivote]) return busqueda_binaria(a,min, pivote-1, elem); else return busqueda_binaria(a,pivote+1, max, elem); }

Propiedades de un algoritmo recursivo Para que sea correcto no debe generar una secuencia infinita. Debe definirse una función recursiva f en términos que no implique f para algunas secuencias Ejemplos: Factorial: 0! =1 Fibonacci: fib(0) = 0, fib(1) = 1 Búsqueda Binaria: if(min>max) return -1; if(elem==a[pivote]) return pivote; Definir una función recursiva en términos de casos más simples. Por ejemplo, el factorial de un número n! puede definirse como n * (n-1)!

Simulación de recursión usando pilas Motivación: Algunos lenguajes de programación (como Fortran y Cobol) no permiten funciones recursivas. En muchos casos, una solución recursiva es más costosa que una no recursiva, tanto en términos de tiempo como de espacio.

Simulación de recursión usando pilas Qué sucede cuando se llama a una función? Se pasan argumentos Asignan e inicializan variables locales Establecer el control de la función (dirección de retorno) Que sucede cuando retorna una función? Se recupera dirección de retorno Se libera el área de datos de la función (e.g., variables locales) Se restablece el control para la rutina que llama y se guardan valores de retorno de la función Note que la cadena de direcciones de retorno forma una pila. Es decir, la dirección de retorno más reciente es la primera que se remueve de la cadena, y únicamente podemos acceder a la dirección de retorno dentro de la que se ejecuta la función (el tope)

Simulación de recursión usando pilas Ejemplo: Factorial(n) Versión simulada con Pilas int simfactorial(int n) { struct stack s; int x = n; long int prod; s.top = -1; while (x != 0) { push(&s, x--); } prod = 1; while (s.top >= 0) { prod *= pop(&s); return prod; Versión Recursiva Encadenamiento int factorial(int n) { if (n == 0) return 1; return n * factorial(n – 1); } Recursión