En informática , una cola es un tipo de dato abstracto que sirve como una colección ordenada de entidades. Por convención, el extremo de la cola donde se agregan elementos se llama cola o final de la cola. El extremo de la cola donde se eliminan elementos se llama cabeza o frente de la cola. El nombre cola es una analogía de las palabras que se usan para describir a las personas que hacen fila para esperar bienes o servicios. Admite dos operaciones principales.
- Enqueue, que agrega un elemento al final de la cola.
- Dequeue, que elimina un elemento del principio de la cola.
También se pueden permitir otras operaciones, que a menudo incluyen una operación de lectura o de visualización frontal que devuelve el valor del siguiente elemento que se va a extraer de la cola sin extraerlo.
Las operaciones de una cola la convierten en una estructura de datos de tipo primero en entrar, primero en salir (FIFO), ya que el primer elemento que se añade a la cola es el primero en ser eliminado. Esto equivale al requisito de que, una vez añadido un nuevo elemento, todos los elementos que se añadieron anteriormente deben eliminarse antes de que se pueda eliminar el nuevo elemento. Una cola es un ejemplo de estructura de datos lineal o, de forma más abstracta, de colección secuencial. Las colas son comunes en los programas informáticos, donde se implementan como estructuras de datos acopladas a rutinas de acceso, como una estructura de datos abstracta o, en lenguajes orientados a objetos, como clases. Una cola puede implementarse como búferes circulares y listas enlazadas , o utilizando tanto el puntero de pila como el puntero base.
Las colas prestan servicios en informática , transporte e investigación operativa, donde se almacenan y retienen diversas entidades, como datos, objetos, personas o eventos, para su posterior procesamiento. En estos contextos, la cola funciona como un búfer . Otro uso de las colas es en la implementación de la búsqueda en amplitud .
Implementación de cola
En teoría, una característica de una cola es que no tiene una capacidad específica. Independientemente de cuántos elementos contenga, siempre se puede añadir uno nuevo. También puede estar vacía, en cuyo caso será imposible eliminar un elemento hasta que se haya añadido otro.
Los arreglos de longitud fija tienen una capacidad limitada, pero no es cierto que los elementos deban copiarse hacia el principio de la cola. El sencillo truco de convertir el arreglo en un círculo cerrado y dejar que la cabeza y la cola se muevan indefinidamente dentro de ese círculo hace innecesario mover los elementos almacenados en el arreglo. Si n es el tamaño del arreglo, entonces calcular los índices módulo n lo convertirá en un círculo. Esta sigue siendo la forma conceptualmente más simple de construir una cola en un lenguaje de alto nivel , pero ciertamente ralentiza un poco las cosas, porque los índices del arreglo deben compararse con cero y el tamaño del arreglo, lo que es comparable al tiempo que se tarda en comprobar si un índice del arreglo está fuera de los límites, algo que algunos lenguajes hacen, pero este será sin duda el método preferido para una implementación rápida y sencilla, o para cualquier lenguaje de alto nivel que no tenga sintaxis de punteros. El tamaño del arreglo debe declararse de antemano, pero algunas implementaciones simplemente duplican el tamaño declarado del arreglo cuando se produce un desbordamiento. La mayoría de los lenguajes modernos con objetos o punteros pueden implementar o incluyen bibliotecas para listas dinámicas. Es posible que dichas estructuras de datos no especifiquen un límite de capacidad fijo, además de las restricciones de memoria. El desbordamiento de la cola se produce al intentar añadir un elemento a una cola llena, y el subdesbordamiento de la cola ocurre al intentar eliminar un elemento de una cola vacía.
Una cola limitada es una cola restringida a un número fijo de elementos. [ 1 ]
Existen varias implementaciones eficientes de colas FIFO. Una implementación eficiente es aquella que puede realizar las operaciones (encolar y desencolar) en tiempo O(1) .
- Lista enlazada
- Una lista doblemente enlazada tiene una complejidad de inserción y eliminación de O(1) en ambos extremos, por lo que es una opción natural para las colas.
- Una lista enlazada simple convencional solo permite la inserción y eliminación eficiente de elementos en un extremo. Sin embargo, una pequeña modificación —mantener un puntero al último nodo además del primero— le permitirá implementar una cola eficiente.
- Una cola doble implementada mediante un arreglo dinámico modificado
Colas y lenguajes de programación
Las colas pueden implementarse como un tipo de dato separado, o tal vez considerarse un caso especial de una cola de doble extremo (deque) y no implementarse por separado. Por ejemplo, Perl y Ruby permiten insertar y extraer elementos de un array desde ambos extremos, por lo que se pueden usar las funciones push y shift para insertar y extraer elementos de una lista (o, a la inversa, se pueden usar unshift y pop ), [ 2 ] aunque en algunos casos estas operaciones no son eficientes.
La biblioteca de plantillas estándar de C++ proporciona una queueclase con plantilla " " que está restringida solo a operaciones push/pop. Desde J2SE5.0, la biblioteca de Java contiene una Queueinterfaz que especifica operaciones de cola; las clases que la implementan incluyen LinkedListy (desde J2SE 1.6) ArrayDeque. PHP tiene una clase SplQueue y bibliotecas de terceros como beanstalk'd y Gearman .
![]()
Ejemplo
Una cola sencilla implementada en TypeScript :
clase Cola < T > { elementos privados : T [] = [];enqueue ( elemento : T ) : void { this . items . push ( elemento ); }dequeue ( ) : T | indefinido { return this.items.shift ( ) ; }isEmpty ( ) : boolean { return this.items.length === 0 ; } }Implementación puramente funcional
Las colas también pueden implementarse como una estructura de datos puramente funcional . [ 3 ] Hay dos implementaciones. La primera solo lograpor operación en promedio . Es decir, el tiempo amortizado espero las operaciones individuales pueden tomardonde n es el número de elementos en la cola. La segunda implementación se llama cola en tiempo real [ 4 ] y permite que la cola sea persistente con operaciones en tiempo O(1) en el peor de los casos. Es una implementación más compleja y requiere listas perezosas con memorización .
Cola amortizada
Los datos de esta cola se almacenan en dos listas enlazadas simples llamadasyLa listaocupa la parte delantera de la cola. La listacontiene los elementos restantes (también conocidos como el final de la cola) en orden inverso . Es fácil insertar en el frente de la cola agregando un nodo al principio de la misma.. Y, sino está vacío, es fácil eliminarlo del final de la cola eliminando el nodo que está al principio de. Cuandoestá vacía, la listase revierte y se asigna ay luego el jefe dese elimina.
La inserción ("enqueue") siempre tomatiempo. La eliminación ("dequeue") llevacuando la listano está vacío. Cuandoestá vacío, el reverso tomadóndees el número de elementos enPero podemos decir que estiempo amortizado , porque cada elemento enTuvo que ser insertado y podemos asignar un costo constante para cada elemento en orden inverso al momento en que fue insertado.
Cola en tiempo real
La cola en tiempo real logratiempo para todas las operaciones, sin amortización. Esta discusión será técnica, así que recuerde que, parauna lista,denota su longitud, que NIL representa una lista vacía yrepresenta la lista cuya cabeza es h y cuya cola es t .
La estructura de datos utilizada para implementar nuestras colas consta de tres listas enlazadas simples.donde f es el frente de la cola y r es el final de la cola en orden inverso. El invariante de la estructura es que s es el final de f sin suprimeros elementos, es decir. La colaes entonces casiy insertando un elemento x aes casiSe dice casi, porque en ambos resultados,Una función auxiliarEntonces debe llamarse para que se satisfaga el invariante. Deben considerarse dos casos, dependiendo de sies la lista vacía, en cuyo casoo no. La definición formal esydóndees f seguido de r invertido.
Permítanos llamarla función que devuelve f seguida de r invertida. Supongamos además que, puesto que es el caso cuando se llama a esta función. Más precisamente, definimos una función perezosa.que toma como entrada tres listas tales quey devuelve la concatenación de f , de r invertida y de a . Entonces. La definición inductiva de rotar esySu tiempo de ejecución es, pero, dado que se utiliza la evaluación perezosa, el cálculo se retrasa hasta que los resultados se ven forzados por el cálculo.
La lista s en la estructura de datos tiene dos propósitos. Esta lista sirve como contador para, en efecto,si y solo si s es la lista vacía. Este contador nos permite asegurar que la parte posterior nunca sea más larga que la parte frontal. Además, usar s , que es una cola de f , fuerza el cálculo de una parte de la lista (perezosa) f durante cada operación de cola e inserción . Por lo tanto, cuandoLa lista f es totalmente forzada. Si no fuera así, la representación interna de f podría ser una especie de concatenación de concatenaciones de... de concatenaciones, y forzarla ya no sería una operación de tiempo constante.
Véase también
- Bucle de eventos : los eventos se almacenan en una cola.
- Cola de mensajes
- Cola de prioridad
- teoría de colas
- Pila (tipo de dato abstracto) : lo "opuesto" a una cola: LIFO (último en entrar, primero en salir).
Referencias
- ↑ "Cola (Plataforma Java SE 7)" . Docs.oracle.com. 26 de marzo de 2014. Consultado el 22 de mayo de 2014 .
- ↑ "Matriz de clases" .
- ↑ Okasaki, Chris. "Estructuras de datos puramente funcionales" (PDF) . Archivado del original (PDF) el 7 de diciembre de 2023. Consultado el 19 de abril de 2022 .
- ↑ Hood, Robert; Melville, Robert (noviembre de 1981). "Operaciones de cola en tiempo real en Lisp puro". Information Processing Letters . 13 (2): 50– 54. doi : 10.1016/0020-0190(81)90030-2 . hdl : 1813/6273 .
Referencias generales
Este artículo incorpora material de dominio público de Paul E. Black. "Cola acotada" . Diccionario de algoritmos y estructuras de datos . NIST .
Lecturas adicionales
- Knuth, Donald (1997). «§2.2.1: Pilas, colas y decolas». El arte de la programación informática . Vol. 1: Algoritmos fundamentales (3.ª ed.). Addison-Wesley. pp. 238–243 . ISBN 0-201-89683-4.
- Cormen, Thomas H.; Leiserson , Charles E.; Rivest , Ronald L .; Stein, Clifford (2001). «§10.1: Pilas y colas». Introducción a los algoritmos (2.ª ed.). MIT Press y McGraw-Hill. págs. 200-204 . ISBN 0-262-03293-7.
- Ford, William; Topp, William (2002). «8. Colas y colas de prioridad». Estructuras de datos con C++ y STL (2.ª ed.). Prentice Hall. págs. 386–390 . ISBN 0-13-085850-1.
- Drozdek, Adam (2005). "4. Pilas y colas". Estructuras de datos y algoritmos en C++ (3.ª ed.). Thomson Course Technology. págs. 137–169 . ISBN 978-0-534-49182-6.
Enlaces externos
- Referencia rápida de STL
- Implementación en VBScript de pila, cola, doble cola y árbol rojo-negro
- Tipos de datos abstractos