Documentos de Académico
Documentos de Profesional
Documentos de Cultura
ACTIVIDAD 3
INVESTIGACIÓN
ALGORITMOS Y ESTRUCTURA DE DATOS
INTRODUCCIÓN
Empecemos recordando que un dato de tipo simple, no esta compuesto de otras estructuras, que no sean los bits, y que por
tanto su representación sobre el ordenador es directa, sin embargo existen unas operaciones propias de cada tipo, que en
cierta manera los caracterizan. Una estructura de datos es, a grandes rasgos, una colección de datos (normalmente de tipo
simple) que se caracterizan por su organización y las operaciones que se definen en ellos. Por tanto, una estructura de datos
vendrá caracterizada tanto por unas ciertas relaciones entre los datos que la constituyen (p.e., el orden de las componentes
de un vector de números reales), como por las operaciones posibles en ella.
Una estructura de datos no solo se utiliza para organizar los datos. También se utiliza para procesar, recuperar y almacenar
datos. Existen diferentes tipos básicos y avanzados de estructuras de datos que se utilizan en casi todos los programas o
sistemas de software que se han desarrollado. Por lo tanto, debemos tener un buen conocimiento sobre las estructuras de
datos.
Una estructura de datos no solo se utiliza para organizar los datos. También se utiliza para procesar, recuperar y almacenar
datos. Existen diferentes tipos básicos y avanzados de estructuras de datos que se utilizan en casi todos los programas o
sistemas de software que se han desarrollado. Por lo tanto, debemos tener un buen conocimiento de las estructuras de
datos.
Las estructuras de datos son una parte integral de las computadoras que se utilizan para organizar los datos en la memoria.
Son esenciales y responsables de organizar, procesar, acceder y almacenar datos de manera eficiente. Pero esto no es todo.
Varios tipos de estructuras de datos tienen sus propias características, funciones, aplicaciones, ventajas y desventajas.
Entonces, ¿cómo identifica una estructura de datos adecuada para una tarea en particular? ¿Qué significa el término
'Estructura de datos'? ¿Cuántos tipos de estructuras de datos existen y para qué se utilizan?
El tipo de datos es la forma de una variable a la que se le La estructura de datos es una colección de diferentes tipos de
puede asignar un valor. Define que la variable particular datos. Esos datos completos se pueden representar usando un
asignará los valores del tipo de datos dado solamente. objeto y se pueden usar en todo el programa.
Puede contener valor pero no datos. Por lo tanto, es sin datos.Puede contener múltiples tipos de datos dentro de un solo
objeto.
La implementación de un tipo de datos se conoce como La implementación de la estructura de datos se conoce como
implementación abstracta. implementación concreta.
No hay complejidad de tiempo en el caso de los tipos de En los objetos de estructura de datos, la complejidad del
datos. tiempo juega un papel importante.
En el caso de los tipos de datos, el valor de los datos no se Mientras que en el caso de las estructuras de datos, los datos
almacena porque solo representa el tipo de datos que se y su valor adquieren el espacio en la memoria principal de la
pueden almacenar. computadora. Además, una estructura de datos puede
contener diferentes clases y tipos de datos dentro de un solo
objeto.
Los ejemplos de tipos de datos son int, float, double, etc. Los ejemplos de estructura de datos son pila, cola, árbol, etc.
ALGORITMOS Y ESTRUCTURA DE DATOS
Estructura de datos lineal: la estructura de datos en la que los elementos de datos se organizan de forma secuencial
o lineal, donde cada elemento se adjunta a sus elementos adyacentes anterior y siguiente, se denomina estructura
de datos lineal. Ejemplos de estructuras de datos lineales son matriz, pila, cola, lista enlazada, etc.
i. Estructura de datos estática: la estructura de datos estática tiene un tamaño de memoria fijo. Es más fácil acceder a
los elementos en una estructura de datos estática. Un ejemplo de esta estructura de datos es una matriz.
ii. Estructura de datos dinámica: en la estructura de datos dinámica, el tamaño no es fijo. Puede actualizarse
aleatoriamente durante el tiempo de ejecución, lo que puede considerarse eficiente en relación con la complejidad
de la memoria (espacio) del código. Ejemplos de esta estructura de datos son cola, pila, etc.
Estructura de datos no lineales: las estructuras de datos donde los elementos de datos no se colocan secuencial o
linealmente se denominan estructuras de datos no lineales. En una estructura de datos no lineal, no podemos
recorrer todos los elementos en una sola ejecución. Ejemplos de estructuras de datos no lineales son árboles y
gráficos.
Arrays:
Un array es una estructura de datos lineal y es una colección de elementos almacenados en ubicaciones de memoria
contiguas. La idea es almacenar varios artículos del mismo tipo juntos en un solo lugar. Permite el procesamiento de una
gran cantidad de datos en un período relativamente corto. El primer elemento del array está indexado por un subíndice de 0.
Hay diferentes operaciones posibles en un array, como Buscar, Ordenar, Insertar, Recorrer, Invertir y Eliminar.
ALGORITMOS Y ESTRUCTURA DE DATOS
Características de un array:
Un array tiene varias características que son las siguientes:
Los arrays usan una estructura de datos basada en índices que ayuda a identificar cada uno de los elementos en un arreglo
fácilmente usando el índice.
Si un usuario desea almacenar varios valores del mismo tipo de datos, el array se puede utilizar de manera eficiente.
Una matriz también puede manejar estructuras de datos complejas almacenando datos en una matriz bidimensional.
Una matriz también se usa para implementar otras estructuras de datos como pilas, colas, montones, tablas hash, etc.
El proceso de búsqueda en un arreglo se puede hacer muy fácilmente.
Aplicaciones de arrays:
Las diferentes aplicaciones de un array son las siguientes:
EJEMPLO FIGURATIVO
Imagine que tiene un conjunto de 500 palabras y desea almacenar cada una de ellas en una variable separada. Claro, podrías
hacer:
x1 = "una vez"
x2 = "sobre"
y = "un"
z = "tiempo"
y así sucesivamente, pero sería un problema. Primero, tomaría mucho tiempo escribir el código. En segundo lugar, si quisiera
recorrer paso a paso cada una de esas 500 variables, procesar cada una por separado, sería realmente difícil.
Entonces, una matriz es una variable que se puede dividir en compartimentos. Puede tener una matriz llamada x, y luego
hacer:
x[2] = "sobre"
x[3] = "un"
x[4] = "tiempo"
etcétera. Ahora, si desea imprimir el contenido de la matriz, no necesita saber qué 500 nombres de variables eligió, porque
todo es x. Simplemente configura un bucle como:
para (cuenta = 1 a 4)
eco x[contar]
Aquí, x es una matriz unidimensional. Como una fila de celdas en una hoja de cálculo. También puede tener matrices
bidimensionales, como una cuadrícula:
x[1,1] = "sobre"
x[1,2] = "un"
x[1,3] = "tiempo"
x[2,0] = "vivido"
x[2,1] = "felizmente"
x[2,2] = "nunca"
x[2,3] = "después
Luego usaría 2 bucles, para recorrer cada valor de cada dimensión por turno.
LISTA ENLAZADA:
Una lista enlazada es una estructura de datos lineal en la que los elementos no se almacenan en ubicaciones de memoria
contiguas. Si las arrays admiten tipos similares de tipos de datos, las listas enlazadas consisten en elementos con diferentes
tipos de datos que también se organizan secuencialmente.
Inicialización: una lista enlazada se puede inicializar creando un nodo principal con una referencia al primer nodo. Cada nodo
subsiguiente contiene un valor y una referencia al siguiente nodo.
Inserción de elementos: los elementos se pueden insertar en la cabeza, la cola o en una posición específica en la lista
vinculada.
Eliminación de elementos: los elementos se pueden eliminar de la lista vinculada actualizando la referencia del nodo
anterior para que apunte al siguiente nodo, eliminando efectivamente el nodo actual de la lista.
Búsqueda de elementos: las listas vinculadas se pueden buscar para un elemento específico comenzando desde el nodo
principal y siguiendo las referencias a los siguientes nodos hasta encontrar el elemento deseado.
Actualización de elementos: los elementos de una lista enlazada se pueden actualizar modificando el valor de un nodo
específico.
Atravesar elementos: los elementos de una lista enlazada se pueden recorrer comenzando desde el nodo principal y
siguiendo las referencias a los siguientes nodos hasta llegar al final de la lista.
Inversión de una lista enlazada: la lista enlazada se puede invertir actualizando las referencias de cada nodo para que
apunten al nodo anterior en lugar del nodo siguiente.
• Las listas enlazadas se utilizan para implementar pilas, colas, gráficos, etc.
• Las listas enlazadas se utilizan para realizar operaciones aritméticas con números enteros largos.
• Se utiliza para la representación de matrices dispersas.
• Se utiliza en la asignación vinculada de archivos.
• Ayuda en la gestión de la memoria.
• Se utiliza en la representación de Manipulación polinomial donde cada término polinomial representa un nodo en la
lista enlazada.
• Las listas enlazadas se utilizan para mostrar contenedores de imágenes. Los usuarios pueden visitar imágenes
pasadas, actuales y siguientes.
• Se utilizan para almacenar el historial de la página visitada.
• Se utilizan para realizar operaciones de deshacer.
• Los enlaces se utilizan en el desarrollo de software donde indican la sintaxis correcta de una etiqueta.
• Las listas vinculadas se utilizan para mostrar fuentes de redes sociales.
ALGORITMOS Y ESTRUCTURA DE DATOS
STACK:
Stack es una estructura de datos lineal que sigue un orden particular en el que se realizan las operaciones. El orden es LIFO
(Last in first out). Es posible ingresar y recuperar datos desde un solo extremo. La entrada y recuperación de datos también
se denomina operación de inserción y extracción en una pila. Hay diferentes operaciones posibles en una pila, como invertir
una pila usando recursividad, ordenar, eliminar el elemento medio de una pila, etc.
Stack se usa en muchos algoritmos diferentes como Tower of Hanoi, tree traversal, recursion, etc.
La pila se implementa a través de una matriz o lista enlazada.
Sigue la operación Last In First Out, es decir, un elemento que se inserta primero aparecerá en último lugar y viceversa.
La inserción y la eliminación se realizan en un extremo, es decir, desde la parte superior de la pila.
En la pila, si el espacio asignado para la pila está lleno y todavía alguien intenta agregar más elementos, se producirá un
desbordamiento de la pila.
Aplicaciones de la pila:
Las diferentes aplicaciones de Stack son las siguientes:
Empujar: los elementos se pueden empujar a la parte superior de la pila, agregando un nuevo elemento a la parte superior
de la pila.
Pop: el elemento superior se puede quitar de la pila realizando una operación pop, eliminando efectivamente el último
elemento que se colocó en la pila.
Inspección: el elemento superior se puede inspeccionar sin quitarlo de la pila mediante una operación de inspección.
IsEmpty: se puede realizar una comprobación para determinar si la pila está vacía.
Tamaño: el número de elementos en la pila se puede determinar mediante una operación de tamaño.
QUEUE:
La queue o cola es una estructura de datos lineal que sigue un orden particular en el que se realizan las operaciones. El orden
es Primero en entrar, primero en salir (FIFO), es decir, se accederá primero al elemento de datos almacenado primero. En
esto, ingresar y recuperar datos no se realiza desde un solo extremo. Un ejemplo de una cola es cualquier cola de
consumidores de un recurso donde se atiende primero al consumidor que llegó primero. Se realizan diferentes operaciones
en una Cola como Invertir una Cola (con o sin uso de recursividad), Invertir los primeros K elementos de una Cola, etc.
Algunas operaciones básicas realizadas en Cola son poner en cola, quitar cola, adelante, atrás, etc.
Aplicaciones de cola:
Las diferentes aplicaciones de Queue son las siguientes:
Aplicaciones de cola:
Las diferentes aplicaciones de Queue son las siguientes:
Encolar: los elementos se pueden agregar al final de la cola, agregando un nuevo elemento al final de la cola.
Eliminación de la cola: el elemento frontal se puede eliminar de la cola realizando una operación de eliminación de la cola,
eliminando efectivamente el primer elemento que se agregó a la cola.
Vistazo: el elemento frontal se puede inspeccionar sin quitarlo de la cola mediante una operación de vistazo.
IsEmpty: se puede realizar una comprobación para determinar si la cola está vacía.
Tamaño: el número de elementos en la cola se puede determinar mediante una operación de tamaño.
Árbol:
Un árbol es una estructura de datos no lineal y jerárquica donde los elementos se organizan en una estructura similar a un
árbol. En un árbol, el nodo superior se llama nodo raíz. Cada nodo contiene algunos datos, y los datos pueden ser de
cualquier tipo. Consiste en un nodo central, nodos estructurales y subnodos que están conectados a través de los bordes. Las
diferentes estructuras de datos de árbol permiten un acceso más rápido y fácil a los datos, ya que es una estructura de datos
no lineal. Un árbol tiene varias terminologías como Nodo, Raíz, Borde, Altura de un árbol, Grado de un árbol, etc.
ALGORITMOS Y ESTRUCTURA DE DATOS
• Árbol binario,
• árbol de búsqueda binaria,
• árbol AVL,
• Árbol B, etc.
Características de un árbol:
El árbol tiene varias características diferentes que son las siguientes:
➢ Heap es una estructura de datos de árbol que se implementa mediante matrices y se utiliza para implementar colas
de prioridad.
➢ B-Tree y B+ Tree se utilizan para implementar la indexación en bases de datos.
➢ Syntax Tree ayuda en la exploración, el análisis, la generación de código y la evaluación de expresiones aritméticas
en el diseño del Compilador.
➢ K-D Tree es un árbol de partición espacial que se utiliza para organizar puntos en el espacio K-dimensional. Los
árboles de expansión se utilizan en enrutadores en redes informáticas.
Inserción: se pueden agregar nuevos nodos al árbol para crear una nueva rama o para aumentar la altura del árbol.
Eliminación: los nodos se pueden eliminar del árbol actualizando las referencias del nodo principal para eliminar la
referencia al nodo actual.
Búsqueda: los elementos se pueden buscar en un árbol comenzando desde el nodo raíz y recorriendo el árbol en función del
valor del nodo actual hasta que se encuentre el nodo deseado.
Recorrido: los elementos de un árbol se pueden recorrer de varias maneras diferentes, incluido el recorrido en orden, pre-
orden y post-orden.
Altura: La altura del árbol se puede determinar contando el número de aristas desde el nodo raíz hasta el nodo hoja más
alejado.
Profundidad: la profundidad de un nodo se puede determinar contando el número de aristas desde el nodo raíz hasta el
nodo actual.
Equilibrio: el árbol se puede equilibrar para garantizar que la altura del árbol se minimice y la distribución de los nodos sea lo
más uniforme posible.
ALGORITMOS Y ESTRUCTURA DE DATOS
Grafico:
Un gráfico es una estructura de datos no lineal que consta de vértices (o nodos) y aristas. Consiste en un conjunto finito de
vértices y un conjunto de aristas que conectan un par de nodos. El gráfico se utiliza para resolver los problemas de
programación más desafiantes y complejos. Tiene diferentes terminologías que son Camino, Grado, Vértices adyacentes,
Componentes conectados, etc.
La distancia máxima de un vértice a todos los demás vértices se considera la Excentricidad de ese vértice.
El vértice que tiene mínima excentricidad se considera el punto central del gráfico.
El valor mínimo de excentricidad de todos los vértices se considera el radio de un gráfico conexo.
Aplicaciones de Gráfico:
Las diferentes aplicaciones de Graphs son las siguientes:
Agregar vértice: se pueden agregar nuevos vértices al gráfico para representar un nuevo nodo.
Agregar borde: se pueden agregar bordes entre vértices para representar una relación entre nodos.
Eliminar vértice: los vértices se pueden eliminar del gráfico actualizando las referencias de los vértices adyacentes para
eliminar la referencia al vértice actual.
Eliminar borde: los bordes se pueden eliminar actualizando las referencias de los vértices adyacentes para eliminar la
referencia al borde actual.
Búsqueda primero en profundidad (DFS): un gráfico se puede recorrer utilizando una búsqueda primero en profundidad
visitando los vértices de una manera primero en profundidad.
Búsqueda primero en anchura (BFS): un gráfico se puede recorrer utilizando una búsqueda primero en anchura visitando los
vértices de una manera primero en anchura.
Ruta más corta: la ruta más corta entre dos vértices se puede determinar utilizando algoritmos como el algoritmo de Dijkstra
o el algoritmo A*.
ALGORITMOS Y ESTRUCTURA DE DATOS
Componentes conectados: los componentes conectados de un gráfico se pueden determinar encontrando conjuntos de
vértices que están conectados entre sí pero no con ningún otro vértice en el gráfico.
Detección de ciclos: los ciclos en un gráfico se pueden detectar comprobando los bordes traseros durante una búsqueda en
profundidad.
TABLA HASH
Hashing es una técnica que se utiliza para identificar de forma única un objeto específico de un grupo de objetos similares.
Algunos ejemplos de cómo se usa el hashing en nuestras vidas incluyen:
En las universidades, a cada estudiante se le asigna un número de lista único que se puede usar para recuperar información
sobre ellos.
En las bibliotecas, a cada libro se le asigna un número único que se puede utilizar para determinar información sobre el libro,
como su ubicación exacta en la biblioteca o los usuarios a los que se ha entregado, etc.
En hashing, las claves grandes se convierten en claves pequeñas mediante el uso de funciones hash. Luego, los valores se
almacenan en una estructura de datos llamada tabla hash. La idea de hashing es distribuir entradas (pares clave/valor) de
manera uniforme en una matriz. A cada elemento se le asigna una clave (clave convertida). Al usar esa tecla, puede acceder
al elemento en tiempo O (1). Usando la clave, el algoritmo (función hash) calcula un índice que sugiere dónde se puede
encontrar o insertar una entrada.
La estructura de datos de la tabla Hash almacena elementos en pares clave-valor donde
Clave: entero único que se utiliza para indexar los valores.
Valor: datos que están asociados con las claves.
Hashing se implementa en dos pasos:
1. Un elemento se convierte en un número entero mediante una función hash. Este elemento se puede utilizar como
índice para almacenar el elemento original, que cae en la tabla hash.
2. El elemento se almacena en la tabla hash donde se puede recuperar rápidamente usando una clave hash.
Para lograr un buen mecanismo hash, es importante tener una buena función hash con los siguientes requisitos básicos:
i. Fácil de calcular: debe ser fácil de calcular y no debe convertirse en un algoritmo en sí mismo.
ii. Distribución uniforme: debe proporcionar una distribución uniforme en la tabla hash y no debe dar lugar a la
agrupación.
iii. Menos colisiones: las colisiones ocurren cuando pares de elementos se asignan al mismo valor hash. Estos deben
evitarse.
ALGORITMOS Y ESTRUCTURA DE DATOS
Tabla Hash
Una tabla hash es una estructura de datos que se utiliza para almacenar pares clave/valor. Utiliza una función hash para
calcular un índice en una matriz en la que se insertará o buscará un elemento. Mediante el uso de una buena función hash, el
hash puede funcionar bien. Bajo suposiciones razonables, el tiempo promedio requerido para buscar un elemento en una
tabla hash es O(1).
Colisión de hash
Cuando la función hash genera el mismo índice para varias claves, habrá un conflicto (qué valor se almacenará en ese índice).
Esto se llama colisión hash.
En el sondeo lineal, el algoritmo simplemente busca el siguiente espacio disponible en la tabla hash y coloca allí la clave
colisionada. Si esa ranura también está ocupada, el algoritmo continúa buscando la siguiente ranura disponible hasta que
encuentra una ranura vacía. Este proceso se repite hasta que se hayan almacenado todas las claves colisionadas. El sondeo
lineal tiene el mejor rendimiento de caché, pero sufre de agrupamiento. Una ventaja más del sondeo lineal es fácil de
calcular.
En el sondeo cuadrático, el algoritmo busca ranuras de una manera más espaciada. Cuando ocurre una colisión, el algoritmo
busca la siguiente ranura usando una ecuación que involucra el valor hash original y una función cuadrática. Si esa ranura
también está ocupada, el algoritmo incrementa el valor de la función cuadrática y vuelve a intentarlo. Este proceso se repite
hasta que se encuentra una ranura vacía. El sondeo cuadrático se encuentra entre los dos en términos de rendimiento de
caché y agrupación.
En el hash doble, el algoritmo utiliza una segunda función hash para determinar la siguiente ranura para comprobar cuándo
se produce una colisión. El algoritmo calcula un valor hash usando la función hash original, luego usa la segunda función hash
para calcular una compensación. Luego, el algoritmo verifica la ranura que es la suma del valor hash original y el
desplazamiento. Si esa ranura está ocupada, el algoritmo incrementa el desplazamiento y vuelve a intentarlo. Este proceso
se repite hasta que se encuentra una ranura vacía. El hashing doble tiene un rendimiento de caché deficiente, pero no se
agrupa. El hashing doble requiere más tiempo de cálculo, ya que es necesario calcular dos funciones hash.
Conclusión
¿Por qué es importante seleccionar la estructura de datos adecuada en diferentes situaciones de programación?
Aunque estas son las estructuras de datos más conocidas y utilizadas, también existen otras formas de estructuras de datos
que se utilizan en informática, como estructuras de datos basadas en políticas, etc. Pero no importa qué estructura de datos
elija, cada una tiene sus ventajas y desventajas, sin el conocimiento de las cuales, puede ser muy costoso elegir el tipo
incorrecto de estructura de datos. Por lo tanto, es muy importante comprender la necesidad de la situación y luego decidir
qué tipo de estructura de datos se adapta mejor al trabajo.
Al final todo se resume a entender las necesidades de tu proyecto, sin un entendimiento adecuado de lo que se requiere en
el planteamiento del problema, no podremos ver sin esos requisitos cual sera la mejor manera a la hora de utilizar algún
algoritmo necesario.
Bibliografia
Russel, R. (2018) Estructuras de Datos y algoritmos: Una introducción Sencilla
Jesus Albarran. (2023).Estructuras de datos básicas: Listas, pilas, colas y matrices
Skiena, S. S. (2009). The Algorithm Design Manual. Springer Science & Business Media.
https://es.scribd.com/document/145025693/Resumen-Arreglos-Pilas-y-Colas