Estructura de Datos y Algoritmos

Slides:



Advertisements
Presentaciones similares
Arreglos Unidimensionales y Bidimensionales ESTRUCTURAS DE DATOS I
Advertisements

PROF. ING. JULIO CESAR CANO RAMIREZ
Unidad 5 Listas Enlazadas Bibliografía: Algoritmos y Estructuras de datos de Aguilar y Martinez. Unidad 9 Autor: Ing Rolando Simon Titiosky.
Listas enlazadas c++ Prof. Franklin Cedeño.
ESTRUCTURA DE DATOS.
Direcciones, Arreglos y Argumentos de Funciones
Estructuras de datos. Programación, Algoritmos y Estructuras de Datos.
Tipos de Datos Básicos y Estructurados
Funcionamiento, programación
PROGRAMACION DE ESTRUCTURAS DE DATOS
UNIVERSIDAD NACIONAL AUTÓNOMA DE MÉXICO FACULTAD DE INGENIERIA DIVISIÓN DE INGENIERÍA ELÉCTRICA COMPUTACIÓN PARA INGENIEROS NOTA IMPORTANTE: Para complementar.
Estructuras Compuestas.
ALGORÍTMICA Dpto. Ingeniería de Sistemas y Automática
Windows XP sp3.
Teoría de lenguajes y compiladores
Unidad 3 Punteros.
Herramientas para el acceso directo a memoria en C++
¿Qué es un PUNTERO?: Un puntero es un objeto que apunta a otro objeto. Es decir, una variable cuyo valor es la dirección de memoria de otra variable. No.
Vectores en java.
Tema 6: Clases Antonio J. Sierra.
Práctica 7 AOC. Gestión de la pila Una pila es una estructura de datos caracterizada por que el último dato que se almacena es el primero que se obtiene.
PROGRAMACION II.  Es un conjunto de datos no necesariamente del mismo tipo, los cuales se podrán manipular o realizar cualquier operación sobre cada.
C++ LISTAS C++ 11/04/2017 Ing. Edgar Ruiz Lizama.
CARACTERÍSTICAS DE LOS PROGRAMAS
TIPOS Y ESTRUCTURAS BÁSICAS DE DATOS
ESTRUCTURAS DE DATOS I Conocer, comprender y analizar algunos de los principales tipos de estructuras de datos.
Índice. Revisando conceptos acerca de la memoria.
Estructura de Datos y Algoritmos
Clase 10: Estructuras de datos y arreglos.
Sistemas decimal, binario, octal y hexadecimal
Estructura de Datos II Equipo 4 Equipo 7 Acosta Montiel Miguel A.
COMPUTACIÓN I TEMA 6. Pasaje de parámetros por Referencia. Uso de apuntadores Prof. Mireya Morales.
Programación I Técnico Universitario en Web Dpto. de Informática FCFMyN - UNSL -11-
Aplicación de estructuras de datos
Ada 2º Parte (variables, ámbitos , subrutinas , tipos abstractos de datos y excepciones)
APRENDIZ: SANDRA L. CAICEDO C. ORDEN: 20194
Informática Ingeniería en Electrónica y Automática Industrial
Programación en C para electrónicos
Análisis y Diseño de Algoritmos
Tema 2: Base de datos relacionales
Listas Ligadas Simples. Definíción I  Es, en sencillas palabras. un grupo de datos organizados secuencialmente, pero a diferencia de los arreglos, la.
Introducción a la programación
Unidad 1: FUNDAMENTOS DE COMPUTACIÓN Y PSEUDOLENGUAJE
Tipos de Datos abstractos
La vida sería mucho más sencilla si pudiéramos echar un vistazo al código fuente. Anónimo.
Punteros Recomendado: 1. Nivelación Funciones
FUNDAMENTOS DE PROGRAMACIÓN
Objetivo Mostrar los fundamentos de la programación a través de ejemplos y prácticas utilizadas cotidianamente en el desarrollo de aplicaciones.
Términos algoritmo diseñar algoritmo implementar algoritmo
ELEMENTOS DE COMPUTACIÓN Profesor: Guillermo Figueroa
Teoría de lenguajes y compiladores

Teoría de Sistemas Operativos Memoria Departamento de Electrónica 2º Semestre, 2003 Gabriel Astudillo Muñoz
Presente un cuestionario con los aspectos mas importantes sobre los
ESTRUCTURA DE DATOS. Evaluación Exámenes 70% Acumulativo 30% Total 100% Acumulativos 1.T. Investigación.
Introducción a los TADs
Computación I. CI-2125 Tema VII
Lic. Carla Aguirre Montalvo
Algoritmos y Desarrollo de Programas I

EL TIPO DE DATO LOGICO y constantes.
PARCIAL III Tipo de datos estructurados. DATO Información en volumen, sin ningún significado Dado un enunciado, evento o acción, los datos Permiten representar.
MEMORIA DINÁMICA.
PUNTEROS. Los punteros son de amplia utilización en programación y muchos lenguajes permiten la manipulación directa o indirecta de los mismos. Su razón.
Gabriela Araya Baez Estudiante Ingenieria Civil Industrial.
Tipos de Datos abstractos
FUNDAMENTOS DE PROGRAMACIÓN VARIABLES, CONSTANTES Y TIPOS DE DATOS EN C.
UNIVERSIDAD TECNOLÓGICA DE PANAMÁ Facultad de Ingeniería de Sistemas Computacionales Programa de Lic. en Informática Educativa Computación.
Katty Evangelina Hipólito Chi.   Aunque cada maquina tiene un lenguaje ensamblador distinto, el proceso de ensamblador tiene suficiente similitudes.
Ing. Barros Rodriguez D. Ronald Introducción a la Programacón.
Transcripción de la presentación:

Estructura de Datos y Algoritmos Repaso Tipos de Datos

¿Qué es un dato? Información en bruto, sin ningún significado Dado un enunciado, evento o acción, los datos Permiten representar sus actores o participantes Analizándolos, se podrá obtener resultados deseados Analicemos el siguiente hecho: El estudiante Juan Paz de edad 23 años, tiene promedio 8.3 en sus calificaciones Podemos tomar los siguientes datos Nombre: Juan Paz -> Conjunto de Caracteres Edad: 23 -> entero Promedio: 78,3 -> real

Como representar los datos Los seres humanos: Usamos lenguaje natural o símbolos Ejemplo: Para representar números, usamos el sistema decimal Para representar palabras, usamos el abecedario La computadora: Usa conjuntos de 1s y 0s El dato mas pequeño en el computador es Un 1 o un 0 -> bit El conjunto de 8 bits -> 1 byte

Como representar los datos Los datos se clasifican en TIPOS Son los diferentes dominios existentes. Ejemplo: Edad, Año de Nacimiento, Numero de multas Tienen dominio numérico Nombre, Dirección, Num. Cedula, Caen en el dominio de la información tipo texto Y las operaciones permitidas para dicho dominio

Tipos de Datos Básicos NOMBRE CONJUNTO DE VALORES OPERACIONES Enteros Negativos y positivos sin decimal Sumar, restar, dividir, multiplicar, residuo Reales Negativos y positivos, con decimal Sumar, restar, dividir, multiplicar Lógicos Verdadero o Falso(1 o 0) And, Or, Not Caracteres Letras, números, especiales, juntos forman una cadena Sumar carácter + entero restar, multiplicar por entero

En la computadora 1000 1001 1002 1003 Solo vienen integrados los tipos de datos básicos En la computadora Cada byte es un casillero y tiene una dirección en memoria Los datos (números y letras) se almacena en estos casilleros ¿Cuantas casilleros ocupa un dato? Depende de su tipo y del hardware de la computadora Un entero puede ocupar casillas de hasta 4 bytes Un doble siempre ocupara mas, por su mayor precisión PERO, un carácter SIEMPRE ocupara casillas de 1 byte

Declaración de variables en C Una declaración de variables en C incluye Tipo de dato y Nombre de variable(identificador) Ejemplo: int a, b; float c; ¿Para que se declaran variables? Especifica cuanta memoria debe reservarse y Como se van a interpretar dichos datos f = a + b Es una suma de enteros, que al final se convierte a real 100 101 102 103 104 4 bytes, dir: 100 int a; char c; 1 byte, dir: 104

Direcciones de Memoria Las variables Tienen direcciones de memoria Si deseamos conocer dicha dirección En lenguaje C Se usa el operador & de dirección 1000 1001 1002 1003 Ejemplo: int a; a = 3; printf(“Valor:%d Dir: %d”, a, &a); &a es 1000 Un puntero Es una variable que puede almacenar dirección de memoria

Estructura de Datos y Algoritmos Repaso Estructuras de Datos

¿Qué es una Estructura de Datos? Una estructura de datos es una forma de organizar un conjunto de datos elementales con el objetivo de facilitar su manipulación. Un dato elemental es la mínima información que se tiene en un programa.(ejemplos de datos elementales serían int, float, char,etc…) Lo que se pretende con las estructuras de datos es facilitar un esquema lógico para manipular los datos en función del problema que haya que tratar y el algoritmo para resolverlo.

¿Qué es una Estructura de Datos? En algunos casos la dificultad para resolver un problema radica en escoger la estructura de datos adecuada. Y, en general, la elección del algoritmo y de las estructuras de datos que manipulará estarán muy relacionadas.

Ejemplos de estructuras de datos Vectores (matriz o array) Listas Enlazadas Pilas (stack) Colas (queue) Árboles Árboles Binarios Árboles finitarios Conjuntos (set) Grafos Tablas Hash

Estructura de Datos y Algoritmos Tipos Inductivos

Tipos Inductivos ("Recursivos") tienen en general cardinalidad infinita contienen valores de "tamaño arbitrario" Ejemplos: números naturales listas

Tipos Inductivos ("Recursivos") Tomemos por ello un problema para representar estos tipos en computadoras Concretamente: ¿Cómo se implementan las variables de estos tipos ? T x;//T es el tipo de la variable x un espacio fijo en memoria con una dirección (secuencia de bits ubicada en cierta posición de la memoria) El espacio debe ser suficiente para contener cualquier valor de tipo T

Tipos Inductivos ("Recursivos") Si los valores de tipo T pueden ser de tamaño arbitrariamente grande, entonces no hay espacio finito suficiente para contener cualquier valor de tipo T. Por ello: sólo un rango de los naturales es representable: ([MinNat, MaxNat])

El caso de las listas ¿Cómo tendría que ser una variable capaz de contener cualquier lista? infinita de tamaño ajustable (Cada lista es finita; pero la variable debería poder crecer y contraerse al agregar y quitar elementos de la lista)

El caso de las listas Solución: La lista se extiende "hacia afuera" a lo largo de la memoria ocupando un número de variables.

El caso de las listas ¿ Cómo ? Ejemplo: Consideramos [1, 2, 3] Cada elemento es representable en una variable común (ej.: de tipo CARDINAL)

El caso de las listas A esta información, hay que agregar otra, que representa la estructura (lineal) de la lista: ¿ Dónde está el primer elemento ? ¿ Dónde está el siguiente de cada elemento ?

El caso de las listas Si llamamos a la lista en cuestión, podemos representarla con una variable que: indique dónde está el primer elemento, o sea que apunte a la variable que contiene el primer elemento, que es lo mismo que contenga como valor la dirección (un nombre, una referencia a) de la variable que contiene el primer elemento

El caso de las listas

El caso de las listas ¡¡¡Necesitamos un nuevo “tipo” de valores !!! Direcciones Referencias Nombres indicadores (indicaciones) punteros Debe poderse representar la lista vacía, cuyo primer elemento no existe. Necesitamos un valor que “no apunte”.Este valor se conoce como NULL . Operación:  es la variable a la que señala (apunta) Notar que  no está definida para l = NULL

El caso de las listas Además necesitamos representar la estructura secuencial. Para ello, hacemos que cada componente de la lista apunte al siguiente:

El caso de las listas Tenemos NODOS formados por dos componentes (campos):   El elemento propio de la lista (información) El puntero al siguiente nodo (posiblemente no existente) En C podemos representar los nodos como estructuras (struct)

El caso de las listas Debe poderse crear y destruir variables en forma dinámica (mediante instrucciones de programa, durante la ejecución de los programas) ¿ Por qué ?

S = x.S (operación que agrega un elemento a la lista) El caso de las listas Debemos poder implementar asignaciones (abstractas) como: S = x.S (operación que agrega un elemento a la lista) (comparar con n = n + 1) En tal caso, la lista contenida en la variable S se agrandaría en un elemento

El caso de las listas En la representación con nodos y punteros, corresponde a crear un nuevo nodo y agregarlo a la lista. Por ejemplo, a la asignación abstracta l = 0.l (antes de la asignación l=[1,2,3]) corresponde:

El caso de las listas El nuevo nodo: debe ser creado debe cargársele información l debe ser actualizada Igualmente, deben poderse destruir nodos, correspondientemente con las operaciones que borran elementos de listas Tenemos pues ESTRUCTURAS DINÁMICAS. Su tamaño es gobernado por instrucciones de Programa. Esto no pasa con estructuras estáticas como son los arreglos.

Listas Encadenadas

Estructura de Datos y Algoritmos Repaso Punteros

(que en C se declararía: T *variable;) Punteros en C Para cada tipo T existe el tipo de los punteros a variables de tipo T: POINTER TO T (que en C se declararía: T *variable;)

Punteros en C Notar que si p es una variable de tipo POINTER TO T, entonces los estados posibles de p son:   Estar apuntando a una variable de tipo T Contener el valor NULL (tiene valor, pero no apunta) No tener valor (no haber recibido todavía valor)

Punteros en C El único literal (constante primitiva) de cada tipo de puntero es NULL Las operaciones asociadas a cada tipo de puntero son:  (puntero a variable) + - == (verificación de igualdad de dos punteros, y solo de punteros) = (asignación)

pt almacena la dirección de x, se dice que pt apunta a x Punteros en C Un tipo de dato El puntero solo podrá almacenar direcciones de memoria de variables del tipo especificado Se pueden definir punteros de cualquier tipo: float *pf; char *pc; Un identificador que siempre va antecedido del operador * 1000 x 3 1001 1003 1000 1000 pt 1005 pt almacena la dirección de x, se dice que pt apunta a x int *pt, x; x = 3; pt = &x;

Imprime ‘N’ pues c ya cambio Punteros en C Un puntero apunta a una variable A través del puntero se puede llegar a conocer todo sobre la variable Ejemplo: char c, *pc1, *pc2; pc1 = &c; Si quiero conocer la dirección, uso el puntero printf(“%d”, pc1); //Imprimo la dir. Almacenada por pc1 pc2 = pc1; //pc2 almacena la misma dir. que pc1 Si quiero conocer el contenido al que apunta un puntero, uso el operador *, sobre dicho puntero Es equivalente a : printf(“%c”, c); c = ‘A’ printf(“%c”, *pc1); *pc1 = ‘N’ printf(“%c”,c); Es equivalente a : c = ‘N’ Imprime ‘N’ pues c ya cambio

#include <stdio.h> Punteros en C A éstas operaciones deben agregarse las operaciones que permiten crear y destruir variables dinámicamente En todo contexto en que sea válida la importación:   #include <stdio.h>

Punteros en C Tomemos disponibles las siguientes funciones (C extendido), para cualquier tipo T:   T *variable = new(T); delete(variable); delete [] variable (si variable es un arreglo creado dinamicamente)

Punteros en C El funcionamiento de estos procedimientos es como sigue: p = new(T) Crea una variable de tipo T (siendo p una variable de tipo POINTER TO T) deja p apuntando a esa nueva variable no importando cuál era el estado previo de p delete(p) Tiene como precondición que p esté apuntando a alguna variable La variable apuntada por p desaparece p queda "sin valor"

Punteros en C Los tipos de punteros son atómicos. Pueden ser retornados como valores de funciones. Son usados para formar estructuras encadenadas. Dada una variable T *p hay tres formas de asignarle valor p = NULL; p = q; P = new(T);

Asignar un valor a un puntero p = NULL, hace que p "no apunte"

Asignar un valor a un puntero p = q, donde q es otra variable del mismo tipo que p. Entonces q debe tener valor. Luego de esta asignación, o bien p y q son NULL (no apuntan) o bien apuntan a la misma variable.

Asignar un valor a un puntero p = new(T), es la manera de crear punteros efectivos a variables. Luego, necesariamente, si un puntero apunta a una variable, ésta es una variable creada dinámicamente (usando new)

Punteros en C Observaciones Complementarias Dada la siguiente situación: Decimos que p, q (sus punteros) son alias de la misma variable.

Punteros en C ¿ Qué ocurre al ejecutarse delete(p)? q queda apuntando a una variable inexistente (lo cual es diferente de contener el valor NULL, es decir: "NO APUNTAR") De hecho, ocurre que los contenidos de ambas variables son inútiles. O sea, la situación es análoga al caso en que no tienen valor asignado.

Punteros en C ¿ Qué ocurre al ejecutarse DELETE(p)? Ejecutar p o q en esta situación conduce a un error de ejecución (el mensaje suele ser “SEGMENTATION FAULT" o algo que sugiera "ausencia de variable alojada en la dirección en cuestión") En presencia de alias, la ejecución de DELETE puede tener, como efecto lateral, que más de un puntero quede "apuntando a una variable inexistente“  OJO

Punteros en C Sean p, q variables de tipo char*, tal que:

Punteros en C ¿Que pasa si hacemos …? [1]p = q [2]*p = *q (esta es la notación en C para p y q respectivamente)

¿Que pasa si hacemos …? Luego de ejecutar [1], tenemos: (Notar también el desperdicio posible de memoria luego de ejecutar [1], ‘a’ queda inaccesible y “gastando memoria”)

¿Que pasa si hacemos …? Luego de ejecutar [2], tenemos:

Punteros en C NEW y DELETE son traducidos en términos de los procedimientos (más primitivos) malloc y free. Esto explica porqué importamos los últimos pero usamos los primeros.

Referencias http://www.fing.edu.uy/inco/cursos/prog2 www.dspace.espol.edu.ec/bitstream/.../1.Tipos%20de%20Datos.ppt

Bibliografía Wirth, N. Algoritmos y Estructuras de Datos. Prentice-Hall. 1987.

FIN ¿Preguntas?