¿Qué es una cola prioritaria?

Una cola regular se adhiere a FIFO (primero en entrar, primero en salir). Esto significa que el primer elemento introducido en la cola será el primer elemento que se extraiga de la cola.

Una cola prioritaria es un tipo de datos completamente separado de una cola. No le importa el orden en que se agregan los elementos (salvo para el caso especial de resolver tiebreaks). Cuando pone en cola un elemento, también pone en cola una prioridad asociada a él. Cuando llegue el momento de extraer un elemento, se devolverá el elemento con la prioridad más alta.

Como ejemplo trivial, podemos hacer una cola de prioridad donde el elemento con la prioridad más alta es el que tiene la marca de tiempo más pequeña. Esto sería lo mismo que una cola regular.

Un ejemplo útil real sería utilizar una cola prioritaria en el algoritmo de Dijkstra. En el algoritmo, agrega elementos no procesados ​​completamente a una cola de prioridad, donde la prioridad más alta se define como la distancia más corta.

Para implementar realmente uno, generalmente usaría un montón, que proporciona tiempo logarítmico para inserciones y eliminaciones. ¡Mucho mejor que tener que buscar linealmente en la lista el elemento con mayor prioridad!

Una cola es una estructura de datos que sigue el principio FIFO (Primero en entrar, primero en salir). Esto significa que los artículos salen en el mismo orden en que entraron. Si le das a la Cola un ‘7’, luego un ‘3’, luego un ‘8’, seguido de una ‘manzana’; lo primero que escupe la Cola será el ‘7’ y lo último que escupe será la ‘manzana’. Una línea donde nadie puede cortar delante de la persona que tiene delante es una Cola. Esa es tu cola estándar.

Una cola prioritaria le permite asignar diferentes niveles de prioridad a los elementos colocados en la cola. Si bien el orden en que se insertan los elementos es importante, la prioridad es más importante. En una cola prioritaria, buscamos el elemento con la mayor prioridad dentro de la cola y lo devolvemos. Cuando varios artículos comparten la máxima prioridad, volvemos a un orden de operaciones FIFO para esos artículos. Imagina que eres un Joe normal esperando en la fila del banco; Eres un elemento de baja prioridad. Tienes que esperar a la persona que está frente a ti y él / ella tiene que esperar a la persona que está frente a ellos. Bill Gates entra al banco; sabes que va directo al frente de la línea. Esa es una cola prioritaria.

Como se explica en otras respuestas, la cola es una estructura de datos FIFO (primero en entrar, primero en salir), es decir, quién solicita primero será atendido primero. (cola en el templo, cola en el desorden de la oficina para el almuerzo, etc., etc.)

La cola de prioridad es la estructura de datos donde cada elemento tiene una prioridad asignada. los elementos con mayor prioridad se servirán primero independientemente de cuándo llegaron a la cola.

Creo que esto es parte teórica de la historia. La pregunta que nos molesta es por qué existe tal estructura de datos. ¿Cuáles son sus aplicaciones? cuando usamos esto?

Esta es una estructura de datos muy importante en los sistemas operativos, especialmente en el sistema operativo en tiempo real.

Piense en alguna aplicación en tiempo real, por ejemplo, si está diseñando un sistema operativo para un vuelo en avión. Puede atender varias solicitudes, por ejemplo, hacer anuncios, pronosticar el tiempo, cuánto combustible queda, registros diarios / por hora, informar de algún problema grave como que el motor dejó de funcionar, encontró alguna tropa enemiga, alarmante si el combustible es inferior al umbral mínimo, etc.

Aquí, los registros diarios / por hora, el pronóstico del tiempo, el control de combustible restante, etc., son tareas periódicas, es decir, llegaron después de un período de tiempo definido / determinado (trabajo regular), pero informar sobre problemas graves es impredecible (tales tareas / solicitudes se denominan tareas esporádicas) y usted No puede simplemente ignorarlos. cuando tales solicitudes se envían al sistema, deben procesarse de inmediato.

uno puede administrar si el informe diario / por hora se retrasa pero no al revés. Existe una posibilidad más de que muchas de estas solicitudes severas lleguen al mismo tiempo, por lo que el sistema operativo / sistema debería ser lo suficientemente inteligente como para decidir cuál tomar primero. Por lo tanto, cada tarea tiene una prioridad predefinida adjunta para que las tareas de mayor prioridad puedan ser atendidas primero por el sistema.

Una cola , también llamada lista vinculada , es (típicamente, pero no necesariamente) una serie de estructuras de memoria (a menudo algún tipo de bloque de control ) vinculadas por punteros (direcciones) que forman parte de las estructuras vinculadas. Una cola (lista) sin elementos vinculados es una cola vacía (lista).

Nota sobre la notación: en los siguientes ejemplos / imágenes, un “gancho” significa una celda de memoria, un “cubo” que cuelga de un gancho significa que la celda de memoria contiene algún tipo de valor y una ” etiqueta de dirección ” que cuelga de un gancho significa que la celda de memoria contiene un puntero (una dirección de memoria).

Las colas suelen estar “ancladas” (por lo tanto, los símbolos de “anclaje” en estas imágenes) en un encabezado de cola , que generalmente se coloca en una ubicación de memoria globalmente conocida, mientras que las estructuras de datos vinculadas pueden ubicarse en cualquier lugar de la memoria :

La estructura de lista más simple es la lista vinculada individualmente , vinculada desde su encabezado, con el último elemento de la lista de alguna manera marcando “final de la lista” (aquí simbolizado por el símbolo “fundamental”). El enlace de listas enlazadas individualmente tiene un solo puntero, la dirección del “siguiente elemento enlazado”. Para encontrar un elemento de lista enlazado individualmente, la lista debe atravesarse desde el encabezado y hacia abajo:

Las listas enlazadas por separado pueden ser engorrosas para trabajar, y generalmente solo se usan para colas simples LIFO ( “Último en entrar , primero en salir” ) (análoga a una memoria “push down, pop up” o pila de registros).

Las listas doblemente enlazadas (también llamadas listas circulares ) son más flexibles, ya que pueden atravesarse desde cualquier extremo: hacia adelante (comenzando con el elemento de cabeza ) o hacia atrás (comenzando con el elemento de cola ). En las listas enlazadas individualmente y doblemente, cuando los punteros de la cabeza y la cola apuntan al encabezado , la lista está vacía (duuh).

La dirección del último elemento de la cola (en el encabezado de la cola, así como en cada estructura en cola) facilita la implementación de las colas FIFO ( “Primero en entrar , Primero en salir” (también conocido como FCFS (” Primero llegado, primero servido “)) .

La mayoría de los sistemas operativos mantienen una importante “cola de prioridad” llamada Lista de tiempos . La implementación puede variar, pero el resultado neto es el mismo: para administrar y realizar un seguimiento de las duraciones de tiempo (algo así como “temporizadores de huevo”: para generar alguna acción después de que haya transcurrido un intervalo de tiempo especificado).

Esto generalmente se realiza en cooperación con un controlador de interrupción de tiempo , que interrumpe el procesador a intervalos regulares, para manipular la lista de tiempo y tomar varias medidas. Los elementos en la lista de tiempo pueden ser cualquier estructura de datos, llamados elementos de lista de tiempo (TLE) mientras están vinculados en la lista.

En la implementación mostrada ( Guardian , el sistema operativo Tandem NonStop (ahora llamado NonStop OS para los servidores HP NonStop )): la unidad de tiempo Guardian se llama ” tick ” (= 0.01 segundo), y se establece el valor ” intervalo de temporizador ” mostrado a cierto número de ticks cuando el temporizador está “configurado” (100 ticks = un segundo). La lista de tiempo está organizada de modo que el intervalo total que cualquier TLE “esperará” es la suma de su propio valor de temporizador y todos los valores de temporizador de TLE antes de que aparezca en la lista (si esto suena complicado (realmente no lo es), la imagen a continuación puede aclarar).

En cada interrupción de tiempo, el controlador de interrupción de tiempo resta el número de tics transcurridos desde la última interrupción de tiempo , del intervalo del temporizador del TLE superior de la lista de tiempos , y si el resultado es cero o negativo, ese TLE se desvincula (se quita el tiempo lista), y el siguiente TLE a su vez se convierte en el TLE superior: luego se toman algunas medidas en nombre del TLE con el “temporizador caducado”, como “despertar” un proceso que espera que el temporizador caduque.

Si se cancela un temporizador antes de su vencimiento, la función del sistema operativo que elimina el TLE de la lista de Tiempo simplemente agrega el valor del depósito del temporizador del TLE vencido al valor del depósito del siguiente TLE, y todo es genial, muy eficiente.

Otra lista prioritaria doblemente vinculada importante , presente de una forma u otra en la mayoría de los sistemas operativos, es la Lista Lista . Las estructuras vinculadas a esta lista suelen ser algún tipo de Bloque de control de proceso (PCB), que representa un programa que ejecuta instrucciones.

La lista Lista está ordenada por un valor de prioridad de proceso (parte de la estructura vinculada), con el proceso de máxima prioridad primero en la lista (en Guardian, la prioridad varía de 0 a 255, con prioridades> 199 reservadas para procesos “privilegiados”) .

Cuando se inicia un proceso por primera vez, se le asigna un valor de prioridad, y cuando el proceso está listo para ejecutarse (por el sistema operativo), se inserta en la lista Listo de acuerdo con esta prioridad, y se invoca el controlador de interrupción Dispatcher (por el sistema operativo).

En cada interrupción del Despachador , lo último que hace el Despachador es cargar los registros de la IPU con los valores guardados, en el momento en que se desactivó el proceso, en la PCB enlazada superior de la lista Listo , luego sale. Esto activa ese proceso (es decir, obtener el control de la IPU, ejecutar las instrucciones del programa).

Cuando (en algún momento posterior) ese proceso necesita esperar algún otro evento ( por ejemplo, la finalización de alguna operación de E / S), la función (privilegiada) WAIT () elimina el PCB de la lista Listo y lo inserta en algunos lista de espera (que puede ser la lista de Tiempo), luego invoca el Despachador , lo que hará que el PCB de la lista Listo ahora superior sea el proceso activo. Y así continúa.

Hay más en las colas y listas que las muestras descritas aquí … Si desea detalles, no dude en descargar mi antiguo curso de GAME ( Guardian Architecture Made Easy ) de mis carpetas de box.com ( GAME (Public). Zip ): sin condiciones , ¡Puse toda la bola de JUEGO en el dominio público cuando me retiré del trabajo en la computadora, hace siete años!

Nota al margen: mi antiguo material GAME todavía está en uso. Es un testimonio de la fuerza y ​​la resistencia de la arquitectura TNS (Tandem NonStop) que su arquitectura de sistema operativo distribuido basado en “Requester-Server” no ha cambiado fundamentalmente desde su inicio en 1974: el hardware ha evolucionado a pasos agigantados (tanto velocidad , capacidad y confiabilidad), pero aparte de muchas funciones agregadas desde entonces, su entorno de software de nivel de aplicación es exactamente el mismo : puede tomar un archivo de objeto antiguo, compilado en y para el antiguo NonStop / I de 1974, y se ejecuta sin problemas: pero mucho más rápido, ¡en la última versión de los sistemas NonStop Server de HP!

En pocas palabras, es una cola autoorganizada que garantiza que el elemento en la parte superior tiene la máxima prioridad (más alta / más baja) entre todos los elementos dentro de la cola de prioridad. Se autoorganiza cuando se le agrega un nuevo elemento, o el elemento con la prioridad más alta se elimina de la cabeza, para traer nuevamente el elemento con la prioridad más alta, de todos los que quedan dentro, nuevamente a la cabeza.

Para obtener información más detallada, consulte cualquier buen libro de estructuras de datos / algoritmos.

PriorityQueue

  • PriorityQueue es una clase de implementación de la interfaz de cola.
  • Almacena objetos en orden ascendente en función de alguna prioridad.
  • Almacena solo elementos homogéneos que son de tipo comparable
  • No permite valores nulos.

PriorityQueue en Java – TechPursue.com

Piense en una cola prioritaria en la programación exactamente igual que una cola prioritaria en un aeropuerto donde el proceso de embarque requiere que las personas se dividan en grupos. El primer grupo se alineará para abordar. Luego, el segundo, etc., etc. Esta agrupación se realiza para evitar que la línea se alargue demasiado y que el proceso ocurra en fases o simplemente para que múltiples asistentes del aeropuerto puedan ayudar al mismo tiempo a acelerar las cosas. Si una persona causa problemas en una línea. Simplemente continúan con la segunda línea para evitar retrasos costosos. Sin embargo, hay una cola prioritaria. Las personas con estatus (dinero) a menudo están en esta línea. Esta línea se abordará primero.

Ahora piense en este concepto en programación. Hay una gran cantidad de tareas (personas) que deben ser atendidas, pero hay una cantidad limitada de recursos del servidor (asistentes del aeropuerto) para procesarlas todas. Para evitar la obstrucción del sistema, el lote de tareas será puesto en cola por un servidor (principalmente un servidor web) en forma de ‘mensajes’. Los otros servidores llamados trabajadores comenzarán a procesar las tareas seleccionándolas una por una de la cola. Si uno de los trabajadores falla, los demás simplemente recogerán el resto. Sin embargo, a veces en grandes colas hay alguna tarea importante que requiere un procesamiento lo antes posible. Estas tareas se colocarán en una cola diferente. Si las tareas están en esa cola, los trabajadores primero procesarán esas tareas y luego continuarán con la cola normal.

Cola prioritaria

Esta es la cola es como una estructura de datos de cola normal, pero a diferencia de la cola normal, los elementos de esta cola tienen cierta prioridad asignada.

Por lo tanto, los elementos en la cola se servirán de acuerdo con sus prioridades.

Espero eso ayude .

En primer lugar, comprendamos el concepto de Queue. Queue es una estructura FiFO. (Ejemplo de la vida real es la cola de reserva de trenes) …

Cuando escuchamos la palabra prioridad, lo primero que viene a su mente es el hospital (donde el paciente más severo es tratado primero antes que otro paciente).

De la misma manera, la cola de prioridad es un tipo especial de cola que da prioridad a cada elemento que contiene. Los elementos se seleccionan de acuerdo con su prioridad (de manera ascendente a descendente).

Aquí hay una lección completa que incluye ejercicios de programación sobre colas prioritarias.

Haga al menos un esfuerzo mínimo para verificar si la pregunta que desea hacer ya está respondida.

¿Qué es una cola prioritaria?
¿Dónde se usa la cola prioritaria?

Cola de prioridad

More Interesting

¿Cuál es el algoritmo de Google Map para recomendar rutas?

Cómo resolver la siguiente recursividad usando el árbol de recursión

¿Hay algún libro sobre estructuras de datos y algoritmos que tenga estructuras de datos diferentes, su complejidad, sus usos y todas las cosas interesantes sobre ellos?

En la tercera edición de 'Introducción a los algoritmos', ¿por qué comprar acciones es un problema de subarrays máximos?

¿Cuáles son los ejemplos del mundo real que puedo usar para ilustrar la recursividad de mi clase de introducción CS?

Imprimí un libro electrónico con 600 páginas. El montón se cayó y ahora tengo que organizarlas en el orden de los números de página. ¿Cuál es la mejor manera de hacerlo?

¿El mismo algoritmo pertenece a algo, incluyendo política, mecánica cuántica, arte, deportes e ingeniería?

¿Cuáles son los algoritmos que se pueden usar en R para la predicción de datos categóricos?

¿Cuál es el método computacionalmente más eficiente para agregar todos los elementos de una matriz (o matriz)?

Cómo encontrar la tasa de ganancia más efectiva con la menor cantidad de coincidencias posible (algoritmo)

¿Está bien mi implementación de Búsqueda ternaria?

¿Cuál es la diferencia entre el problema del vendedor ambulante y el problema del árbol de expansión mínima?

¿Qué métodos matemáticos se utilizan para rastrear el efecto de mercado de los algoritmos comerciales de alta frecuencia?

Además de la complejidad de tiempo y espacio, ¿qué otras métricas de rendimiento deben tenerse en cuenta al medir el rendimiento de un algoritmo?

¿Cuál es el mejor método para aprender efectivamente ciencia de datos / aprendizaje automático desde cero para un estudiante promedio de Ingeniería (idiomas, algoritmos, tutoriales, etc.)?