Вы находитесь на странице: 1из 16

ANÁLISIS DE ALGORITMOS

SEMANA 1

Estructuras de datos

Todos los derechos de autor son de la exclusiva propiedad de IACC o de los otorgantes de sus licencias. No está 1
ESTE
permitido copiar, reproducir, DOCUMENTO
reeditar, CONTIENE
descargar, publicar, LA SEMANA
emitir, difundir, 1 del público ni
poner a disposición
utilizar los contenidos para fines comerciales de ninguna clase.
2
ESTE DOCUMENTO CONTIENE LA SEMANA 1
ÍNDICE

OBJETIVO ESPECÍFICO ......................................................................................................................... 4


INTRODUCCIÓN ................................................................................................................................... 4
1. INTRODUCCIÓN A LAS ESTRUCTURAS DE DATOS ....................................................................... 5
1.1. RELACIÓN DE LAS ESTRUCTURAS DE DATOS CON LOS ALGORITMOS ................................ 5
2. TIPOS DE ESTRUCTURAS DE DATOS. CONCEPTO Y CARACTERÍSTICAS........................................ 5
2.1. LISTAS .................................................................................................................................. 5
2.2. COLAS ................................................................................................................................ 11
2.3. PILAS .................................................................................................................................. 12
COMENTARIO FINAL.......................................................................................................................... 14
REFERENCIAS ..................................................................................................................................... 15

3
ESTE DOCUMENTO CONTIENE LA SEMANA 1
ESTRUCTURAS DE DATOS

OBJETIVO ESPECÍFICO
 Identificar las características de los tipos de estructuras de datos listas, pilas y colas.

INTRODUCCIÓN
Escribir un programa computacional para resolver un problema es un proceso de varios pasos,
desde su formulación y especificación, el diseño de la solución, hasta su implementación,
implantación, prueba y documentación, e incluso la evaluación de si la correctitud1 de la solución
propuesta está correcta.

El presente curso revisará un conjunto de algoritmos y estructuras de datos conocidos y muy


utilizados a través de la historia de la computación para dar solución, por sí mismos o con otros
algoritmos y estructuras de datos, a diversos problemas. Dado que muchos de estos algoritmos y
estructuras existen dentro de las bibliotecas de desarrollo de los diversos lenguajes, se dará más
énfasis a los pasos para la solución de un problema (pseudocódigo), a cuánta memoria utilizan y a
su velocidad en función de la cantidad de elementos a procesar.

El trabajo en un lenguaje de programación pasará a un segundo plano, pero es importante señalar


que, de ser necesario, se utilizará oficialmente PHP2 orientado a scripting3 y no a la web. Se sugiere
utilizar Sublime Text como editor de código.

1
Término que proviene del inglés correctness y es un concepto que se aplica en informática cuando un
programa “se comporta de acuerdo a la especificación de las funciones (especificación de requerimientos
funcionales) que debería proveer”. Ver más en: https://goo.gl/JHKYi6
2
PHP (acrónimo recursivo de PHP: Hypertext Preprocessor) es un lenguaje de código abierto muy popular
especialmente adecuado para el desarrollo web y que puede ser incrustado en HTML. Ver más en:
http://goo.gl/o5akMX

3
Scripting language o lenguaje de guion. Un lenguaje scripting es un tipo de lenguaje de programación que
es generalmente interpretado. Ver más en: http://goo.gl/kBW5qh

4
ESTE DOCUMENTO CONTIENE LA SEMANA 1
1. INTRODUCCIÓN A LAS ESTRUCTURAS DE DATOS
Las estructuras de datos son, en conjunto con los objetos existentes en los lenguajes de
programación, los bloques fundamentales de la construcción de aplicaciones. Los algoritmos, al
momento de ser ejecutados, lo hacen sobre estas estructuras. Por esta razón es necesario estudiar
las diversas estructuras que pueden existir antes de estudiar a los algoritmos.

Las estructuras de datos son construcciones lógicas con características que permiten que ciertas
operaciones se realicen fácilmente sobre ellas. Su construcción se realiza de acuerdo a estructuras
más pequeñas o fundamentales llamadas nodos. Un nodo es un elemento que consta de un valor y
uno o más enlaces que apuntan a otro nodo con características equivalentes. Un nodo puede ser
visto como el vagón de un tren: lleva datos dentro (los pasajeros) y es posible conectarlo con otro
vagón o con la locomotora.

1.1. RELACIÓN DE LAS ESTRUCTURAS DE DATOS CON LOS ALGORITMOS


Cualquier función u operación que realice un software se hace sobre una o más estructuras de
datos. Estas funciones pueden ser simples, como asignar un valor o más complejas, como ordenar
la estructura en base a algún criterio.

2. TIPOS DE ESTRUCTURAS DE DATOS. CONCEPTO Y


CARACTERÍSTICAS
Existen diversos tipos de estructuras de datos. Cada estructura se utiliza para modelar y resolver
problemas específicos, aunque su implementación permite que sean intercambiables; esto
significa que se pueden implementar pilas usando listas o colas utilizando arreglos, por ejemplo.

2.1. LISTAS
Una lista es un conjunto de nodos unidos entre sí, formando una cadena. Como se mencionaba, es
posible implementar estructuras de datos utilizando otras estructuras de datos. En este sentido, es
posible implementar listas utilizando arreglos. Un arreglo se declara de la siguiente forma en
pseudocódigo:

5
ESTE DOCUMENTO CONTIENE LA SEMANA 1
Esto significa que se ha solicitado memoria para guardar un conjunto de 10 enteros, numerados
desde el 0 al 9, donde el primer elemento será “arreglo[0]” y el décimo será “arreglo[9]”.

Una de las ventajas de los arreglos es que es posible tener un acceso directo a cualquier elemento
existente dentro de él sin tener que pasar por los anteriores. Por ejemplo, si se quiere obtener “el
noveno elemento del arreglo”, basta con referenciar “arreglo[8]”:

Fuente: http://goo.gl/QCfmdQ

O si se quiere almacenar el número 100 en el quinto espacio se escribe “arreglo[4] = 100”:

Fuente: adaptado de http://goo.gl/QCfmdQ

Una desventaja de los arreglos tiene que ver con el uso de la memoria. En el ejemplo se observa
que se ha pedido memoria para almacenar 10 números enteros, pero solamente se ha
almacenado uno, el 100. Esto significa que se está desaprovechando memoria. En 10 elementos
no es gran desperdicio pero, ¿qué pasa si se tienen mil o un millón de elementos?

Otra desventaja es el hecho de que su tamaño es fijo y hacerlos crecer representa un gasto de
tiempo en cuanto a proceso y memoria; para hacer crecer un arreglo se debe solicitar un tamaño
de memoria mayor al anterior y copiar todos los elementos del arreglo original al nuevo arreglo,
generando nuevamente un posible mal uso de la memoria.

Las listas, por su parte, no presentan estas desventajas. Dada su naturaleza, se va solicitando
memoria a medida que se va necesitando insertar un nuevo elemento y la libera cuando se
elimina.

6
ESTE DOCUMENTO CONTIENE LA SEMANA 1
Como se explicó, un nodo consiste en un elemento y un enlace o puntero al siguiente elemento de
la lista. Una representación visual sería:

Fuente: http://goo.gl/yAr2DU

En la figura se observa que cada nodo tiene un valor, de tipo String (o cadena de caracteres), y un
enlace al siguiente. El último elemento se enlaza al valor conocido como NULL, que corresponde a
una referencia a nada.

En PHP, la implementación de un nodo sería por ejemplo:

Se puede observar en el código que el nodo tiene un elemento, que es un objeto genérico, y un
campo siguiente, que puede ser NULL (para el caso del nodo final) u otro NodoLista.

Las listas presentan ciertas ventajas en comparación con los arreglos. Por ejemplo, si se tiene el
siguiente arreglo de tamaño 10: [1,2,3,4,5,6,7,8,9] (la décima posición del arreglo está vacía) y se
desea insertar un elemento en la posición 5, primero se tienen que mover todos los elementos del
arreglo hacia la derecha, para liberar el espacio en la posición 5 y finalmente insertar el valor; si el
arreglo es muy grande, esto podría tomar mucho tiempo. En el caso de las listas, la inserción es
más sencilla. Basta con crear el nuevo nodo, buscar dónde se desea insertar, enlazar el nuevo
nodo al siguiente elemento de la lista y el elemento anterior al nuevo nodo. Esto debe hacerse en
este orden, pues si se enlaza el nodo anterior al nuevo nodo primero, se pierde la referencia al
resto de la lista, pues esta se corta.

Ahora bien, volviendo al ejemplo del tren y suponiendo que se quiere enganchar un vagón al
medio con el tren en movimiento. Si se quita el enganche del vagón para enganchar el nuevo
vagón, el resto del tren se pierde. En cambio, si primero se engancha el nuevo vagón al que será su
siguiente vagón y, al final, el vagón anterior a la inserción al vagón nuevo, el tren no se pierde.

7
ESTE DOCUMENTO CONTIENE LA SEMANA 1
Esquemáticamente, es de la siguiente forma:

Fuente: http://goo.gl/W8sJOZ

Primero debe conectarse el nodo B al C y después el A al B para no perder el resto de la estructura.

Para eliminar un elemento es equivalente. En un arreglo se llega al elemento, se elimina y los


demás elementos deben cubrir el espacio vacío “moviéndose” uno a uno hacia la izquierda,
dejando un espacio vacío al final. Por esto se dice que una implementación de listas con arreglos
no es eficiente.

Con la implementación hecha en base a nodos, la eliminación es mucho más simple: se busca
secuencialmente el elemento que se desea eliminar y se cambia el enlace que lo apuntaba al
elemento siguiente, como se muestra en la siguiente figura:

Fuente: http://goo.gl/1r0bLq

Una de las desventajas de las listas enlazadas implementadas con nodos, es la dificultad para
volver a un nodo anterior; al poseer solamente enlaces al siguiente elemento, es necesario volver
a recorrer toda la lista desde el principio. Para solucionar esto, surgen las listas doblemente
enlazadas, que son equivalentes a las listas enlazadas pero además tienen un enlace al nodo
anterior, permitiendo el acceso a nodos anteriores, es decir, un desplazamiento en ambos
sentidos.

8
ESTE DOCUMENTO CONTIENE LA SEMANA 1
Esquemáticamente, son de la siguiente manera:

Fuente: https://goo.gl/z2oaio

Notar que tanto el primer como el último elemento apuntan a NULL (antes del primer elemento y
después del último elemento no existen más elementos, naturalmente). Si al primer elemento de
la lista se le asigna el último elemento como “anterior” y al último elemento se le asigna el
primero como “siguiente”, se crea una estructura llamada lista circular, como muestra la siguiente
figura:

Fuente: https://goo.gl/MlTcw2

La implementación de la lista doblemente enlazada en PHP es similar a la del NodoLista antes


mostrada:

9
ESTE DOCUMENTO CONTIENE LA SEMANA 1
La inserción y eliminación también son equivalentes, solamente basta con cambiar las referencias.
Para agregar un nodo, se ubica la posición deseada, se cambia la referencia “anterior” del nodo
siguiente para apuntar al nuevo nodo y después la referencia “siguiente” del nodo anterior para
que apunte al nodo que se está agregando. Finalmente, al actualizar las referencias “anterior” y
“siguiente” del nuevo nodo, como muestra la siguiente figura:

Fuente: http://goo.gl/Q1VwLS

Para la eliminación de un nodo, el proceso es equivalente:

Fuente: http://goo.gl/cETqjG

10
ESTE DOCUMENTO CONTIENE LA SEMANA 1
2.2. COLAS
Las colas son estructuras de datos que pueden parecer mucho más familiares para las personas,
dado que es posible encontrar este comportamiento en la vida real, como en las colas del banco o
el supermercado.

Lo que hace diferente una cola de una lista es el orden en que los nodos entran y salen de ella, al
igual que la cola del banco, los elementos entran por el final de la cola y salen por el principio, para
ser utilizados o atendidos. Todas las estructuras que responden a este tipo de mecánica son
conocidas como FIFO (First In, First Out, por su sigla en inglés que en español es “primero en
entrar, primero en salir”). Esta característica obliga y asegura que los elementos sean procesados
en el orden en que fueron insertados en la cola. Gráficamente, las colas pueden ser vistas de la
siguiente manera:

Fuente: http://goo.gl/DoP7lK

Como todas las estructuras de datos, las colas poseen operaciones que permiten interactuar con
ellas, como, por ejemplo:

 Count: retorna la cantidad de elementos que existen en la cola.

 Print: imprime los elementos de la cola.

 Add: agrega un elemento a la cola (al final de ella).

 Remove: saca un elemento de la cola (el primer elemento).

 IsEmpty: retorna true si la cola está vacía y false, si no.

Existen muchas maneras de implementar una cola, la más rápida es utilizando arreglos, pero se
conservan sus restricciones: la cola no puede crecer más allá del tamaño del arreglo y, al momento
de sacar un elemento de ella, se deben mover todos los otros elementos uno a uno hasta que
quede uno en la posición de salida. Una forma de no hacer el desplazamiento de elementos del
arreglo, es implementar la cola utilizando un arreglo circular donde el elemento que sigue al

11
ESTE DOCUMENTO CONTIENE LA SEMANA 1
último elemento del arreglo es el primero. Para hacer este cálculo se necesita utilizar el operador
módulo (%) con la siguiente fórmula:

Un arreglo circular podría visualizarse de la siguiente manera:

Fuente: https://goo.gl/3yF6h3

La forma más simple de trabajar con una cola es implementándola con una lista, ya que las listas
se comportan naturalmente como colas. El lugar por donde se insertan y eliminan elementos es
siempre el mismo, así que no se deben programar funciones o métodos complejos para insertar o
eliminar elementos en la mitad de la cola.

2.3. PILAS
Al igual que las colas, las pilas también son observables en la vida diaria, como una pila de platos
en la cocina o una pila de papeles en el escritorio. Todos estos tienen en común el hecho de que
siempre se debe comenzar a trabajar con el elemento ubicado en la parte superior de la pila, para
evitar que el resto de los objetos que existen en ella caigan.

A estas estructuras se les conocen como LIFO (Last In, First Out o “último en entrar, primero en
salir”).

12
ESTE DOCUMENTO CONTIENE LA SEMANA 1
Gráficamente, el comportamiento de una pila es:

Fuente: http://goo.gl/xMXJNd

Las operaciones básicas de una pila son:

 Count: retorna la cantidad de elementos que existen en la cola.

 Print: imprime los elementos de la cola.

 Push: agrega un elemento al tope de la pila.

 Pop: saca un elemento de la pila (el primer elemento).

 IsEmpty: retorna si la pila está vacía o no.

 Peek: indica cuál es el valor del primer elemento de la pila (sin sacarlo).

Al igual que con las colas, también puede implementarse una pila utilizando arreglos, pero tiene
las mismas restricciones de espacio que se expusieron en el caso de las colas y, para mayor
facilidad de uso, debe implementarse también la operación llamada IsFull, que retorna si la pila
está llena o puede ponerse un nuevo elemento en ella. Una forma más eficiente de implementar
una pila, es con listas doblemente enlazadas, ya que se tiene información de los elementos
anteriores (más abajo de la pila) y siguientes (más arriba de la pila).

13
ESTE DOCUMENTO CONTIENE LA SEMANA 1
COMENTARIO FINAL
Esta semana se trató de reconocer algunas de las estructuras de datos más utilizadas para la
solución de problemas en las ciencias de la computación. Es muy frecuente encontrar problemas
que necesariamente se deben solucionar utilizando algunas de estas estructuras y se debe ser
capaz de reconocerlas para aplicar algún algoritmo sobre ellas.

Cada una de estas estructuras es idónea para cierto tipo de problemas. En caso de que el orden de
ingreso de los elementos sea importante para su procesamiento, lo ideal es utilizar colas, ya que
los elementos se remueven en el mismo orden en que fueron ingresados.

Las pilas son empleadas cuando el elemento a utilizarse es el último que entró a la estructura,
como las calculadoras en notación polaca o la estructura que sigue la memoria del computador o
cómo la CPU accede a registros dentro de ella.

Las listas son útiles cuando no se sabe a priori el tamaño del conjunto con el que se está
trabajando y las listas doblemente enlazadas permiten tener un poco más de libertad para
moverse sobre ese conjunto.

Es importante recordar que todas estas estructuras pueden ser implementadas con arreglos, pero
a largo plazo puede que no sea del todo sustentable, dado que el tamaño de los arreglos es fijo y
hacerlos crecer y desplazar elementos dentro de él no es una operación barata en tiempos de
proceso.

14
ESTE DOCUMENTO CONTIENE LA SEMANA 1
REFERENCIAS
Aho, A., Hopcroft, J. y Ullman, J. (1998). Estructuras de datos y algoritmos. 1.ª edición en español.

México: Pearson Educación.

Bentley, J. L. (1986). Programming Pearls. 1.ª edición. Massachusetts: Addison-Wesley.

PARA REFERENCIAR ESTE DOCUMENTO, CONSIDERE:

IACC (2016). Estructuras de datos. Análisis de Algoritmos. Semana 1.

15
ESTE DOCUMENTO CONTIENE LA SEMANA 1
16
ESTE DOCUMENTO CONTIENE LA SEMANA 1

Вам также может понравиться