Estructura de Datos Edición N° 1/ julio 2021
Revista Informativa
Estructura de Datos
Algoritmos en memoria estática
LA COLA
Distribución Gratuita
CONTENIDO Las estructuras de datos
dinámicas son extremadamente flexibles, de allí que son muy utilizadas para el almacenamiento de datos que cambian constantemente. Es muy fácil al momento de añadir información, y la modificación de esta también. De allí, que este tema lo analizaremos especialmente considerando las colas.
ESTRUCTURA DE DATOS Revista Informativa
Director:
Estructura de Datos
4
Cola
Algoritmos en Memoria Estática
Cola Lineal
8 9
Cola Circular
Anillos
11 Algoritmos
12
Carlos E. López S.
Producción Fotográfica: www.google.com.ve
Portada: UDACITY Programación y Desarrollo
7
Cola Lineal Vs Circular
13
Te c n o l o g í a De la Ciencia de la Computación
Estructuras de
4
E
n ciencias de la computación, una estructura de datos es una forma particular
de organizar datos en una computadora para que puedan ser utilizados de manera eficiente. Diferentes tipos de estructuras de datos son adecuados para diferentes tipos de aplicaciones, y algunos son altamente especializados para tareas específicas.
Las estructuras de datos se basan generalmente en la capacidad de un ordenador para recuperar y almacenar datos en cualquier lugar de su memoria. Las estructuras de datos pueden ser de diferentes tipos, dependiendo de la técnica que se utilice para su almacenamiento y recuperación, estos tipos son los siguientes: • Estructura de datos estática. • Estructura de datos dinámica. Según la secuencia que se presenta entre cada elemento al momento de realizar el recorrido entre los elementos de la estructura de datos, esta se puede clasificar en los siguientes tipos: • Estructura de datos lineal. • Estructura de datos no lineal.
5
Avenida Francisco de Miranda Punto Fijo – Estado Falcón Telf: 0269 – 247.82.25 / 247.99.94
Algoritmos en Memoria Estática
COLA
Soy el producto de la evolución, que internalizó las propiedades del mundo externo." Rodolfo Llinás
U
na cola es una estructura de datos,
caracterizada por ser una secuencia de elementos en la que la operación de inserción push se realiza por un extremo y la operación de extracción pop por el otro. También se le llama estructura FIFO (del inglés First In First Out), debido a que el primer elemento en entrar será también el primero en salir. Las colas se utilizan en sistemas informáticos, transportes y operaciones de investigación (entre otros), dónde los objetos, personas o eventos son tomados como datos que se almacenan y se guardan mediante colas para su posterior procesamiento. Este tipo de estructura de datos abstracta se implementa en lenguajes orientados a objetos mediante clases, en forma de listas enlazadas.
La particularidad de una estructura de datos de cola es el hecho de que sólo podemos acceder al primer y al último elemento de la estructura. Así mismo, los elementos sólo se pueden eliminar por el principio y sólo se pueden añadir por el final de la cola. Ejemplos de colas en la vida real serían: personas comprando en un supermercado, esperando para entrar a ver un partido de béisbol, esperando en el cine para ver una película, una pequeña peluquería, etc. La idea esencial es que son todos líneas de espera. En estos casos, el primer elemento de la lista realiza su función (pagar comida, pagar entrada para el partido o para el cine) y deja la cola. Este movimiento está representado en la cola por la función pop o desencolar. Cada vez que otro elemento se añade a la lista de espera se añaden al final de la cola representando la función push o encolar. Hay otras funciones auxiliares para ver el tamaño de la cola (size), para ver si está vacía en el caso de que no haya nadie esperando (empty) o para ver el primer elemento de la cola (front).
7
Cola Lineal La inserción se realiza agregando el nuevo elemento en la primera posición libre del heap, esto es, el próximo nodo que debería aparecer en el recorrido por niveles o, equivalentemente, un casillero que se agrega al final del arreglo. Después de agregar este elemento, la forma del heap se preserva, pero la restricción de orden no tiene por qué cumplirse. Para resolver este problema, si el nuevo elemento es mayor que su padre, se intercambia con él, y ese proceso se repite mientras sea necesario. Una forma de describir esto es diciendo que el nuevo elemento "trepa" en el árbol hasta alcanzar el nivel correcto según su prioridad. ❑ Desencolar (sacar, salir, pop): se elimina el elemento frontal de la cola, es decir, el primer elemento que entró. El máximo evidentemente está en la raíz del árbol (casillero 1 del arreglo). Al sacarlo de ahí, podemos imaginar que ese lugar queda vacante. Para llenarlo, tomamos al último elemento del heap y lo trasladamos al lugar vacante. En caso de que no esté bien ahí de acuerdo a su prioridad (¡que es lo más probable!), lo hacemos descender intercambiándolo siempre con el mayor de sus hijos. Decimos que este elemento "se hunde" hasta su nivel de prioridad.
❑ Frente (consultar, front): se devuelve el elemento frontal de la cola, es decir, el primero elemento que entró.
8
OPERACIONES BÁSICAS
❑ Crear: se crea la cola vacía. ❑ Encolar (añadir, entrar, push): se añade un elemento a la cola. Se añade al final de esta.
COLA CIRCULAR Una cola circular es una variante de la cola lineal que supera eficazmente la limitación de la cola lineal. En la cola circular, el nuevo elemento se agrega en la primera posición de la cola si el último está ocupado y hay espacio disponible. Cuando se trata de cola lineal, la inserción se puede realizar solo desde la parte trasera y la eliminación desde la parte delantera. En una cola completa, después de realizar una serie de eliminaciones sucesivas en la cola, surge una situación determinada en la que no se puede agregar ningún elemento nuevo incluso si el espacio disponible porque la condición de subdesbordamiento (Posterior = máx. La cola circular conecta los dos extremos a través de un puntero donde el primer elemento viene después del último elemento. También realiza un seguimiento de la parte delantera y trasera implementando una lógica adicional para poder rastrear los elementos que se insertarán y eliminarán. Con esto, la cola circular no genera la condición de desbordamiento hasta que la cola está llena en realidad.
Algunas condiciones seguidas por la cola circular: ✓ El frente debe apuntar al primer elemento. ✓ La cola estará vacía si Front = Rear. ✓ Cuando se agrega un nuevo elemento, la cola se incrementa en el valor uno (Posterior = Posterior + 1). ✓ Cuando se elimina un elemento de la cola, el anverso se incrementa en uno (Anverso = Anverso + 1).
Este tipo de estructura obliga a dejar siempre una posición libre para separar el principio del final, pero evidentemente siempre existirá la limitación de que podrá llenarse completamente la cola.
9
Operaciones Básicas de la
COLA CIRCULAR Colas circulares (anillos):
En las que el último elemento y el primero
están unidos. Los elementos pueden consultarse, añadirse y eliminarse únicamente desde la cabeza del anillo que es una posición distinguida. Existen dos operaciones de rotaciones, una en cada sentido, de manera que la cabeza del anillo pasa a ser el elemento sucesor, o el predecesor, respectivamente, de la cabeza actual.
Anillo en Maude fmod ANILLO {X :: TRIV} is sorts AnilloNV{X} Anillo{X} . subsort AnilloNV{X} < Anillo{X} . Int num; If(vacía()) No funcia code op crear : -> Anillo{X} [ctor] . op insertar : X$Elt Anillo{X} -> AnilloNV {X} [ctor] . -> Anillo{X} . ops rotarDch rotarIzq : Anillo{X} -> Anillo{X} . op cabeza : AnilloNV{X} -> X$Elt . op esVacio? : Anillo{X} -> Bool . op aLaCola : X$Elt Anillo{X} -> Anillo{X} . op elimCola : Anillo{X} -> Anillo{X} . op cola : AnilloNV {X} -> X$Elt . var A : Anillo{X} . vars E E2 : X$Elt . eq eliminar(crear) = crear . eq eliminar(insertar(E, A)) = A . eq cabeza(insertar(E, A)) = E . eq esVacio?(crear) = true . eq esVacio?(insertar(E, A)) = false . eq cola(insertar(E, crear)) = E . eq cola(insertar(E, insertar(E2, A))) = cola(insertar(E2, A)) . eq elimCola(crear) = crear . eq elimCola(insertar(E, crear)) = crear . eq elimCola(insertar(E, insertar(E2, A))) = insertar(E, elimCola(insertar(E2, A))) . eq aLaCola(E, crear) = insertar(E, crear) . eq aLaCola(E, insertar(E2, A)) = insertar(E2, aLaCola(E, A)) .
10
eq rotarDch(crear) = crear . eq rotarDch(insertar(E, A)) = aLaCola(E, A) .
ANILLOS en Pseudolenguaje FUNC CrearCola() : TCola VARIABLES cola: TCola INICIO cola.frente <- MAXCOLA cola.final <- MAXCOLA RESULTADO <- cola FIN PROC DestruirCola(&cola: TCola) INICIO //Sin modificaciones FIN FUNC ColaLlena(cola: TCola): LÓGICO INICIO RESULTADO <- (cola.final MOD MAXCOLA) + 1 = cola.frente FIN FUNC ColaVacia(cola: TCola): LÓGICO INICIO RESULTADO <- cola.final = cola.frente FIN PROC MeterCola (&cola: TCola; &e: Telemento; &error: Terror) VARIABLES fin: NATURAL INICIO SI ColaLlena(cola) ENTONCES error <- ErrorColaLlena EN OTRO CASO error <- NoError fin <- (cola.final MOD MAXCOLA) + 1 cola.final <- fin cola.elementos[fin] <- e FINSI FIN PROC SacarCola (&cola: TCola; &e: Telemento; &error: Terror) VARIABLES ini: NATURAL INICIO SI ColaVacia(cola) ENTONCES error <- ErrorColaLlena EN OTRO CASO error <- NoError ini <- (cola.frente MOD MAXCOLA) + 1 cola.frente <- ini e <- cola.elementos[ini] FINSI FIN
11
Algoritmos Insertar un elemento en la cola
Extraer un elemento de la cola
12
La notación di+1 -> di significa que el elemento situado en la posición i+1 debe ser copiado a la posición i. Esto es lo que ocurre en la vida cotidiana, en concreto, cuando una persona ha acabado su gestión en la ventanilla y la abandona, los demás deben moverse hacia adelante, es decir, el segundo pasa a ser el primero, el tercero al segundo y así sucesivamente. Para una cola pequeña, este algoritmo es sencillo y eficaz, pero cuando la cola es grande, el corrimiento de datos puede suponer un gasto de tiempo que enlentece el programa, razón por la cual, mostramos a continuación otro procedimiento mucho mejor para evitar este problema.
Cola lineal Vs. circular
DIFERENCIAS ❑ La cola lineal es una lista ordenada en la que los elementos de datos se organizan en orden secuencial. ❑ La cola lineal sigue el orden FIFO para ejecutar la tarea (el elemento agregado en la primera posición se eliminará en la primera posición). ❑ La inserción y eliminación de los elementos se fija en la cola lineal, es decir, la adición desde la parte posterior y la eliminación desde la parte frontal.
❑ La cola circular almacena los datos de forma circular. ❑ En la cola circular, el orden de las operaciones realizadas en un elemento puede cambiar. De manera que, organiza los datos en el patrón circular donde el último elemento está conectado al primer elemento. ❑ La cola circular es capaz de insertar y eliminar el elemento desde cualquier punto hasta que esté desocupado.
❑ La cola lineal desperdicia el espacio de la memoria.
❑ La cola circular hace que el espacio sea eficiente.
❑ Es ineficiente.
❑ Tiene mejor funcionamiento.
EN LA VIDA COTIDIANA Se puede aplicar en problemas relacionados con redes de teléfonos, aeropuertos, puertos, centros de cálculo, supermercados, venta mediante máquinas, hospitales, gasolineras... A lo largo del tiempo se producen llegadas de clientes a la cola de un sistema desde una determinada fuente demandando un servicio.
APLICACIONES
13