Tema4 PC
Tema4 PC
Tema4 PC
Estructuras de datos
Índice
Esquema 3
Ideas clave 4
4.1. Introducción y objetivos 4
4.2. Arrays y listas 7
4.3. Pilas y colas 13
4.4. Tablas hash 16
4.5. Grafos 18
© Universidad Internacional de La Rioja (UNIR)
4.6. Árboles 21
4.7. Montículos 25
4.8. Referencias bibliográficas 28
4.9. Cuaderno de ejercicios 29
A fondo 36
Test 37
Esquema
© Universidad Internacional de La Rioja (UNIR)
Estas formas de conceptualización con un nivel de abstracción mayor son los tipos
abstractos de datos (TAD). Se puede decir que un tipo abstracto de datos se necesita
para establecer el tipo de los elementos que lo componen, las operaciones de
© Universidad Internacional de La Rioja (UNIR)
Las formas de definir los TAD son variados. Lo importante es poder separar la
especificación de la implementación, es decir, el uso de un TAD no debe depender
Por tanto, para usar un TAD es suficiente con conocer su interfaz, esto es, su nombre
y los nombres y parámetros de sus operaciones.
En Python todos los objetos son manejados con referencias. Por tanto, asignar un
objeto a otro es equivalente a que dos variables de objetos son accesibles mediante
la misma referencia. Esto implica que los cambios que se hagan en un objeto se
realizan también en el otro. La comprobación de si dos objetos son iguales debería,
así mismo, realizarse de forma que se hagan comprobaciones en profundidad, es
decir, se compruebe el contenido no la referencia.
La asignación de variables objeto tiene como efecto que las dos variables
referencian al mismo objeto.
Arrays
© Universidad Internacional de La Rioja (UNIR)
Algunos lenguajes, como Ada, permiten la indexación mediante tipos discretos como
el tipo carácter.
Para trabajar con vectores en Python se cuenta con la biblioteca array o bien con los
del módulo Numpy. Nosotros veremos la primera opción, que presenta algunas
limitaciones.
Un objeto de esta clase solo puede contener datos del mismo tipo, que deben ser
numéricos o datos primitivos de tamaño fijo. El tipo de datos se debe especificar en
el momento de la creación del array, mediante un código, los cuales se muestran en
la Tabla 1.
© Universidad Internacional de La Rioja (UNIR)
Ernesto Rico Schmidt muestra en su página ejemplos del uso de array en Python.
Listas
Una lista es una colección de elementos del mismo tipo dispuestos en un cierto
orden. El número de elementos de la lista no está determinado.
Operaciones de consulta:
• Comprobar si la lista está vacía.
• Comprobar si existe un elemento.
• Consultar el primer elemento.
• Consultar el último elemento.
• Obtener el siguiente y el anterior de un elemento.
• Longitud de la lista.
© Universidad Internacional de La Rioja (UNIR)
Operaciones de inserción:
• Se puede insertar al principio o al final.
• Insertar en una posición.
Operaciones de eliminación:
Implementación en Python
En Python se cuenta con la clase list que por su implementación permite todas las
operaciones indicadas.
Python permite que las listas tengan elementos de distinto tipo, algo que va contra
la filosofía del tipo abstracto que se quiere implementar. Por tanto, en la creación de
las listas se deberá especificar el tipo de los elementos que se van a crear,
impidiendo que se cree una lista heterogénea.
Operaciones de consulta:
• Obtener cima de la pila, el último elemento que entró.
• Comprobar si la pila está vacía.
Implementación en Python
Nuevamente se va a utilizar una lista para implementar una pila, pero nuevamente
se van a restringir las operaciones de acuerdo con la semántica del tipo.
Operaciones de consulta:
• Obtener primer elemento de la cola.
Operaciones de modificación:
• Encolar: inserta un elemento al final de la cola.
• Desencolar: elimina el primer elemento de la cola y además obtiene su valor.
Implementación en Python
Nuevamente se va a utilizar una lista para implementar una cola, pero como en el
caso anterior, se van a restringir las operaciones de acuerdo con la semántica del tipo.
La definición del TAD que se va a implementar, va a separar la implementación de la
especificación, ocultando la estructura subyacente y las funciones definidas para ella
y manejando los datos como se espera de un TAD lista.
Una tabla hash es una estructura de datos para almacenar un gran número de datos,
un contenedor asociativo tipo diccionario. Estas ofrecen operaciones de búsqueda
muy eficientes.
clave con una función en su hash que, básicamente, es el número que identifica la
posición donde la tabla localiza el valor deseado.
Los diccionarios de Python se comportan como tablas hash y, por ello, los tipos de
datos que pueden usarse como clave tienen que ser tipos de los que se pueda
obtener su código hash, que en definitiva es su representación unívoca.
Los tipos de datos de Python de los que se puede obtener un hash son los datos de
tipo str, float, int o bool.
Las operaciones con las que debe contar, como mínimo, una de estas tablas son las
siguientes:
Implementación en Python
Sin embargo, siguiendo la filosofía de todo el tema y para ocultar los detalles de
implementación, se podría implementar un TAD Tabla Hash e, incluso, dotarlo de más
funciones.
Figura 10. Implementación del TAD Tabla Hash. Fuente: elaboración propia.
4.5. Grafos
por aristas. Los grafos pueden ser dirigidos, si las aristas logran ser representadas por
flechas que indican la dirección del enlace o no dirigidos. Las secuencias de aristas
forman caminos entre nodos con ciclos o no.
La estructura del grafo estará formada por una lista de los nodos con su información
y una matriz de adyacencia cuadrada con valores lógicos, en la que cada elemento
[i][j] que tenga valor True representa la arista del nodo i al j.
El grafo puede tener peso en las aristas, por lo que la matriz de adyacencia tomaría
otros valores que no sean lógico.
Si el grafo no fuese dirigido, la función que obtenga los conectados debería buscar
en las filas y las columnas.
Se deberían implementar las funciones de copia, __eq__ y __str__ como en los
otros ejemplos.
En este caso, el grafo tendrá la estructura de una matriz en la que cada elemento
contiene el valor y los nodos conectados con él (también se suelen llamar vecinos).
Esta implementación usa menos espacio que la anterior.
Los árboles que se van a tratar en este apartado son los que se conocen como árboles
con raíz, es decir, los que tiene un nodo especial, el raíz. Estos presentan una
organización similar a un árbol jerárquico con la siguiente estructura:
Aunque en la definición no se indica, se considera que las ramas de los árboles con
raíz se encuentran ordenados de izquierda a derecha.
Existen diferentes tipos de árboles con raíz de acuerdo con distintos criterios. Según
el número de hijos que puede tener cada nodo o por las alturas de los subárboles de
cada nodo.
Figura 14. Operaciones que definen a los árboles binarios. Fuente: elaboración propia.
El montículo es un tipo especial de árbol con raíz que se puede implementar con
una matriz. Esta estructura es muy usada e incluso existe un método de ordenación
por montículo. También se aplica para la gestión de colas de prioridad.
Una de las características principales del montículo es que cada uno de sus nodos
tiene un valor que es mayor o igual que los valores de sus hijos. Esta se conoce como
la propiedad del montículo.
Si el árbol tiene una altura k, en esta se encuentra 1 nodo que es, además, la raíz.
En el nivel k-1, habrá dos nodos.
Y, de forma sucesiva, se puede decir que hay 2𝑘 − 1 nodos.
En el nivel 0 habrá al menos uno, pero no más de 2𝑘 .
Otra de las cuestiones que se puede considerar para saber cómo usar el array es que
cada nodo que se encuentre en la posición p, tiene a su hijo izquierdo en la posición
2𝑝 y su hijo derecho en la posición 2𝑝 + 1.
Salcedo, L. (2018, junio 23). Ejemplo de Tabla Hash [Imagen]. Tabla Hash en Python -
Mi Diario Python (pythondiario.com)
© Universidad Internacional de La Rioja (UNIR)
Universidad Don Bosco (s. f.). Programación IV. Guía No. 7. [Guía]. guia-7.pdf
(udb.edu.sv)
Para poder evaluar una expresión en infija primero se pasará la expresión a postfija
y, posteriormente, se evaluará.
Paso a postfija
Figura 19. Código de la función de paso de infija a postfija, uso de la función y resultado. Fuente:
elaboración propia.
Figura 20. Código de la función que evalúa una expresión en postfija, uso y resultado. Fuente:
elaboración propia.
© Universidad Internacional de La Rioja (UNIR)
El elemento que se elimina tiene un único hijo: el hijo del padre del nodo
correspondiente al que se va a eliminar pasará a apuntar al hijo único del elemento
eliminado.
Figura 21. Código de la función que elimina un elemento de un árbol binario ordenado. Fuente:
elaboración propia.
Las colas de prioridad funcionan como una cola para la extracción, dado que se
extraerá siempre el que se encuentra al frente de la misma, pero la ordenación
depende de las prioridades. Por tanto, cada vez que se inserta un elemento en una
cola deberá ser reorganizado para que se coloque en su lugar de acuerdo con su
prioridad. De esta forma, siempre estarán al frente los de máxima prioridad. Esto
recuerda a la forma de trabajarse con un montículo.
Wachenchauzer, R., Manterola, M., Curia, M., Medrano, M. y Paez. N (s. f.). Tipos
abstractos de datos. En Algoritmos de Programación con Python. Autoedición. 16.2.
Tipos abstractos de datos (Algoritmos de Programación con Python) (uniwebsidad.com)
¿Qué son las estructuras de datos y por qué son tan útiles?
Fuentes, J. (18 de octubre de 2019). ¿Qué son las estructuras de datos y por qué son tan
útiles?. Open Webinars. ¿Qué son las estructuras de datos y por qué son útiles? |
OpenWebinars
Estructuras de datos
algunas de ellas.
9. Para implementar un tipo abstracto de datos grafo con información de los nodos
vecinos:
A. Se usa una lista de nodos y la matriz de adyacencia.
B. Se usa una matriz en la que cada elemento contiene el valor del nodo y todos
los nodos conectados con él.
C. Se usa una matriz en la que cada elemento contiene el valor del nodo y su nodo
más cercano.
D. Ninguna de las anteriores es verdadera