Alyx P. Hacker

Introduccion a las Estructuras de Datos

Introduccion a las estructuras de datos, manejo de memoria, y calculo de complejidad de tiempo y espacio.

Introduccion a las Estructuras de Datos

Estructuras de Datos

Introduccion

Podemos pensar en un programa como una serie de instrucciones que realizan acciones sobre datos. Sin datos, no tendriamos programas.

Estructuras de Datos

Una estructura de datos se puede definir como una coleccion de elementos sobre la que se realizan operaciones y se utiliza eficientemente.

Basicamente, es como se organizan datos en memoria (RAM).

Stack vs Heap

La memoria esta dividida por bytes, cada byte tiene una direccion y se almacenan de manera lineal.

La memoria esta dividida en tres secciones: la seccion code, el heap, y el stack.

La seccion code es donde estan almacenadas las instrucciones del programa.

Stack

En el siguiente programa:

int
main (void)
{
  int a = 0;
  float b = 0;

  return 0;
}

Esas dos variables seran almacenadas en el stack.

En el stack se va a crear un “activation record” o “stack frame” para cada funcion (una division del stack, donde unicamente las variables definidas dentro de el seran visibles.)

El tamano de memoria que se necesita para almacenar una variable se decide durante la compilacion del programa, por eso se llama gestion de memoria estatica.

Heap

La memoria en el heap puede ser gestionada de forma dinamica (puede ser creada, destruida, incrementada o disminuida).

A diferencia del stack, esta no se crea ni se destruye automaticamente.

Si no liberamos memoria que pusimos en el heap vamos a tener memory leaks (fugas de memoria.)

Para manejar el heap, utilizamos pointers.

Por ejemplo, si queremos un espacio en memoria para almacenar 5 enteros:

int *enteros = malloc (5 * sizeof (int));

Y manualmente tenemos que liberarla cuando no sea necesaria:

free (enteros);

Estructuras de Datos Fisicas vs Logicas

Las estructuras de datos se pueden categorizar como estructuras de datos fisicas y estructuras de datos logicas.

Estructuras de Datos Fisicas

Las estructuras de datos fisicas definen como la memoria esta organizada. Por ejemplo arrays y linked lists.

En los arrays la memoria es continua, el proximo elemento esta justo despues del anterior.

Estructuras de Datos Logicas

Las estructuras de datos logicas son formas organizadas de almacenar y manipular datos en memoria para su uso eficiente, independientemente de como se almacenen fisicamente.

Ejemplos de estructuras de datos logicas:

  1. Stack
  2. Queues
  3. Trees
  4. Graphs
  5. Hash Tables

Los stacks y queues son estructuras de datos lineales, los trees y graphs son no-lineales, y las hash tables son estructuras de datos tabulares.

Complejidad de Espacio y de Tiempo

Complejidad de Tiempo

La complejidad de tiempo, es una manera de medir que tanto tiempo le toma a una maquina realizar una tarea.

Por ejemplo, si tenemos un array de \(n\) elementos (5, 10, 20, 100, 10000, etc), si queremos pasar por cada uno de estos elementos y nos preguntamos que tanto tiempo tomara hacerlo? Decimos que su complejidad de tiempo es \(n\). Es decir, si tenemos una lista, y estamos recorriendo sus elementos una sola vez, su complejidad de tiempo es \(O(n)\).

Si tenemos una lista, de \(n\) elementos y tenemos que recorrer esos elementos 2 veces, ahora su complejidad de tiempo es \(O(n^2)\).

Si tenemos que iterar sobre una lista \(\frac{n}{2}\) veces, su complejidad de tiempo seria \(O(\log n)\).

Complejidad de Espacio

Cuando queremos saber cuanto espacio es consume en memoria durante la ejecucion de un programa, a eso le llamamos la complejidad de espacio.

Es importante saber que no estamos calculando el espacio en bytes, unicamente queremos saber en que depende el espacio que se utilice.

Si en un array hay \(n\) elementos, su complejidad de espacio es \(O(n)\).

Ejemplos con codigo