Está en la página 1de 35

INSTITUTO TECNOLÓGICO

SUPERIOR DE SAN ANDRÉS


TUXTLA

Ingeniería en Sistemas Computacionales


Estructura de Datos
MTI Angelina Márquez Jiménez.

Reporte De Investigación

Presenta:
Mil Ortiz Emmanuel Alejandro
Chi Marcial Fernando Yahir
Leonardo Hernández Azamar
Chaga Chagala Isaac

Grupo: 304 B

Periodo: Septiembre 2022- Enero 2023


San Andrés Tuxtla, Veracruz.
INSTITUTO TECNOLÓGICO
SUPERIOR DE SAN ANDRÉS
TUXTLA

INGENIERÍA EN SISTEMAS
COMPUTACIONALES

MANUAL DE PRÁCTICAS DE CÓDIGO: AED-1026


LABORATORIO
ESTRUCTURA DE DATOS REVISIÓN: 1

INDICE
INTRODUCCION…………………………………………………………………………..3-4
CLASIFICACION DE LAS ESTRUCTURA DE DATOS………………………………5-6
TIPOS DE DATOS ABSTRACTOS (TDA)……………………………………………..7-9
EJEMPLOS DE TDA's…………………………………………………………………….10-19
MANEJO DE MEMORIA………………………………………………………………….20-23
MEMORIA ESTATICA…………………………………………………………………...23-25
MEMORIA DINAMICA…………………………………………………………………...25-26
MEMORIA AUTOMATICA………………………………………………………………...26
ANALISIS DE ALGORITMOS…………………………………………………………..27-28
COMPLEJIDAD EN EL TIEMPO………………………………………………………..29
COMPLEJIDAD EN EL ESPACIO……………………………………………………...30
EFICIENCIA DE LOS ALGORITMOS………………………………………………….30-31
CONCLUSION……………………………………………………………………………32
REFERENCIAS…………………………………………………………………………..33
INSTITUTO TECNOLÓGICO
SUPERIOR DE SAN ANDRÉS
TUXTLA

INGENIERÍA EN SISTEMAS
COMPUTACIONALES

MANUAL DE PRÁCTICAS DE CÓDIGO: AED-1026


LABORATORIO
ESTRUCTURA DE DATOS REVISIÓN: 1

INTRODUCCION
Las estructuras de datos son elementos fundamentales en la ciencia de la computación y la
programación. Son herramientas que permiten organizar y almacenar datos de manera
eficiente para que puedan ser procesados y manipulados de manera efectiva por un programa
o algoritmo. Las estructuras de datos son esenciales en el desarrollo de software, ya que la
elección adecuada de una estructura de datos puede tener un gran impacto en el rendimiento
y la eficiencia de un programa.
Existen diversas estructuras de datos, cada una diseñada para cumplir con un conjunto
específico de requisitos y tareas. Algunas de las estructuras de datos más comunes incluyen:
Arreglos (Arrays): Son colecciones de elementos del mismo tipo, almacenados en memoria de
manera contigua. Los elementos se acceden mediante un índice. Los arreglos son eficientes
para el acceso directo a elementos, pero no son flexibles en cuanto a su tamaño.
Listas enlazadas (Linked Lists): Estas estructuras de datos están formadas por nodos que
contienen datos y una referencia al siguiente nodo. Son flexibles en cuanto a su tamaño y
permiten la inserción y eliminación eficiente de elementos en cualquier posición.
Pilas (Stacks) y Colas (Queues): Son estructuras de datos que siguen el principio de "último
en entrar, primero en salir" (LIFO) para pilas y "primero en entrar, primero en salir" (FIFO) para
colas. Son utilizadas en una variedad de aplicaciones, como la gestión de llamadas a funciones
y la planificación de tareas.
Árboles (Trees): Los árboles son estructuras de datos jerárquicas que consisten en nodos
conectados de manera que forman una estructura de árbol. Los árboles binarios, los árboles
AVL y los árboles B son ejemplos de diferentes tipos de árboles utilizados en la organización
y búsqueda eficiente de datos.
Grafos (Graphs): Los grafos son estructuras de datos que consisten en nodos (vértices) y
conexiones entre ellos (aristas). Se utilizan para modelar relaciones complejas y se aplican en
una amplia gama de aplicaciones, como redes sociales, mapas y sistemas de recomendación.
INSTITUTO TECNOLÓGICO
SUPERIOR DE SAN ANDRÉS
TUXTLA

INGENIERÍA EN SISTEMAS
COMPUTACIONALES

MANUAL DE PRÁCTICAS DE CÓDIGO: AED-1026


LABORATORIO
ESTRUCTURA DE DATOS REVISIÓN: 1

Tablas Hash (Hash Tables): Son estructuras de datos que utilizan una función hash para
asignar claves a valores. Permiten un acceso rápido a los datos si se conoce la clave. Son
ideales para buscar datos por clave.
Matrices (Matrices): Son estructuras bidimensionales que contienen elementos organizados
en filas y columnas. Son útiles para representar datos tabulares y realizar operaciones
matriciales.
La elección de la estructura de datos adecuada depende de los requisitos específicos de la
aplicación y de las operaciones que se realizarán con los datos. Un conocimiento sólido de las
estructuras de datos es fundamental para la programación eficiente y la resolución de
problemas complejos en informática. En resumen, las estructuras de datos son la base sobre
la cual se construye la mayoría del software moderno, y su comprensión es esencial para
cualquier programador
INSTITUTO TECNOLÓGICO
SUPERIOR DE SAN ANDRÉS
TUXTLA

INGENIERÍA EN SISTEMAS
COMPUTACIONALES

MANUAL DE PRÁCTICAS DE CÓDIGO: AED-1026


LABORATORIO
ESTRUCTURA DE DATOS REVISIÓN: 1

QUE ES ESTRUCTURA DE DATOS


La estructura de datos se refiere a la organización y el almacenamiento de datos en un
programa o sistema informático para que puedan ser accedidos y gestionados de manera
eficiente. Es una parte fundamental de la informática y la programación, ya que permite a los
desarrolladores organizar y manipular datos de manera efectiva para resolver problemas y
realizar tareas específicas.
Un autor influyente en el campo de las estructuras de datos es Donald E. Knuth. Knuth es un
renombrado científico de la computación y matemático conocido por su trabajo en algoritmos
y estructuras de datos. Su serie de libros "The Art of Computer Programming" (El arte de la
programación informática) es una obra clásica que aborda temas relacionados con algoritmos
y estructuras de datos, y es ampliamente respetada en la comunidad de la informática.
En sus libros, Knuth explora diferentes tipos de estructuras de datos, algoritmos eficientes para
su manipulación y análisis de su rendimiento. Sus contribuciones han tenido un impacto
significativo en la forma en que los programadores diseñan y utilizan estructuras de datos en
sus aplicaciones y sistemas. [1]
El estudio de estructuras de datos y de los algoritmos que las manipulan constituye el núcleo
central de la informática y de la computación. Se revisan en este capítulo los conceptos básicos
de dato, abstracción, algoritmos y programas, así como los criterios relativos a análisis y
eficiencia de algoritmos.
INSTITUTO TECNOLÓGICO
SUPERIOR DE SAN ANDRÉS
TUXTLA

INGENIERÍA EN SISTEMAS
COMPUTACIONALES

MANUAL DE PRÁCTICAS DE CÓDIGO: AED-1026


LABORATORIO
ESTRUCTURA DE DATOS REVISIÓN: 1

CLASIFICACIÓN DE LAS 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.
1.-Estructuras Lógicas de Datos: Las estructuras de datos son muy importantes en
sistemas computacionales.
En un programa, cada variable pertenece a alguna estructura de datos explícita o
implícitamente definida, la cual determina el conjunto de operaciones válidas 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 posibles.
2.-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 más primitivas. Las estructuras de
datos simples que consideramos se construyen a partir de estructuras primitivas y son:
Cadenas, Arreglos, Registros.
A estas estructuras de datos las respaldan muchos lenguajes de programación.
3.-Estructuras Lineales y No Lineales: Las estructuras de datos simples se pueden
combinar de varias maneras para formar estructuras más complejas. Las dos clases
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.
4.-Organización de Archivos: Las técnicas de estructuración de datos aplicadas a
conjuntos de datos que los sistemas operativos manejan como “cajas negras”
comúnmente se llaman Organización de Archivos. Un archivo tiene nombre, contenido,
dirección donde se guarda y alguna información administrativa, por ejemplo, quién la
elaboró y cuán grande es.
Las cuatro clases básicas de organización de archivos son:
Secuencia, Relativo, Secuencial, indexado, Multillave. [2]
INSTITUTO TECNOLÓGICO
SUPERIOR DE SAN ANDRÉS
TUXTLA

INGENIERÍA EN SISTEMAS
COMPUTACIONALES

MANUAL DE PRÁCTICAS DE CÓDIGO: AED-1026


LABORATORIO
ESTRUCTURA DE DATOS REVISIÓN: 1

TIPOS DE DATOS DE DATOS ABSTRACTOS


Aunque los conceptos de tipo de datos (TD), estructura de datos (ED) y tipo de datos abstracto
(TDA) se han visto en los cursos introductorios de programación, comenzaremos este módulo
puntualizando sus características. Es importante destacar que, si bien son tres conceptos que
tienen que ver con la representación de los datos de un problema, y a veces se los confunde,
tienen significados distintos. En un lenguaje de programación, el tipo de datos de una variable'
está determinado por el conjunto de valores que dicha variable puede tomar y el conjunto de
operaciones que se pueden realizar con variables del mencionado tipo (como argumentos y/o
como resultado). Por ejemplo, en Pascal el tipo boolean tiene dos valores, éste se refiere al
conjunto (false, true}, es decir que una variable de este tipo podrá tomar sólo uno de esos
valores; con respecto a las operaciones cuenta con la negación, la conjunción y la disyunción
INSTITUTO TECNOLÓGICO
SUPERIOR DE SAN ANDRÉS
TUXTLA

INGENIERÍA EN SISTEMAS
COMPUTACIONALES

MANUAL DE PRÁCTICAS DE CÓDIGO: AED-1026


LABORATORIO
ESTRUCTURA DE DATOS REVISIÓN: 1

cuya representación es: not, y respectivamente. En cambio el tipo array, of boolean cuenta con
ocho valores, estando determinado por el conjunto ((false, false, false), (false,false,true) (false,
true, false) (false,true,true) (true, false, false) (true, false, true) (true,true, false), (true,true,
true)), donde cada una de las ternas representa uno de los valores que puede tomar una
variable declarada del mencionado tipo. [3]
INSTITUTO TECNOLÓGICO
SUPERIOR DE SAN ANDRÉS
TUXTLA

INGENIERÍA EN SISTEMAS
COMPUTACIONALES

MANUAL DE PRÁCTICAS DE CÓDIGO: AED-1026


LABORATORIO
ESTRUCTURA DE DATOS REVISIÓN: 1

[3]

[3]
INSTITUTO TECNOLÓGICO
SUPERIOR DE SAN ANDRÉS
TUXTLA

INGENIERÍA EN SISTEMAS
COMPUTACIONALES

MANUAL DE PRÁCTICAS DE CÓDIGO: AED-1026


LABORATORIO
ESTRUCTURA DE DATOS REVISIÓN: 1

EJEMPLOS DE TDA’S
TDA LISTA
Una lista se define como una serie de N elementos E1, E2, ..., EN, ordenados de manera
consecutiva, es decir, el elemento Ek (que se denomina elemento k-ésimo) es previo al
elemento Ek+1. Si la lista contiene 0 elementos se denomina como lista vacía.
Las operaciones que se pueden realizar en la lista son: insertar un elemento en la posición k,
borrar el k-ésimo elemento, buscar un elemento dentro de la lista y preguntar si la lista está
vacía.
Una manera simple de implementar una lista es utilizando un arreglo. Sin embargo, las
operaciones de inserción y borrado de elementos en arreglos son ineficientes, puesto que para
insertar un elemento en la parte media del arreglo es necesario mover todos los elementos
que se encuentren delante de él, para hacer espacio, y al borrar un elemento es necesario
mover todos los elementos para ocupar el espacio desocupado. Una implementación más
eficiente del TDA se logra utilizando listas enlazadas.
A continuación, se presenta una implementación en Java del TDA utilizando listas enlazadas
y sus operaciones asociadas:
• estaVacia(): devuelve verdadero si la lista está vacía, falso en caso contrario.
• insertar (x, k): inserta el elemento x en la k-ésima posición de la lista.
• Buscar K(x): devuelve la posición en la lista del elemento x.
• buscar (k): devuelve el k-ésimo elemento de la lista.
• eliminar(x): elimina de la lista el elemento x.
En la implementación con listas enlazadas es necesario tener en cuenta algunos detalles
importantes: si solamente se dispone de la referencia al primer elemento, el añadir o remover
en la primera posición es un caso especial, puesto que la referencia a la lista enlazada debe
modificarse según la operación realizada. Además, para eliminar un elemento en particular es
INSTITUTO TECNOLÓGICO
SUPERIOR DE SAN ANDRÉS
TUXTLA

INGENIERÍA EN SISTEMAS
COMPUTACIONALES

MANUAL DE PRÁCTICAS DE CÓDIGO: AED-1026


LABORATORIO
ESTRUCTURA DE DATOS REVISIÓN: 1

necesario conocer el elemento que lo antecede, y en este caso, ¿qué pasa con el primer
elemento, que no tiene un predecesor?
Para solucionar estos inconvenientes se utiliza la implementación de lista enlazada con nodo
cabecera. Con esto, todos los elementos de la lista tendrán un elemento previo, puesto que el
previo del primer elemento es la cabecera. Una lista vacía corresponde, en este caso, a una
cabecera cuya referencia siguiente es null.[3]

TDA PILA
Una pila (stack o pushdown en inglés) es una lista de elementos de la cual sólo se puede
extraer el último elemento insertado. La posición en donde se encuentra dicho elemento se
denomina tope de la pila. También se conoce a las pilas como listas LIFO (LAST IN - FIRST
OUT: el último que entra es el primero que sale).
INSTITUTO TECNOLÓGICO
SUPERIOR DE SAN ANDRÉS
TUXTLA

INGENIERÍA EN SISTEMAS
COMPUTACIONALES

MANUAL DE PRÁCTICAS DE CÓDIGO: AED-1026


LABORATORIO
ESTRUCTURA DE DATOS REVISIÓN: 1

[3]

La interfaz de este TDA provee las siguientes operaciones:

• apilar(x): inserta el elemento x en el tope de la pila (push en inglés).


• desapilar(): retorna el elemento que se encuentre en el tope de la pila y lo elimina de
ésta (pop en inglés).
• tope(): retorna el elemento que se encuentre en el tope de la pila, pero sin eliminarlo de
ésta (top en inglés).
• estaVacia(): retorna verdadero si la pila no contiene elementos, falso en caso contrario
(isEmpty en inglés).

Nota: algunos autores definen desapilar como sacar el elemento del tope de la pila sin
retornarlo.[3]

Implementación del TDA pila

A continuación, se muestran dos maneras de implementar una pila: utilizando un arreglo y


utilizando una lista enlazada. En ambos casos el costo de las operaciones es de O(1).

Implementación utilizando arreglos


INSTITUTO TECNOLÓGICO
SUPERIOR DE SAN ANDRÉS
TUXTLA

INGENIERÍA EN SISTEMAS
COMPUTACIONALES

MANUAL DE PRÁCTICAS DE CÓDIGO: AED-1026


LABORATORIO
ESTRUCTURA DE DATOS REVISIÓN: 1

Para implementar una pila utilizando un arreglo, basta con definir el arreglo del tipo de dato
que se almacenará en la pila. Una variable de instancia indicará la posición del tope de la pila,
lo cual permitirá realizar las operaciones de inserción y borrado, y también permitirá saber si
la pila esta vacía, definiendo que dicha variable vale -1 cuando no hay elementos en el arreglo.

Ejemplo de uso: eliminación de recursividad

Suponga que una función F realiza un llamado recursivo dentro de su código, lo que se ilustra
en la siguiente figura:

[3]

Si la llamada recursiva es lo último que hace la función F, entonces dicha llamada se puede
substituir por un ciclo while. Este caso es conocido como tail recursion y en lo posible hay que
evitarlo en la programación, ya que cada llamada recursiva ocupa espacio en la memoria del
computador, y en el caso del tail recursion es muy simple eliminarla. [3]

TDA cola

Una cola (queue en inglés) es una lista de elementos en donde siempre se insertan nuevos
elementos al final de la lista y se extraen elementos desde el inicio de la lista. También se
conoce a las colas como listas FIFO (FIRST IN - FIRST OUT: el primero que entra es el primero
que sale).[3]
INSTITUTO TECNOLÓGICO
SUPERIOR DE SAN ANDRÉS
TUXTLA

INGENIERÍA EN SISTEMAS
COMPUTACIONALES

MANUAL DE PRÁCTICAS DE CÓDIGO: AED-1026


LABORATORIO
ESTRUCTURA DE DATOS REVISIÓN: 1

xisten varios tipos de colas en el TDA (Tipo de dato abstracto), cada una con características y
funcionalidades específicas. Algunos de los tipos de colas más comunes son:

1. Cola estática: Se trata de una cola implementada utilizando un arreglo de tamaño fijo. La
cola sigue una estructura FIFO (First In, First Out) y tiene un tamaño máximo predefinido.

[3]

2. Cola dinámica: En este caso, la cola se implementa utilizando una estructura de datos
enlazada (usualmente una lista enlazada). A diferencia de la cola estática, el tamaño no está
limitado y se puede aumentar o disminuir según sea necesario.

[3]
INSTITUTO TECNOLÓGICO
SUPERIOR DE SAN ANDRÉS
TUXTLA

INGENIERÍA EN SISTEMAS
COMPUTACIONALES

MANUAL DE PRÁCTICAS DE CÓDIGO: AED-1026


LABORATORIO
ESTRUCTURA DE DATOS REVISIÓN: 1

3. Cola de prioridad: Esta cola se utiliza cuando los elementos tienen asignado un valor
numérico o una prioridad. Los elementos se insertan en la cola y se ordenan automáticamente
según su prioridad, de modo que el elemento con la mayor prioridad esté al frente de la cola.

[3]

4. Cola circular: En este tipo de cola, los elementos se almacenan en un arreglo de tamaño fijo
pero, a diferencia de la cola estática, al llegar al final del arreglo los elementos se enlazan con
el inicio formando una especie de círculo. Esto permite tener una cola con tamaño fijo pero que
puede seguir recibiendo elementos si se liberan espacios al frente.
INSTITUTO TECNOLÓGICO
SUPERIOR DE SAN ANDRÉS
TUXTLA

INGENIERÍA EN SISTEMAS
COMPUTACIONALES

MANUAL DE PRÁCTICAS DE CÓDIGO: AED-1026


LABORATORIO
ESTRUCTURA DE DATOS REVISIÓN: 1

[3]

Bicolas
La bicola o doble cola es un tipo de cola especial que permiten la inserción y eliminación de
elementos de ambos extremos de la cola. Puede representarse a partir de un vector y dos
índices, siendo su representación más frecuente una lista circular doblemente enlazada. [11]

[3]
INSTITUTO TECNOLÓGICO
SUPERIOR DE SAN ANDRÉS
TUXTLA

INGENIERÍA EN SISTEMAS
COMPUTACIONALES

MANUAL DE PRÁCTICAS DE CÓDIGO: AED-1026


LABORATORIO
ESTRUCTURA DE DATOS REVISIÓN: 1

Bicolas de Salida Restringida


Son aquellas donde sólo se elimina por el final, aunque se puede insertar al inicio y al final.

[3]

Estas son solo algunas de las variantes más comunes de las colas en el TDA. Sin embargo,
existen otras implementaciones y estructuras relacionadas a las colas que pueden ser
utilizadas según las necesidades específicas de cada caso.

Las operaciones básicas en una cola son:

• encolar(x): inserta el elemento x al final de la cola (enqueue en inglés).


• sacar(): retorna el elemento que se ubica al inicio de la cola (dequeue en inglés).
• estaVacia(): retorna verdadero si la cola esta vacía, falso en caso contrario.

Al igual que con el TDA pila, una cola se puede implementar tanto con arreglos como con listas
enlazadas. A continuación se verá la implementación usando un arreglo.

Las variables de instancia necesarias en la implementación son:


INSTITUTO TECNOLÓGICO
SUPERIOR DE SAN ANDRÉS
TUXTLA

INGENIERÍA EN SISTEMAS
COMPUTACIONALES

MANUAL DE PRÁCTICAS DE CÓDIGO: AED-1026


LABORATORIO
ESTRUCTURA DE DATOS REVISIÓN: 1

• primero: indica el índice de la posición del primer elemento de la cola, es decir, la


posición el elemento a retornar cuando se invoque sacar.
• ultimo: indica el índice de la posición de último elemento de la cola. Si se invoca encolar,
el elemento debe ser insertado en el casillero siguiente al que indica la variable.
• numElem: indica cuántos elementos posee la cola. Definiendo MAX_ELEM como el
tamaño máximo del arreglo, y por lo tanto de la cola, entonces la cola esta vacía
si numElem==0 y está llena si numElem==MAX_ELEM.

[3]
INSTITUTO TECNOLÓGICO
SUPERIOR DE SAN ANDRÉS
TUXTLA

INGENIERÍA EN SISTEMAS
COMPUTACIONALES

MANUAL DE PRÁCTICAS DE CÓDIGO: AED-1026


LABORATORIO
ESTRUCTURA DE DATOS REVISIÓN: 1

TDA ÁRBOL

un árbol es un tipo abstracto de datos (TAD) ampliamente usado que imita la estructura
jerárquica de un árbol, con un valor en la raíz y subárboles con un nodo padre, representado
como un conjunto de nodos enlazados.
Una estructura de datos de árbol se puede definir de forma recursiva (localmente) como una
colección de nodos (a partir de un nodo raíz), donde cada nodo es una estructura de datos con
un valor, junto con una lista de referencias a los nodos (los hijos), con la condición de que
ninguna referencia esté duplicada ni que ningún nodo apunte a la raíz.
• Es un TAD que representa una colección de elementos llamados nodos.
• Uno de estos nodos es especial, nos referimos a él como la raíz del árbol.
• Entre los nodos hay una relación de paternidad la cual impone una estructura
jerárquica sobre ellos. [4]

[4]
INSTITUTO TECNOLÓGICO
SUPERIOR DE SAN ANDRÉS
TUXTLA

INGENIERÍA EN SISTEMAS
COMPUTACIONALES

MANUAL DE PRÁCTICAS DE CÓDIGO: AED-1026


LABORATORIO
ESTRUCTURA DE DATOS REVISIÓN: 1

MANEJO DE MEMORIA

Todas las variables, arreglos y objetos en general tienen una duración determinada en el
transcurso de un programa. Son creados y destruidos para su uso y después para que la
memoria sea liberada para que la utilicen otros objetos.

En C# existen tres formas de usar la memoria para almacenar valores, son:

a) Memoria estática: Es la utilizada por variables globales y las declaradas de tipo estática.
Estos objetos tienen asignada la misma dirección de memoria desde el comienzo hasta el final
del programa. (variables globales, tipo estático)

b) Memoria automática: Es la utilizada por argumentos en una función y por las variables
locales. Cada entrada en la función crea estos objetos y son destruidos al salir de ella.
(variables locales, argumentos en una función).

c) Memoria Dinámica: Es también llamado almacenamiento libre por que en este caso el
programador es el que solicita memoria para crear los objetos y es el responsable de liberar la
memoria cuando ya no la necesita para ser reutilizada. (objetos de una clase)

La reserva y liberación para variables globales, estáticas, locales y argumentos son realizadas
de forma implícita por el programa, la única que requiere intervención del programador es la
reserva y liberación de memoria dinámica. [5]

El manejo de memoria es el proceso mediante el cual se administra y gestiona el uso de la


memoria de una computadora. La memoria se utiliza para almacenar y acceder a programas
y datos en tiempo de ejecución.

Existen varios aspectos importantes del manejo de memoria:

- Asignación de memoria: se refiere a cómo y cuánta memoria se asigna a un programa en


particular. La asignación de memoria puede ser estática o dinámica. En la asignación estática,
la cantidad de memoria asignada a un programa se determina en tiempo de compilación y no
INSTITUTO TECNOLÓGICO
SUPERIOR DE SAN ANDRÉS
TUXTLA

INGENIERÍA EN SISTEMAS
COMPUTACIONALES

MANUAL DE PRÁCTICAS DE CÓDIGO: AED-1026


LABORATORIO
ESTRUCTURA DE DATOS REVISIÓN: 1

cambia durante la ejecución. En la asignación dinámica, la cantidad de memoria asignada


puede cambiar durante la ejecución del programa.

[5]

- Liberación de memoria: se refiere a la liberación de la memoria que ya no es necesaria. Es


importante liberar la memoria correctamente para evitar fugas de memoria, que ocurren
cuando se asigna memoria pero no se libera adecuadamente, lo que puede llevar a un
agotamiento de la memoria.

[5]

- Fragmentación de memoria: se refiere a la distribución de la memoria en bloques más


pequeños a medida que los programas se asignan y liberan. Puede haber fragmentación
externa, que ocurre cuando hay suficiente memoria total disponible, pero no hay suficiente
espacio contiguo para asignar a un programa en particular. También puede haber
INSTITUTO TECNOLÓGICO
SUPERIOR DE SAN ANDRÉS
TUXTLA

INGENIERÍA EN SISTEMAS
COMPUTACIONALES

MANUAL DE PRÁCTICAS DE CÓDIGO: AED-1026


LABORATORIO
ESTRUCTURA DE DATOS REVISIÓN: 1

fragmentación interna, que ocurre cuando se asigna más memoria de la necesaria para un
programa en particular.

[5]

- Protección de memoria: se refiere a la protección de la memoria de un programa contra


accesos no autorizados. Esto se logra mediante mecanismos como los permisos de acceso y
los límites de memoria.

[5]
INSTITUTO TECNOLÓGICO
SUPERIOR DE SAN ANDRÉS
TUXTLA

INGENIERÍA EN SISTEMAS
COMPUTACIONALES

MANUAL DE PRÁCTICAS DE CÓDIGO: AED-1026


LABORATORIO
ESTRUCTURA DE DATOS REVISIÓN: 1

- Swap y paginación: se refiere a la técnica de intercambio de bloques de memoria entre la


memoria principal y el almacenamiento secundario, como un disco duro. Esto permite utilizar
más memoria virtual de la que está disponible físicamente en la memoria RAM.

[5]

El manejo de memoria es una parte esencial del sistema operativo y tiene un impacto
significativo en el rendimiento y la capacidad de un sistema informático.
INSTITUTO TECNOLÓGICO
SUPERIOR DE SAN ANDRÉS
TUXTLA

INGENIERÍA EN SISTEMAS
COMPUTACIONALES

MANUAL DE PRÁCTICAS DE CÓDIGO: AED-1026


LABORATORIO
ESTRUCTURA DE DATOS REVISIÓN: 1

MEMORIA ESTATICA.
La memoria estática es la que se reserva en el momento de la compilación antes de comenzar
a ejecutarse el programa. Los objetos son creados en ese momento y destruidos al finalizar el
programa. Mantenga la misma localización en memoria durante todo el transcurso del
programa.
Los objetos administrados de ese modo son:
- Variables estáticas
- Variables globales
- Miembros estáticos de clases
- Literales de cualquier tipo.
Ejemplos:

Class CSimple1
{
static void Main(string[]args)
{
int[] Numeros=new int[]{1, 2,3,4,5};
for(int i=0;iconsole.write(“{0},”,Numeros[i]);
}}

Clase CSimple2
{
INSTITUTO TECNOLÓGICO
SUPERIOR DE SAN ANDRÉS
TUXTLA

INGENIERÍA EN SISTEMAS
COMPUTACIONALES

MANUAL DE PRÁCTICAS DE CÓDIGO: AED-1026


LABORATORIO
ESTRUCTURA DE DATOS REVISIÓN: 1

static int Funcion(int p,int q)


{
retorno(p+q);
}
static void main(string[] args)
{
int Resultado=Funcion(7,2);
console.writeline(Resultado);
}
}

En el ejemplo uno se muestra la declaración estática de un arreglo y la declaración de la


variable global de control dentro del for.
En el ejemplo dos se muestra la declaración estática de una función la cual es ejecutada al
enviarle dos parámetros que son literales numéricos.
En resumen, el inconveniente de utilizar memoria estática, aunque es más fácil de programar
es que la cantidad de memoria se reserva siempre antes de conocer los datos completos del
problema lo que a veces lleva a reservar un máximo de memoria que en la mayoría de las
veces no se va a necesitar. [5]
INSTITUTO TECNOLÓGICO
SUPERIOR DE SAN ANDRÉS
TUXTLA

INGENIERÍA EN SISTEMAS
COMPUTACIONALES

MANUAL DE PRÁCTICAS DE CÓDIGO: AED-1026


LABORATORIO
ESTRUCTURA DE DATOS REVISIÓN: 1

MEMORIA DINÁMICA
– ¿Qué es?
• Mecanismo para gestionar de forma dinámica el espacio
ocupado/libre de memoria.
– ¿Para qué sirve?
• Permite reservar/liberar memoria bajo demanda
– Libera al programador de saber dónde colocar sus estructuras en memoria
• Evita limites por culpa de variables estáticas
• Facilita implementar estructuras de datos dinámicas como listas,
Árboles en el que no se conoce a priori su tamaño final
• Mejor aprovechamiento de la memoria
Memoria dinámica para el sistema operativo
– Primera aproximación: “Cutre-system”
– Buddy System
– Slab allocator
• Memoria dinámica para el usuarioSO no usa paginación para su espacio lógico
– Mecanismos para reducir la fragmentación y acelerar la reserva de memoria
– Soporte a dispositivos que interactúan directamente con la memoria física
• Reserva un segmento de memoria física para sus datos.
INSTITUTO TECNOLÓGICO
SUPERIOR DE SAN ANDRÉS
TUXTLA

INGENIERÍA EN SISTEMAS
COMPUTACIONALES

MANUAL DE PRÁCTICAS DE CÓDIGO: AED-1026


LABORATORIO
ESTRUCTURA DE DATOS REVISIÓN: 1

[5]
MEMORIA AUTOMÁTICA
es uno de los servicios que proporciona Common Language Runtime durante la ejecución
administrada. El recolector de elementos no utilizados de Common Language Runtime
administra la asignación y liberación de la memoria de una aplicación. Esto significa que los
programadores no tienen que escribir código para realizar tareas de administración de
memoria al programar aplicaciones administradas. La administración automática de la
memoria puede eliminar problemas frecuentes, como olvidar liberar un objeto y causar una
pérdida de memoria, o intentar tener acceso a la memoria de un objeto que ya se ha liberado.
En esta sección se describe cómo asigna y libera memoria el recolector de elementos no
utilizados.

[6]

ANÁLISIS DE ALGORITMOS
Los algoritmos vamos a empezar por establecer una definición de lo que es un
algoritmo: Secuencia finita de instrucciones donde cada una de las cuales tiene un significado
preciso y puede ejecutarse con una cantidad finita de recursos computacionales en un tiempo
finito.
El análisis de algoritmos es una herramienta para hacer la evaluación del diseño de un
algoritmo, permite establecer la calidad de un programa y compararlo con otros que puedan
INSTITUTO TECNOLÓGICO
SUPERIOR DE SAN ANDRÉS
TUXTLA

INGENIERÍA EN SISTEMAS
COMPUTACIONALES

MANUAL DE PRÁCTICAS DE CÓDIGO: AED-1026


LABORATORIO
ESTRUCTURA DE DATOS REVISIÓN: 1

resolver el mismo problema, sin necesidad de desarrollarlos. El análisis de algoritmos estudia,


desde un punto de vista teórico, los recursos computacionales que requiere la ejecución de un
programa, es decir su eficiencia (tiempo de CPU, uso de memoria, ancho de banda, ...).
Además de la eficiencia en el desarrollo de software existen otros factores igualmente
relevantes: funcionalidad, corrección, robustez, usabilidad, modularidad, mantenibilidad,
fiabilidad, simplicidad y aún el propio costo de programación.
El análisis de algoritmos se basa en:
• El análisis de las características estructurales del algoritmo que respalda el programa.
• La cantidad de memoria que utiliza para resolver un problema.
• La evaluación del diseño de las estructuras de datos del programa, midiendo la
eficiencia de los algoritmos para resolver el problema planteado.
Determinar la eficiencia de un algoritmo nos permite establecer lo que es factible en la
implementación de una solución de lo que es imposible.[6]
- Tipos de Análisis:
• Peor caso (usualmente): T(n) = Tiempo máximo necesario para un problema de tamaño
n
• Caso medio (a veces): T(n) = Tiempo esperado para un problema cualquiera de tamaño
n
· (Requiere establecer una distribución estadística)
• Mejor caso (engañoso): T(n) = Tiempo menor para un problema cualquiera de tamaño
n
Los criterios para evaluar programas son diversos: eficiencia, portabilidad, eficacia, robustez,
etc. El análisis de complejidad está relacionado con la eficiencia del programa. La eficiencia
mide el uso de los recursos del computador por un algoritmo. Por su parte, el análisis de
complejidad mide el tiempo de cálculo para ejecutar las operaciones (complejidad en tiempo)
y el espacio de memoria para contener y manipular el programa más los datos (complejidad
INSTITUTO TECNOLÓGICO
SUPERIOR DE SAN ANDRÉS
TUXTLA

INGENIERÍA EN SISTEMAS
COMPUTACIONALES

MANUAL DE PRÁCTICAS DE CÓDIGO: AED-1026


LABORATORIO
ESTRUCTURA DE DATOS REVISIÓN: 1

en espacio). Así, el objetivo del análisis de complejidad es cuantificar las medidas físicas:
tiempo de ejecución y espacio de memoria y comparar distintos algoritmos que resuelven un
mismo problema.
El tiempo de ejecución de un programa depende de factores como:
los datos de entrada del programa
la calidad del código objeto generado por el compilador
la naturaleza y rapidez de las instrucciones de máquina utilizadas
la complejidad en tiempo del algoritmo base del programa

El tiempo de ejecución debe definirse como una función que depende de la entrada; en
particular, de su tamaño. El tiempo requerido por un algoritmo expresado como una función
del tamaño de la entrada del problema se denomina complejidad en tiempo del algoritmo y se
denota T(n). El comportamiento límite de la complejidad a medida que crece el tamaño del
problema se denomina complejidad en tiempo asintótica. De manera análoga se pueden
establecer definiciones para la complejidad en espacio y la complejidad en espacio asintótica.
El tiempo de ejecución depende de diversos factores. Se tomará como más relevante el
relacionado con la entrada de datos del programa, asociando a un problema un entero llamado
tamaño del problema, el cual es una medida de la cantidad de datos de entrada.[7]
INSTITUTO TECNOLÓGICO
SUPERIOR DE SAN ANDRÉS
TUXTLA

INGENIERÍA EN SISTEMAS
COMPUTACIONALES

MANUAL DE PRÁCTICAS DE CÓDIGO: AED-1026


LABORATORIO
ESTRUCTURA DE DATOS REVISIÓN: 1

COMPLEJIDAD EN EL TIEMPO
En muchos casos, la complejidad de tiempo de un algoritmo es igual para todas las instancias
de tamaño n del problema. En otros casos, la complejidad de un algoritmo de tamaño n es
distinta dependiendo de las instancias de tamaño n del problema que resuelve. Esto nos lleva
a estudiar la complejidad del peor caso, mejor caso, y caso promedio.
Para un tamaño dado (n), la complejidad del algoritmo en el peor caso resulta de tomar el
máximo tiempo (complejidad máxima) en que se ejecuta el algoritmo, entre todas las instancias
del problema (que resuelve el algoritmo) de tamaño n; la complejidad en el caso promedio es
la esperanza matemática del tiempo de ejecución del algoritmo para entradas de tamaño n, y
la complejidad mejor caso es el menor tiempo en que se ejecuta el algoritmo para entradas de
tamaño n. Por defecto se toma la complejidad del peor caso como medida de complejidad T(n)
del algoritmo.
Aun cuando son los programas que los llegan realmente a consumir recursos computacionales
(memoria, tiempo, etc.) sobre una máquina concreta, se realiza el análisis sobre el algoritmo
de base, considerando que se ejecuta en una máquina hipotética.
La complejidad de un programa depende de:
• La máquina y el compilador utilizados
• El tamaño de los datos de entrada que depende del tipo de datos y del algoritmo
• El valor de los datos de entrada.
La complejidad en el caso peor proporciona una medida pesimista, pero fiable.
Dado que se realiza un estudio teórico de la complejidad, ignorando aspectos como las
características de la máquina y el compilador, se tiene en cuenta que las diferencias en
eficiencia se hacen más significativos para tamaños grandes de los datos de entrada se analiza
la complejidad en términos de su comportamiento asintótico, dejando de lado la forma exacta
de la función de complejidad.[8]
INSTITUTO TECNOLÓGICO
SUPERIOR DE SAN ANDRÉS
TUXTLA

INGENIERÍA EN SISTEMAS
COMPUTACIONALES

MANUAL DE PRÁCTICAS DE CÓDIGO: AED-1026


LABORATORIO
ESTRUCTURA DE DATOS REVISIÓN: 1

COMPLEJIDAD ESPACIO
Memoria que utiliza un programa para su ejecución, indica la cantidad de espacio requerido
para ejecutar el algoritmo; es decir, el espacio en memoria que ocupan todas las variables
propias al algoritmo. Para calcular la memoria estática de un algoritmo se suma la memoria
que ocupan las variables declaradas en el algoritmo. Para el caso de la memoria dinámica, el
cálculo no es tan simple ya que, este depende de cada ejecución del algoritmo.
Nosotros estudiaremos las complejidades temporales, con este fin, para cada problema
determinaremos una medida N, que llamaremos tamaño de la entrada o número de datos a
procesar por el programa, intentaremos hallar respuestas en función de dicha N.
Esto dependerá de la naturaleza del problema, por ejemplo, si hablamos de un arreglo se
puede ver a N como el rango del arreglo, para una matriz, el número de elementos que la
componen; para un grafo, podría ser el número de nodos o arcos, no se puede establecer una
regla para N, pues cada problema tiene su propia complejidad.

[10]
INSTITUTO TECNOLÓGICO
SUPERIOR DE SAN ANDRÉS
TUXTLA

INGENIERÍA EN SISTEMAS
COMPUTACIONALES

MANUAL DE PRÁCTICAS DE CÓDIGO: AED-1026


LABORATORIO
ESTRUCTURA DE DATOS REVISIÓN: 1

EFICIENCIA DE LOS ALGORITMOS


Medida del uso de los recursos computacionales requeridos por la ejecución de un algoritmo
en función del tamaño de las entradas.
Tipos de análisis
¿Cómo medimos el tiempo de ejecución de un algoritmo?
Mejor caso
En condiciones óptimas (no se usa por ser demasiado optimista).
Peor caso
En el peor escenario posible (nos permite acotar el tiempo de ejecución).
Caso promedio
Caso difícil de caracterizar en la práctica.
Análisis probabilístico
Asume una distribución de probabilidad sobre las posibles entradas.
Análisis amortizado
Tiempo medio de ejecución por operación sobre una secuencia de ejecuciones sucesivas
Comparación de algoritmos
• Principio de invarianza
• Eficiencia
• Notaciones asintóticas
• Cálculo de la eficiencia de un algoritmo
INSTITUTO TECNOLÓGICO
SUPERIOR DE SAN ANDRÉS
TUXTLA

INGENIERÍA EN SISTEMAS
COMPUTACIONALES

MANUAL DE PRÁCTICAS DE CÓDIGO: AED-1026


LABORATORIO
ESTRUCTURA DE DATOS REVISIÓN: 1

Resolución de recurrencias:
• Método de la ecuación característica
• Recurrencias homogéneas
• Recurrencias no homogéneas
• Cambios de variable
• Transformaciones del rango
• Apéndice: Fórmulas útiles [9]
INSTITUTO TECNOLÓGICO
SUPERIOR DE SAN ANDRÉS
TUXTLA

INGENIERÍA EN SISTEMAS
COMPUTACIONALES

MANUAL DE PRÁCTICAS DE CÓDIGO: AED-1026


LABORATORIO
ESTRUCTURA DE DATOS REVISIÓN: 1

CONCLUSION
En conclusión, el estudio de las estructuras de datos es esencial en el campo de la informática
y la programación, ya que proporciona las bases para organizar y manipular datos de manera
eficiente en aplicaciones y algoritmos. Las estructuras de datos son herramientas
fundamentales para resolver una amplia variedad de problemas y optimizar el rendimiento de
programas.
La clasificación de las estructuras de datos en tipos fundamentales como arrays, listas, pilas,
colas, árboles y grafos permite a los desarrolladores elegir la estructura adecuada según los
requisitos específicos de su proyecto. Cada tipo de estructura tiene sus propias ventajas y
desventajas, lo que les permite adaptarse a diferentes situaciones.
Los Tipos de Datos Abstractos (TDA) son una abstracción que separa la interfaz de una
estructura de datos de su implementación subyacente, lo que proporciona una forma clara y
coherente de interactuar con datos complejos. Ejemplos de TDA incluyen listas enlazadas,
pilas, colas, conjuntos y mapas, que permiten a los programadores utilizar estas estructuras
sin necesidad de conocer los detalles internos de su implementación.
El manejo de memoria es un aspecto crítico en la programación, ya que garantiza la eficiencia
y la ausencia de fugas de memoria en las aplicaciones. Los programadores deben ser
conscientes de la asignación y liberación de memoria, especialmente en lenguajes de
programación de bajo nivel, como C y C++. La gestión de memoria adecuada es esencial para
evitar errores y mejorar la estabilidad de las aplicaciones.
En resumen, comprender las estructuras de datos, su clasificación, los Tipos de Datos
Abstractos, ejemplos de estos, y el manejo de memoria son pilares fundamentales en el
desarrollo de software de calidad. Los programadores deben elegir sabiamente las estructuras
de datos y técnicas de gestión de memoria adecuadas para cada proyecto, lo que contribuirá
a la eficiencia, la fiabilidad y el éxito de sus aplicaciones.
INSTITUTO TECNOLÓGICO
SUPERIOR DE SAN ANDRÉS
TUXTLA

INGENIERÍA EN SISTEMAS
COMPUTACIONALES

MANUAL DE PRÁCTICAS DE CÓDIGO: AED-1026


LABORATORIO
ESTRUCTURA DE DATOS REVISIÓN: 1

FUENTES BIBLOGRAFICAS:
[1]Colaboradores de los proyectos Wikimedia. (2003, 9 de agosto). Estructura de datos -
Wikipedia, la enciclopedia libre. Wikipedia, la enciclopedia
libre. https://es.wikipedia.org/wiki/Estructura_de_datos
[2]http://wwwtemarioestructuradedatos.blogspot.com/p/clasificacion-estructuras-de-datos.html
[3] (s.f.). http://www.cs.uns.edu.ar/~ldm/data/eda/apuntes/01_td-ed-tda.pdf
[4] CC30A Algoritmos y Estructuras de Datos: Tipos de datos abstractos. (s.f.). DCC |
Universidad de Chile. https://users.dcc.uchile.cl/~bebustos/apuntes/cc30a/TDA/
[5] (s.f.). http://www.cs.uns.edu.ar/~ldm/data/eda/apuntes/01_td-ed-tda.pdf
[6]Automatic Memory Management - .NET. (s.f.). Microsoft Learn: Build skills that open doors
in your career. https://learn.microsoft.com/es-es/dotnet/standard/automatic-memory-
management
[6]Docència — Departament d'Arquitectura de Computadors — UPC. Universitat Politècnica
de Catalunya. Accedido el 9 de septiembre de 2023. [En línea]. Disponible:
https://docencia.ac.upc.edu/FIB/grau/SO2/documents/tema6.pdf
[7] (s.f.). Estructura de Datos. https://estructuradedatosbalv.zyrosite.com/about-me-copy-
copy-0G2khO0Aqk
[8] Barra de navegación. (s.f.). http://artemisa.unicauca.edu.co/~nediaz/EDDI/cap01.htm
[9] LUDA UAM-Azc. (s.f.). http://aniei.org.mx/paginas/uam/CursoAA/curso_aa_02.html
[10] (s.f.). Fernando Berzal. https://elvex.ugr.es/decsai/algorithms/slides/2%20Eficiencia.pdf

También podría gustarte