Tecnológico Nacional de México
Ingeniería en Sistemas Computacionales
Estructura de datos
Unidad 1: Introducción a las estructuras de datos
Retícula ISIC-2010-224: Programa: AED-1026;
Estructura de datos - Unidad 1: Introducción a las estructuras de datos
1. Instituto Tecnológico Superior de Guasave
Ingeniería en Sistemas Computacionales
Estructura de Datos
Unidad I: Introducción a las Estructuras de Datos
Mtro. José Antonio Sandoval Acosta
Retícula ISIC-2010-224: Programa: AED-1026/2016
Itsguasave.edu.mx
2. Competencia de la Unidad
Conoce y comprende las diferentes estructuras de datos, su clasificación y forma
de manipularlas para buscar la manera más eficiente de resolver problemas.
ESTRUCTURA DE DATOS
3. CLASIFICACIÓN DE ESTRUCTURAS DE DATOS
• Una estructura de datos es una clase de datos que se puede caracterizar por
su organización y operaciones definidas sobre ella. Algunas veces a estas
estructuras se les llama tipos de datos. en ellas encontramos las siguientes:
ESTRUCTURA DE DATOS
ESTRUCTURAS LÓGICAS DE DATOS:
En un programa, cada variable pertenece a alguna estructura de datos
explícita o implícitamente definida, la cual determina el conjunto de
operaciones validas para ella. Las estructuras de datos que se discuten aquí
son estructuras de datos lógicas.
Cada estructura de datos lógica puede tener varias representaciones físicas
diferentes para sus almacenamientos
4. CLASIFICACIÓN DE ESTRUCTURAS DE DATOS
ESTRUCTURA DE DATOS
ESTRUCTURAS PRIMITIVAS Y SIMPLES:
Son primitivas aquellas que no están compuestas por otras estructuras de
datos, por ejemplo: enteros, booleanos y caracteres. Otras estructuras de
datos se pueden construir de una o mas primitivas.
Las estructuras de datos simples que consideramos se construyen a partir de
estructuras primitivas y son: cadenas, arreglos, matrices y registros.
A estas estructuras de datos las respaldan muchos lenguajes de
programación.
5. CLASIFICACIÓN DE ESTRUCTURAS DE DATOS
ESTRUCTURA DE DATOS
ESTRUCTURAS LINEALES Y NO LINEALES:
Las estructuras de datos simples se pueden combinar de varias maneras para
formar estructuras mas complejas. Las dos cases principales de estructuras
de datos son las lineales y las no lineales, dependiendo de la complejidad de
las relaciones lógicas que representan.
• Las estructuras de datos lineales incluyen pilas, colas y listas ligadas
lineales.
• Las estructuras de datos no lineales incluyen grafos y árboles.
6. • Ejercicio de clase: Realice el cuadro sinóptico de la clasificación de las
estructuras de datos
ESTRUCTURA DE DATOS
7. Tipos de Datos Abstractos
Algunos lenguajes de programación tienen características que nos permiten
ampliar el lenguaje añadiendo sus propios tipos de datos.
• Un tipo de dato definido por el programador se denomina tipo abstracto de
datos (TAD) para diferenciarlo del tipo fundamental (predefinido) de datos.
• En esencia un tipo abstracto de datos es un tipo que consta de datos
(estructuras de datos propias) y operaciones que se pueden realizar sobre esos
datos. Un TAD se compone de estructuras de datos y los procedimientos o
funciones que manipulan esas estructuras de datos.
ESTRUCTURA DE DATOS
8. • Es decir, los usuarios de un TAD se comunican con éste a partir de la interfaz
que ofrece el TAD mediante funciones de acceso.
• Las unidades de programación de lenguajes que pueden implementar un TAD
reciben distintos nombres:
ESTRUCTURA DE DATOS
9. Trabajando con Tipos Abstractos de Datos
Concepto de estructura:
• Una estructura es una colección de uno o más elementos, cada uno de los
cuales puede ser de un tipo de dato diferente.
• Cada elemento de la estructura se denomina miembro.
• Una estructura puede contener un número ilimitado de miembros.
• A las estructuras también se las llama registros.
ESTRUCTURA DE DATOS
10. • Definición del tipo de dato estructura: Una estructura es un tipo de dato
creado por el usuario, por tanto, es necesario definirlo antes de poder
utilizarlo. Un vez definido, podremos crear variables de tipo estructura.
ESTRUCTURA DE DATOS
12. • Declaración de variables de tipo estructura: Una vez definido el tipo de dato
estructura, necesitamos declarar variables de ese tipo (Como para cualquier
tipo de dato).
ESTRUCTURA DE DATOS
13. • Inicialización de variables de tipo estructura: Las variables de tipo estructura
las podemos inicializar de dos formas:
ESTRUCTURA DE DATOS
14. • Ejercicio de clase: Crear una estructura que contenga los campos básicos de
una agenda personal.
• Ejercicio de clase: Crear un registro que contenga los datos personales para
una nómina.
ESTRUCTURA DE DATOS
15. • Acceso a los miembros de una variable de tipo estructura: Una vez que hemos
declarado una variable de tipo estructura, podemos acceder a los miembros
de dicha variable:
ESTRUCTURA DE DATOS
16. Acceso a los miembros de una variable de tipo estructura:
ESTRUCTURA DE DATOS
17. Acceso a los miembros de una variable de tipo estructura:
ESTRUCTURA DE DATOS
18. • Ejercicio: Utilizando estructuras desarrolle un programa que permita la captura
de la información correspondiente a un disco, el programa debe repetir la
captura hasta que el usuario teclee enter en el nombre del disco:
Campos de la estructura
• Nombre del disco
• Cantidad de canciones
• Precio
• Fecha de Compra (dd/mm/aaaa)
El programa debe ser entregado en archivo ya probado en Dev C++
ESTRUCTURA DE DATOS
19. Modularidad
• Módulo: Un módulo que se supone que representa una función lógica es una
secuencia léxicamente continúa de instrucciones que se encuentra limitado
por elementos de fronteras y además se caracteriza por disponer de un
nombre o identificador.
• Módulo: Es aquél que está constituido por una o varias instrucciones
físicamente contiguas y lógicamente encadenadas, las cuales se pueden
referenciar mediante un nombre y pueden ser llamadas desde diferentes
puntos de un programa.
ESTRUCTURA DE DATOS
20. Un módulo puede ser:
Un programa
Una función
Una subrutina (procedimiento o función)
• La modularidad se basa en la descomposición de un problema en una serie de
sub problemas; dividiéndolo en pequeños módulos. Esta división exige la
presencia de un módulo denominado módulo de base o principal, y su función
es que controle los demás.
• El módulo principal coordina las llamadas a los módulos secundarios y pasa
los datos necesarios en forma de parámetros. A su vez cada modulo puede
contener sus propios datos y llamar a otros módulos o funciones.
ESTRUCTURA DE DATOS
21. Principios para asegurar diseños modulares:
Pocas interfaces: Cada módulo debe comunicarse con tan pocos como
sea posible.
Interfaces pequeñas (Acoplamiento débil): Si dos módulos se
comunican, deben intercambiar la menor información posible.
Interfaces explícitas: Cuando dos módulos se comunican, debe estar
claro en el texto de uno o de ambos.
Ocultación de la información: Toda la información sobre un módulo
debe ser privada al módulo, a menos que se haya declarado
específicamente como pública.
ESTRUCTURA DE DATOS
22. • La solución de un problema complejo puede obtenerse a menudo a partir de la
resolución de subproblemas más simples (estrategia “divide y vencerás”).
ESTRUCTURA DE DATOS
26. Ejercicio entregable: realice un programa que calcule el IVA, el DTA y el IGI a
productos que son importados a territorio nacional. Se debe realizar un módulo
que haga el calculo de los impuestos, ya sea que se calcule cada uno de ellos de
forma modular o que se haga un modulo general para todos los impuestos
Entregar el programa ya funcionando y probado en Dev C++
Tabla de impuestos
• IVA = 16%
• DTA = 8 por millar
• IGI depende del país de origen de la mercancía
USA = 0%
CAN = 0%
UK = 2%
EU = 0%
JP = 2%
CHN = 50%
BR = 5%
AUL = 2%
RU = 10%
IND = 10%
Datos necesarios por partida:
Producto
Cantidad
Precio
Unidad de Medida
País
IVA
DTA
IGI
Total
Nota: Cualquier
otro país paga el
40% de IGI.
ESTRUCTURA DE DATOS
27. Memoria Estática
• Para implementar alguna estructura de datos, primero es necesario tener muy
claro cómo va a ser el manejo de memoria.
• La diferencia entre estructuras estáticas y dinámicas esta en el manejo de
memoria. En la memoria estática durante la ejecución del programa el tamaño
de la estructura no cambia.
• La estructura que maneja memoria estática son los arreglos.
• Un arreglo es una colección finita, homogénea y ordenada de elementos. Es
finita porque todo arreglo tiene un límite, homogénea porque todos los
elementos son del mismo tipo y ordenada porque se puede determinar cuál es
el enésimo elemento.
ESTRUCTURA DE DATOS
28. Manejo de memoria dinámica
• En la memoria dinámica durante la ejecución del programa el tamaño de la
estructura puede cambiar.
• La memoria dinámica, es el espacio de almacenamiento que solicita una clase
o método en tiempo de ejecución. De esa manera, a medida que el proceso
requiere de más espacio se solicita al sistema operativo, sin que el proceso se
preocupe por donde serán asignados los datos, ni que espacios de memoria
nos entregara el sistema operativo.
• Así como existen estructuras de datos estáticas (arreglos), también existen
estructuras de datos dinámicas (listas y árboles).
ESTRUCTURA DE DATOS
29. Manejo de memoria dinámica
• Una lista es un conjunto de nodos que contiene información heterogénea. Los
nodos de una lista se encuentran enlazados o relacionados por medio de
direccionamientos de memoria como referencia, y se estructuran de la
siguiente manera:
ESTRUCTURA DE DATOS
30. La complejidad de un algoritmo o complejidad computacional, estudia
los recursos y esfuerzos requeridos durante el cálculo para resolver un
problema los cuales se dividen en: tiempo de ejecución y espacio en
memoria.
El factor tiempo, por lo general es más importante que el factor
espacio, pero existen algoritmos que ofrecen el peor de los casos en un
menor tiempo que el mejor de los casos, lo cual no es la mejor de las
soluciones.
El factor tiempo de ejecución de un algoritmo depende de la cantidad
de datos que se quieren procesar.
Análisis de Algoritmos
ESTRUCTURA DE DATOS
31. En computación al momento de realizar un programa
se debe obtener su algoritmo.
Cada programador puede tener un método
diferente de resolver un mismo problema.
Para ello está el análisis de algoritmos cuyo objetivo
es: la búsqueda de algoritmos eficientes.
ESTRUCTURA DE DATOS
32. Concepto de complejidad de algoritmos
• La mayoría de los problemas que se plantean en la actualidad se
pueden resolver con algoritmos que difieren en su eficiencia. Dicha
diferencia puede ser irrelevante cuando el número de datos es
pequeño pero cuando la cantidad de datos es mayor la diferencia
crece.
Ejemplo: Suma de 4 y 10 primero números naturales.
ESTRUCTURA DE DATOS
33. COMPLEJIDAD EN EL TIEMPO
Definiciones:
• T(n) Tiempo de ejecución del algoritmo.
• F(n) Tiempo al introducir los datos al algoritmo.
• El tiempo de ejecución de un algoritmo: se refiere a la suma de los
tiempos en los que el programa tarda en ejecutar una a una todas sus
instrucciones.
• Tomando en cuanta que cada instrucción requiere una unidad de tiempo,
dicho tiempo se puede calcular en función de n (el número de datos), lo
que se denomina T(n).
ESTRUCTURA DE DATOS
34. • Si hacemos un análisis de forma directa al programa para determinar el
tiempo de ejecución del mismo, debemos definir el conjunto de
operaciones primitivas, que son independientes del lenguaje de
programación que se use. Algunas de las funciones primitivas son las
siguientes:
• Asignación de un valor a una variable (X = 15).
• Llamada a un método (z = suma(2 + 4)).
• Ejecución de una operación aritmética (total = iva + subtotal).
• Comparar dos números (if (x > y)).
• Poner índices a un arreglo (z[i]).
• Retorno de un método (return x + y;).
ESTRUCTURA DE DATOS
35. • En forma específica, una operación primitiva corresponde a una instrucción en
el lenguaje de bajo nivel, cuyo tiempo de ejecución depende del ambiente de
hardware y software, pero es constante. Ejemplo. Método que retorna el
número mayor de un arreglo de n elementos.
int mayor(int arr[]) {
int may = arr[0];
for(int ind = 0; ind < arr.length; ind++)
if(arr[ind] > may)
may = arr[ind];
return may;
}
ESTRUCTURA DE DATOS
36. Para este ejemplo se pueden encontrar dos formulas que determinen el tiempo
de ejecución, la primera representa el peor de los casos y la segunda el mejor de
los casos. Para se creación se sigue el programa:
• La inicialización de la variable may = [0], corresponde a una unidad de tiempo.
• La inicialización del ciclo for agrega otra unidad de tiempo.
• La condición del ciclo for se ejecuta desde 1 hasta el tamaño del arreglo lo cual
agrega el número de unidades del tamaño del arreglo.
• El cuerpo del ciclo for se ejecuta el tamaño del arreglo 1 veces, para este caso
el número de operaciones del cuerpo del ciclo pueden ser 6 o 4 (condición del
if dos, asignación a may dos e incremento y asignación dos) en el peor o mejor
de los casos respectivamente. Por consiguiente el cuerpo del ciclo contribuye
con 4 (tamaño del arreglo 1) o 6 (tamaño del arreglo 1) unidades de tiempo.
ESTRUCTURA DE DATOS
37. Para que un algoritmo sea eficiente debemos tener en cuenta el
tiempo de ejecución, y la cantidad de memoria que va a requerir para
funcionar.
Aun que el problema se pueda resolver de varias maneras debemos
optar por implementar la solución más eficiente, es decir la que se
realice en el menor tiempo y con la menor cantidad de memoria.
EFICIENCIA DE LOS ALGORITMOS
ESTRUCTURA DE DATOS
38. COMPLEJIDAD EN EL ESPACIO
Se refiere a la memoria que utiliza un programa para
su ejecución; es decir el espacio de memoria que
ocupan todas las variables propias del programa.
Para calcular la memoria estática, se suman la cantidad
de memoria que ocupa cada una de las variables
declaradas en el programa.
Dicha memoria se divide en Memoria estática y
Memoria dinámica.
ESTRUCTURA DE DATOS
39. • Para calcular la memoria estática, se suman la cantidad de memoria que ocupa
cada una de las variables declaradas en el programa.
• Tomando en cuenta los tipos de datos primitivos del lenguaje de programación
java podemos determinar el espacio que requiere cada una de las variables de
un programa, de acuerdo a lo siguiente:
Tipo de Dato
Primitivo
Tamaño en
Bits
Tamaño en
Bytes
byte 8 1
char 16 2
short 16 2
int 32 4
float 32 4
long 64 8
double 64 8
• El cálculo de la memoria dinámica,
no es tan simple ya que depende
de cada ejecución del programa o
algoritmo y el tipo de estructuras
dinámicas que se estén utilizando.
ESTRUCTURA DE DATOS
40. SELECCIÓN DE UN ALGORITMO
• Una de las características primordiales en la selección de un
algoritmo es que este sea sencillo de entender, calcular, codificar y
depurar, así mismo que utilice eficientemente los recursos de la
computadora y se ejecute con la mayor rapidez posible con un eficaz
uso de memoria dinámica y estática.
• También para seleccionar correctamente el mejor algoritmo es
necesario realizar estas preguntas:
ESTRUCTURA DE DATOS
41. ¿Qué grado de orden tendrá la información que vas a manejar? Entre mas
desordenada esté la información el algoritmo debe ser más robusto
¿Qué cantidad de datos vas a manipular? Una cantidad muy grande puede
hacer prohibitivo utilizar un algoritmo que requiera de mucha memoria
adicional.
¿Qué tipo de datos quieres ordenar? Algunos algoritmos sólo funcionan con
un tipo específico de datos (enteros, enteros positivos, etc.) y otros son
aplicables a cualquier tipo de dato.
¿Qué tamaño tienen los registros de tu lista? Algunos algoritmos realizan
múltiples intercambios (burbuja, inserción). Si los registros son de gran tamaño
estos intercambios son más lentos.
ESTRUCTURA DE DATOS
42. Bibliografía
• Joyanes, Zahonero. Estructura de Datos en C++. McGraw Hill. Madrid, España.
2007. ISBN: 978-84-481-5645-9.
ESTRUCTURA DE DATOS