Loading AI tools
З Вікіпедії, вільної енциклопедії
Черга з пріоритетами (англ. priority queue) — це структура даних, що призначена для обслуговування множини елементів, кожний з яких додатково має "пріоритет", пов'язаний з ним. У пріоритетній черзі першим обслуговується елемент, який має найвищий пріоритет, відповідно елемент, що має найнижчий пріоритет буде обслугований останнім. У деяких реалізаціях, якщо два елементи мають однаковий пріоритет, вони подаються відповідно до порядку, в якому вони були закладені, в той час як в інших реалізаціях упорядкування елементів з однаковим пріоритетом не визначено.
Хоча черги з пріоритетами часто реалізуються купами, вони концептуально відрізняються від них. Черга пріоритетів - це абстрактне поняття, як "список" або "карта"; так само, як список може бути реалізована зв'язаним списком або масивом, черга з пріоритетом може бути реалізована купою або безліччю інших методів, таких як невпорядкований масив.
Черга з пріоритетами повинна підтримувати принаймні такі операції:
Інші назви: "pop_element (Off)", "get_maximum_element" або "get_front (most) _element".
Деякі конвенції змінюють порядок пріоритетів, вважаючи, що менші значення мають вищий пріоритет, тому це може бути відоме як "get_minimum_element", і часто в літературі називається "get-min".
Також цю операцію можна замінити двома окремими функціями: "peek_at_highest_priority_element" і "delete_element", які можуть бути об'єднані для створення "pull_highest_priority_element".
Крім того, peek (у цьому контексті часто називається find-max або find-min), що повертає елемент з найвищим пріоритетом, але не змінює чергу, часто реалізується, і майже завжди виконується за час . Ця операція та її продуктивність мають вирішальне значення для багатьох застосувань пріоритетних черг.
Сучасніші реалізації можуть підтримувати складніші операції, такі як pull_lowest_priority_element, що перевіряє перші кілька елементів з найвищим або найнижчим пріоритетом, очищаючи чергу, очищаючи підмножини черги, виконуючи пакетну вставку, об'єднуючи дві або більше черг в одну, збільшуючи пріоритет будь-якого елемента тощо.
З точки зору обчислювальної складності, пріоритетні черги узгоджуються з алгоритмами сортування. Семантика пріоритетних черг, пропонує метод сортування: вставляти всі елементи, які слід сортувати, в чергу пріоритетів, і послідовно видаляти їх, таким чином вони виходитимуть у відсортованому порядку. Насправді це процедура, яка використовується кількома алгоритмами сортування, після видалення рівня абстракції, що надається чергою пріоритету. Цей метод сортування еквівалентний таким алгоритмам сортування:
Назва | Реалізація пріоритетної черги | Найкраща швидкодія | Середня швидкодія | Найгірша швидкодія |
---|---|---|---|---|
Пірамідальне сортування | Купа | |||
Плавне сортування | Купа Леонардо | |||
Сортування вибором | Невпорядкований масив | |||
Сортування включенням | Впорядкований масив | |||
Сортування двійковим деревом | Збалансоване двійкове дерево пошуку |
Існує багато простих способів реалізації черги з пріоритетами, проте, як правило, вони не є ефективними. Такі способи допомагають краще зрозуміти, що таке пріоритетна черга. Наприклад, можна зберегти всі елементи в невпорядкованому списку. У цьому випадку кожного разу, щоб отримати елемент з найвищим пріоритетом, потрібно буде виконувати пошук по всіх елементах списку. (У великій O-нотації: час вставки, час витягування за рахунок пошуку.)
Щоб підвищити продуктивність, черги з пріоритетами зазвичай використовують купу як свою магістраль, даючи продуктивність для вставок і вилучень, і для початкової побудови. Різновиди базових куп, такі як купа сполучень або купа Фібоначчі, можуть надати кращі асимптотичні розміри для деяких операцій.
Альтернативно, коли використовується самозбалансоване двійкове дерево пошуку, вставка і видалення також займають час , хоча побудова дерев з існуючих послідовностей елементів займає час , що характерно, при наявності доступу до цих структур даних, наприклад, із сторонніх або стандартних бібліотек.
Існує декілька спеціалізованих структур даних – куп, які або забезпечують додаткові операції, або покращують реалізації на основі куп для конкретних типів ключів, зокрема цілочислових ключів.
Для додатків, які виконують багато операцій "peek" для кожної операції "extract-min" складність часу для peek може бути зменшена до у всіх реалізаціях дерев і куп, кешуванням елементу найвищого пріоритету після кожної вставки і видалення. Для вставки це додає не більше постійної вартості, оскільки знову вставлений елемент порівнюється тільки з раніше кешованим мінімальним елементом. Для видалення це максимум спричинює додаткові витрати, які зазвичай дешевші, ніж вартість видалення, тому на загальну складність часу суттєво не впливає.
Монотонні пріоритетні черги - це спеціалізовані черги, які оптимізовані для випадку, коли не вставляється жоден елемент, що має нижчий пріоритет (у випадку min-heap), ніж будь-який попередньо витягнутий елемент. Це обмеження задовольняється кількома практичними застосуваннями пріоритетних черг.
Приклад реалізації пріоритетної черги на C++ за допомогою двозв'язного списку:
#include <iostream>
#include <list>
using namespace std;
struct Pair
{
char value;
size_t priority;
Pair(char v, size_t p):
value(v),
priority(p)
{}
};
class PriorityQueue
{
list<Pair> queue;
public:
void enqueue(Pair elem)
{
for (auto it = queue.begin(); it != queue.end(); ++it)
{
if (it->priority > elem.priority)
{
queue.insert(it, elem);
return;
}
}
queue.push_back(elem);
}
char dequeue()
{
char result = queue.front().value;
queue.erase(queue.begin());
return result;
}
size_t size()
{
return queue.size();
}
char top()
{
return queue.front().value;
}
bool isEmpty()
{
return queue.size() == 0;
}
};
Це незавершена стаття про інформаційні технології. Ви можете допомогти проєкту, виправивши або дописавши її. |
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.