Очереди приоритетов — это фундаментальная структура данных в информатике, используемая для управления элементами со связанными приоритетами.
В отличие от традиционных очередей, где элементы обрабатываются в порядке «первым пришел — первым обслужен»(FIFO), приоритетные очереди обрабатывают элементы в зависимости от их приоритета, при этом элементы с более высоким приоритетом обрабатываются раньше элементов с более низким приоритетом.
В Python очереди с приоритетами обычно реализуются с использованием модуля heapq или внешних библиотек, таких как Queue.PriorityQueue.
- Какова очередь приоритетов?
- Как работают?
- С модулем heapq
- Класс queues.PriorityQueue
- Как использовать в виде списка
- Очередь с максимальным приоритетом
- Заключение
Какова очередь приоритетов?
Очередь приоритетов в Python — это структура данных, в которой хранятся элементы и соответствующие им приоритеты, где приоритет определяет порядок обработки элементов.
Элементы с более высоким приоритетом обрабатываются раньше элементов с более низким приоритетом, независимо от порядка их добавления.
Как работают?
Очереди приоритетов в Python можно реализовать с использованием базовых структур данных, таких как кучи или сбалансированные деревья. Наиболее распространенной реализацией является использование структуры данных кучи из-за ее эффективности в поддержании элемента с самым высоким(или самым низким) приоритетом наверху.
В Python модуль heapq предоставляет функции для реализации кучи, которые можно использовать для создания приоритетной очереди. Модуль heapq поддерживает список в виде кучи, где первым элементом всегда является самый маленький(или самый большой, в зависимости от реализации) элемент.
С модулем heapq
Модуль heapq в Python предоставляет функции для операций с кучей, позволяющие эффективно реализовывать очереди с приоритетами.
Он включает в себя такие функции, как heappush() для добавления элементов и heappop() для удаления наименьшего элемента.
Пример:
import heapq pq = [] def add_task(task, priority): heapq.heappush(pq,(priority, task)) def get_highest_priority_task(): if pq: return heapq.heappop(pq)[1] else: return None add_task('Task 1', 3) add_task('Task 2', 1) add_task('Task 3', 2) print(get_highest_priority_task()) print(get_highest_priority_task()) print(get_highest_priority_task())
Функция add_task( task, Priority) предназначена для добавления задачи в очередь приоритетов в Python с указанным приоритетом. Мы используем heapq.heappush() для поддержания свойства кучи, чтобы гарантировать, что задача с более низкими значениями приоритета находится ближе к началу очереди.
def add_task(task, priority): heapq.heappush(pq,(priority, task))
Функция get_highest_priority_task() возвращает и удаляет задачу с наивысшим приоритетом из очереди приоритетов Python.
При этом используется heapq.heappop() для эффективного извлечения задачи с наименьшим значением приоритета. Если очередь пуста, возвращается None.
def get_highest_priority_task(): if pq: return heapq.heappop(pq)[1] else: return None
Выход:
Task 2 Task 3 Task 1
Результат можно увидеть на скриншоте ниже после выполнения кода в PyCharm.
Класс queues.PriorityQueue
Класс queues.PriorityQueue в Python обеспечивает реализацию приоритетной очереди в Python. Он внутренне использует структуру данных кучи для эффективного обслуживания очереди. Элементы в очереди представляют собой кортежи вида (приоритет, элемент).
Вот пример, демонстрирующий использование queues.PriorityQueue в Python:
from queue import PriorityQueue pq = PriorityQueue() def add_task(task, priority): pq.put((priority, task)) def get_highest_priority_task(): if not pq.empty(): return pq.get()[1] else: return None add_task('California Data Processing', 3) add_task('New York Data Analysis', 1) add_task('Texas Data Entry', 2) print(get_highest_priority_task()) print(get_highest_priority_task()) print(get_highest_priority_task())
Я создал функцию с именем «add_task», которая добавляет задачу в приоритетную очередь с указанным приоритетом. Требуется два параметра.
Функции добавляют задачу в очередь приоритетов в Python с помощью метода put() класса PriorityQueue, при этом приоритет указывается в виде кортежа вместе с задачей.
def add_task(task, priority): pq.put((priority, task))
Я также создал в Python еще одну функцию под названием «get_highest_priority_task()», которая выдает и удаляет задачу с наивысшим приоритетом из очереди приоритетов. Это проверяет, не пуста ли очередь приоритетов, с помощью метода empty() класса PriorityQueue.
Если очередь не пуста, она извлекает верхний элемент с помощью метода get(), который возвращает кортеж (приоритет, задача). Функция возвращает только задачу (индекс кортежа 1) без приоритета в Python.
def get_highest_priority_task(): if not pq.empty(): return pq.get()[1] else: return None
Выход:
New York Data Analysis Texas Data Entry California Data Processing
На снимке экрана ниже показан код, реализованный в редакторе PyCharm.
Как использовать в виде списка
Чтобы реализовать очередь приоритетов в Python в списке, нам нужно объявить пустой список Python, в который элементы вставляются с помощью метода Append() класса списка. Затем список сортируется по возрастанию. Цикл While извлекает элементы с помощью метода pop().
Пример:
employee = [] employee.append((5, 'Nick')) employee.append((1, 'Rohan')) employee.append((3, 'Jack')) employee.sort(reverse=True) while employee: employee_tuple = employee.pop() print(employee_tuple)
После написания приведенного выше кода (реализация очереди приоритетов Python) элемент сортирует и удаляет элементы из очереди на основе их очереди приоритетов Python.
Выход:
(1, 'Rohan') (3, 'Jack') (5, 'Nick')
На скриншоте ниже вы можете посмотреть реализацию очереди приоритетов Python.
Очередь с максимальным приоритетом
В очереди максимального приоритета Python список будет упорядочен по убыванию их приоритета. Цикл While извлекает элементы с помощью метода pop(0).
Пример:
employee = [] employee.append((5, 'Nick')) employee.append((1, 'Ross')) employee.append((3, 'Jack')) employee.sort(reverse=True) while employee: employee_tuple = employee.pop() print(employee_tuple)
После написания приведенного выше кода (очередь с максимальным приоритетом в Python) список сортируется в порядке убывания и удаляет элементы из очереди на основе их приоритетной очереди.
Выход:
(1, 'Ross') (3, 'Jack') (5, 'Nick')
На скриншоте ниже вы можете увидеть очередь с максимальным приоритетом в Python.
Заключение
Очереди приоритетов Python — это важная структура данных для управления элементами со связанными приоритетами.
Понимая, что такое очередь приоритетов в Python и как они работают с различными методами реализации, такими как модуль heapq или класс queue.PriorityQueue, можно легко управлять программой на основе своих приоритетов.