Universidad Autónoma de Nuevo León
Facultad de Ingeniería Mecánica y Eléctrica
Laboratorio de Estructura de Datos
Actividades Fundamentales
Nombre: Bryan Leonel Salazar Reyes
Matricula: 1967713
Carrera: ITS
Semestre: Enero-junio 2024
1.- Elaborar una tabla que contenga los diferentes tipos de datos, así como la
definición y características de cada uno de los tipos de secuencia, decisión e
iteración.
Tipo de dato Definición Características
Int Representa números Se pueden realizar
enteros sin decimales operaciones
matemáticas básicas
Float Representa números Se pueden realizar
reales con decimales operaciones
matemáticas precisas
Cadena Secuencia de caracteres Se pueden concatenar,
alfanuméricos indexar y cortar
Booleano Representa un valor Se utilizan en
verdadero o falso expresiones lógicas y de
control
List Colección ordenada y Se pueden agregar,
modificable de elementos eliminar y modificar
elementos
Tuple Colección ordenada e Se utilizan para datos
inmutable de elementos que no deben cambiar
Set Colección desordenada Se utilizan para
de elementos únicos operaciones de
conjuntos
Dict Colección de pares Permite acceder a los
clave-valor valores a través de
claves
Tipo de secuencia Definición Característicos
Secuencial Ejecución línea por línea Fluye de arriba hacia
en orden secuencial abajo, sin saltos
Condicional Ejecución basada en una Permite bifurcaciones en
condición verdadera o la lógica del programa
falsa
Iterativa Ejecución repetida de un Se repite hasta que se
bloque de código cumple una condición
2.- Elaborar un algoritmo simple de cada uno de los tipos de datos.
1. Entero (int):
#include <stdio.h>
int main () {
int numero1 = 5;
int numero2 = 3;
int suma = numero1 + numero2;
printf ("La suma es: %d\n", suma);
return 0;
}
2. Float
#include <stdio.h>
#include <math.h>
int main() {
float radio = 2.5;
float area = M_PI * radio * radio;
printf("El área del círculo es: %f\n", area);
return 0;
}
3. Cadena
#include <stdio.h>
int main() {
char nombre[] = "Juan";
char apellido[] = "Pérez";
printf("El nombre completo es: %s %s\n", nombre, apellido);
return 0;
}
4. Booleano
#include <stdio.h>
#include <stdbool.h>
int main () {
int edad = 20;
bool es_mayor_de_edad = edad >= 18;
printf ("¿Es mayor de edad? %s\n", es_mayor_de_edad? "true": "false");
return 0;
}
5. List
#include <stdio.h>
int main() {
int numeros[] = {1, 2, 3, 4, 5};
int i;
printf("La lista de números es:");
for (i = 0; i < 5; i++) {
printf (" %d", numeros[i]);}
printf("\n");
return 0;
}
3.- Realizar un reporte de cada una de las estructuras de datos lineales, que
contenga definición, así como las características de cada una de ellas,
entregarlas de manera digital. (pilas, colas y listas).
Pilas
Definición: Una pila es una estructura de datos lineal que sigue el principio de
LIFO (Last In, First Out), lo que significa que el último elemento en ser insertado
es el primero en ser eliminado.
Características:
Operaciones principales: Las operaciones más comunes en una pila son
push (insertar un elemento en la parte superior) y pop (eliminar el elemento
superior).
Restricción de acceso: Solo se puede acceder al elemento superior de la
pila, los otros elementos están ocultos.
Implementación eficiente: Las operaciones push y pop tienen un tiempo
de ejecución constante.
Uso común: Se utiliza en la implementación de muchas estructuras y
algoritmos, como la reversión de cadenas, la evaluación de expresiones
matemáticas y la gestión de llamadas de funciones en sistemas
informáticos.
Colas
Definición: Una cola es una estructura de datos lineal que sigue el principio de
FIFO (First In, First Out), lo que significa que el primer elemento en ser insertado
es el primero en ser eliminado.
Características:
Operaciones principales: Las operaciones más comunes en una cola son
enqueue (insertar un elemento al final) y dequeue (eliminar el elemento al
principio).
Orden de acceso: Los elementos se acceden en el mismo orden en el que
fueron insertados.
Implementación eficiente: Tanto enqueue como dequeue tienen un tiempo
de ejecución constante.
Uso común: Se utiliza en situaciones donde se requiere un procesamiento
en orden de llegada, como la gestión de tareas en un sistema operativo, la
impresión de trabajos en una impresora y la gestión de mensajes en
sistemas de comunicación.
Listas
Definición: Una lista es una estructura de datos lineal que contiene una secuencia
ordenada de elementos, donde cada elemento puede ser de cualquier tipo de
datos.
Características:
Flexibilidad: Las listas pueden contener elementos de diferentes tipos de
datos y pueden crecer o reducirse dinámicamente.
Acceso a los elementos: Se puede acceder a los elementos de la lista
utilizando su índice, lo que permite un acceso aleatorio.
Operaciones de inserción y eliminación: Las operaciones de inserción
(append, insert) y eliminación (pop, remove) son eficientes, aunque su
rendimiento puede variar según la implementación.
Uso común: Las listas son una de las estructuras de datos más utilizadas
en Python y se utilizan en una amplia variedad de aplicaciones, desde el
almacenamiento de datos simples hasta la implementación de algoritmos
complejos.
4.- Realizar un programa de un método de ordenamiento, y entregar de manera
digital un documento con el código, pantallazo de corrida, así como el
ejecutable del mismo.
#include <stdio.h>
void swap(int *x, int *y) {
int temp = *x;
*x = *y;
*y = temp;
}
void bubbleSort(int arr[], int n) {
int i, j;
for (i = 0; i < n-1; i++) {
for (j = 0; j < n-i-1; j++) {
if (arr[j] > arr[j+1]) {
swap(&arr[j], &arr[j+1]);
}
}
}
}
void printArray(int arr[], int size) {
int i;
for (i = 0; i < size; i++) {
printf("%d ", arr[i]);
} printf("\n");
}
int main() {
int arr[] = {64, 34, 25, 12, 22, 11, 90};
int n = sizeof(arr)/sizeof(arr[0]);
printf("Array original: \n");
printArray(arr, n);
bubbleSort(arr, n);
printf("Array ordenado en orden ascendente: \n");
printArray(arr, n);
return 0;
}
Ejecutado en C en: https://www.onlinegdb.com/online_c_compiler
5.- Elabora una investigación de tablas hash.
Las tablas hash son una estructura de datos fundamental en informática, utilizada
para almacenar y recuperar datos de manera eficiente. Funcionan asociando
claves con valores a través de una función de dispersión (hash function), que
calcula una ubicación (índice) en la tabla a partir de la clave, permitiendo un
acceso rápido a los valores asociados.
Funcionamiento
Función de dispersión: Toma una clave como entrada y devuelve un valor
de dispersión único, que determina la ubicación en la tabla donde se
almacenará el valor asociado.
Almacenamiento: El valor se guarda en la ubicación calculada por la
función de dispersión. En caso de colisiones (dos claves que tienen el
mismo valor de dispersión), se pueden usar diferentes métodos para
resolverlas, como encadenamiento o resolución de colisiones por dispersión
cuadrática.
Recuperación de datos: Cuando se busca un valor, se aplica la función de
dispersión a la clave para encontrar su ubicación en la tabla. Si hay
colisiones, se sigue un proceso definido para encontrar el valor correcto.
Características
Rapidez en la búsqueda: Debido a la función de dispersión, la búsqueda
de valores es muy rápida, con un tiempo de acceso casi constante en
promedio.
Uso eficiente de memoria: Las tablas hash pueden ser más eficientes en
términos de uso de memoria que otras estructuras de datos, ya que
permiten un acceso directo a los datos sin necesidad de ordenarlos.
Flexibilidad en el tamaño: Las tablas hash pueden crecer o disminuir de
tamaño según sea necesario, adaptándose dinámicamente a la cantidad de
datos almacenados.
Aplicaciones
Bases de datos: Muchas bases de datos utilizan tablas hash para indexar
y buscar datos de manera eficiente.
Algoritmos de búsqueda y filtrado: Son utilizadas en algoritmos de
búsqueda eficientes, como el algoritmo de búsqueda de cadenas Rabin-
Karp.
Almacenamiento de contraseñas: Se utilizan en aplicaciones de
seguridad para almacenar contraseñas de manera segura.
Implementación
En lenguajes de programación como Python, Java y C++, las tablas hash suelen
estar implementadas en forma de estructuras de datos predefinidas. También es
posible implementar tablas hash desde cero utilizando arrays y funciones de
dispersión personalizadas.
6.- Crear una tabla comparativa de búsqueda binaria y búsqueda secuencial
Característica Búsqueda Binaria Búsqueda Secuencial
Complejidad Temporal O (log n) O(n)
Complejidad Espacial O (1) (iterativa) o O (log O (1)
n) (recursiva)
Requisitos del arreglo Requiere que el arreglo No requiere que el
esté ordenado arreglo esté ordenado
Método Divide y conquista Lineal
Eficiencia Altamente eficiente en Adecuado para arreglos
arreglos ordenados pequeños o no
ordenados
Iteraciones Logarítmico (base 2) Lineal
Casos de mejor Cuando se trabaja con Cuando se trabaja con
rendimiento datos ordenados y se arreglos pequeños o no
necesita una búsqueda ordenados
rápida
7.- Realizar un mapa conceptual con las diferencias de los tipos de búsqueda
8.- Elaborar los 3 recorridos en un árbol binario
Un árbol binario constituye una estructura de datos no lineal, caracterizada por la
limitación de cada nodo a un máximo de dos hijos, denominados hijos izquierdo y
derecho. Conceptualmente, puede interpretarse como un gráfico no dirigido,
donde el nodo superior es denominado raíz. En contraste con las estructuras de
datos lineales, que solo permiten un recorrido unidireccional, un árbol posibilita
diversos tipos de travesía, ya sea en profundidad o en anchura. El primero,
conocido como recorrido en profundidad primero, y el segundo, como recorrido en
anchura primero.
El recorrido en orden implica visitar primero el subárbol izquierdo, luego la raíz y
finalmente el subárbol derecho. Cada nodo representa un subárbol, y para un
árbol binario de búsqueda (BST, por sus siglas en inglés), este recorrido retorna
todos los elementos en orden ascendente.
En el recorrido de preorden, se visita primero la raíz, luego el subárbol izquierdo y
finalmente el subárbol derecho. Cada nodo también representa un subárbol.
Usualmente se emplea para replicar la estructura del árbol, es decir, para crear
una copia del mismo. Además, el recorrido de preorden es útil en la generación de
una expresión de prefijo a partir de un árbol de expresión.
Por último, el recorrido de posorden implica visitar primero el subárbol izquierdo,
luego el subárbol derecho y finalmente la raíz. Al igual que en los casos anteriores,
cada nodo representa un subárbol. Este tipo de recorrido es efectivo en la
eliminación de árboles y también facilita la generación de una expresión de sufijo a
partir de un árbol de expresión.
9.- Investigar sobre el tema de grafos y realizar un reporte.
Los grafos son una estructura de datos fundamental en informática y
matemáticas, utilizada para representar relaciones entre entidades. En este
reporte, exploraremos los conceptos básicos de los grafos, sus componentes,
tipos y aplicaciones.
Definición
Un grafo es un conjunto de vértices (nodos) conectados por aristas (arcos) que
representan relaciones entre ellos. Formalmente, un grafo se define como G=(V,
E), donde V es un conjunto de vértices y E es un conjunto de pares no ordenados
de vértices, que representan las aristas.
Componentes de un Grafo
Vértices (Nodos): Son los puntos en el grafo que representan entidades.
Cada vértice puede tener una etiqueta o valor asociado.
Aristas (Arcos): Son las conexiones entre los vértices que representan
relaciones. Pueden ser dirigidas (con una dirección) o no dirigidas.
Tipos de Grafos
Grafo No Dirigido: Un grafo en el que las aristas no tienen dirección. La
relación entre dos vértices es simétrica.
Grado Dirigido: Un grafo en el que las aristas tienen dirección. La relación
entre dos vértices puede ser asimétrica.
Grafo Ponderado: Un grafo en el que cada arista tiene un peso o valor
asociado que representa alguna información adicional.
Grafo Bipartito: Un grafo cuyos vértices pueden dividirse en dos conjuntos
disjuntos, de modo que cada arista conecta un vértice de un conjunto con
un vértice del otro conjunto.
Aplicaciones de los Grafos
Redes Sociales: Los grafos se utilizan para modelar redes sociales, donde
los vértices representan usuarios y las aristas representan conexiones entre
ellos.
Rutas y Logística: Se utilizan en la optimización de rutas de entrega,
planificación de vuelos, y en la representación de redes de transporte.
Análisis de Redes: En áreas como la biología y la sociología, se utilizan
para analizar interacciones entre proteínas, relaciones de amistad, etc.
Algoritmos de Búsqueda: Los grafos se utilizan en algoritmos de
búsqueda como el algoritmo de búsqueda en anchura (BFS) y el algoritmo
de búsqueda en profundidad (DFS).