priority queue data structure c with illustration
Увод у приоритетни ред у Ц ++ са илустрацијом.
Приоритетни ред је продужење реда о којем смо разговарали у нашем последњем водичу.
Сличан је реду у одређеним аспектима, а ипак се разликује од уобичајеног реда у следећим тачкама:
- Свака ставка у реду приоритета повезана је са приоритетом.
- Ставка са највишим приоритетом прва је ставка која се уклања из реда.
- Ако више ставки има исти приоритет, узима се у обзир њихов редослед у реду.
=> Кликните овде за апсолутну Ц ++ серију тренинга.
Можемо да визуализујемо приоритетни ред као модификовану верзију реда, осим што се ставка са највишим приоритетом прво преузима када се ставка уклања из реда. Стога више волимо да користимо приоритетне редове уместо редова када треба да обрадимо ставке на основу приоритета.
Шта ћете научити:
- Основне операције
- Илустрација
- Имплементација приоритетних редова у Ц ++
- Апликација
- Закључак
- Препоручено читање
Основне операције
Размотримо неке од основних операција подржаних редом приоритета.
- Уметни (ставка, приоритет): Убацује ставку у ред приоритета са датим приоритетом.
- гетХигхестПриорити (): Враћа ставку са највишим приоритетом.
- делетеХигхестПриорити (): Уклања ставку са највишим приоритетом.
Поред горе наведених операција, можемо користити и нормалне операције у реду, попут исЕмпти (), исФулл () и пеек ().
Илустрација
Погледајмо илустрацију реда приоритета. Ради једноставности, користићемо АСЦИИ знакове као ставке у реду приоритета. Што је већа вредност АСЦИИ, то је већи приоритет.
Почетно стање - Приоритетни ред (ПК) - {} => празан
Из горње илустрације видимо да је операција уметања слична уобичајеном реду. Али када за ред приоритета позовемо „делетеХигхестПриорити“, елемент са највишим приоритетом прво се уклања.
Отуда се први пут када позивамо ову функцију уклања ставка О, док се други пут уклања ставка М јер има већи приоритет од Г и А.
Имплементација приоритетних редова у Ц ++
Приоритетни редови се могу применити помоћу:
# 1) Низови / повезане листе
Приоритетне редове можемо имплементирати помоћу низова и ово је најједноставнија имплементација за приоритетне редове.
Да бисмо представили ставке у приоритетном реду, можемо само прогласити структуру као што је приказано доле:
struct pq_item{ int item; int priority; };
Прогласили смо и приоритет за сваку ставку.
Да бисмо уметнули нову ставку у приоритетни ред, једноставно је морамо уметнути на крај низа.
Да бисмо добили елемент из реда помоћу гетХигхестПриорити (), морамо прећи низ од почетка и вратити ставку са највишим приоритетом.
Слично томе, да бисмо уклонили ставку из реда помоћу операције делетеХигхестПриорити, треба да пређемо цео низ и избришемо ставку са највишим приоритетом. Затим преместите све остале елементе након избрисане ставке, један положај уназад.
Редослед приоритета такође можемо применити помоћу повезане листе. Све операције можемо изводити на сличан начин попут низова. Једина разлика је у томе што не морамо премештати елементе након позивања делетеХигхестПриорити.
# 2) Гомиле
Коришћење гомила за примену реда приоритета је најефикаснији начин и пружа много боље перформансе у поређењу са повезаним листама и низима. Супротно повезаној листи и низу, имплементацији гомиле је потребно О (логн) време за уметање и брисање операција приоритетног реда. Набавите операцију, гетХигхестПриорити траје О (1) време.
# 3) Уграђени приоритетни ред у библиотеци стандардних шаблона (СТЛ) у Ц ++
У Ц ++-у имамо приоритетни ред као адаптивну класу контејнера, дизајниран тако да је највиши елемент први елемент у реду и сви елементи су у опадајућем редоследу.
Стога свака ставка у реду приоритета има фиксни приоритет.
Имамо класу у СТЛ-у, која садржи примену реда приоритета.
Разне операције подржане приоритетним редом су следеће:
- приорити_куеуе :: сизе (): Враћа величину реда.
- приорити_куеуе :: емпти (): Проверава да ли је ред празан и враћа свој статус.
- приорити_куеуе :: топ (): Враћа референцу на највиши елемент реда приоритета.
- приоритет_реда :: пусх (): Додаје ставку на крају реда приоритета.
- приорити_куеуе :: поп (): Уклања први елемент из реда приоритета.
- приорити_куеуе :: свап (): Користи се за замену садржаја једног приоритетног реда са другим исте врсте и величине.
- тип вредности реда приоритета: Тип вредности даје тип елемента ускладиштеног у приоритетном реду. Ово такође делује као синоним за параметар предлошка.
- приорити_куеуе :: емплаце (): Користи се за уметање новог елемента у контејнер са приоритетним редом на врху реда.
У следећем програму видећемо функционалност реда приоритета у СТЛ у Ц ++.
#include #include using namespace std; void displaypq(priority_queue pq) { priority_queue pqueue = pq; while (!pqueue.empty()) { cout << ' ' << pqueue.top(); pqueue.pop(); } cout << '
'; } int main () { priority_queue pq; pq.push(1); pq.push(3); pq.push(5); pq.push(7); pq.push(9); cout << 'Size of the queue(pq.size()): ' << pq.size(); cout << '
Top element of the queue(pq.top()): ' << pq.top(); cout << '
The priority queue pq is : '; displaypq(pq); cout << '
Priority queue, after pq.pop() operation : '; pq.pop(); displaypq(pq); return 0; }
Излаз:
најбољи блокатор огласа за мац хром
Величина реда (пк.сизе ()): 5
Горњи елемент реда (пк.топ ()): 9
Приоритетни ред пк је: 9 7 5 3 1
Приоритетни ред, након операције пк.поп (): 7 5 3 1
Имплементација Јаве за приоритетни ред
Приоритетни ред у јави је посебан ред у коме су сви елементи у реду поредани у складу са природним редоследом или прилагођеним редоследом помоћу упоређивача испорученог са редом.
Редослед приоритета у Јави изгледа као што је приказано доле:
У приоритетном реду Јава елементи су распоређени тако да је најмањи елемент на челу, а највећи на задњем делу реда. Дакле, када уклонимо елемент из реда приоритета, то је увек најмањи елемент који се уклања.
Класа која имплементира приоритетни ред у Јави је „ПриоритиКуеуе“ и део је оквира колекција Јаве. Примењује интерфејс Јава „Куеуе“.
Следи хијерархија класа за класу Јава ПриоритиКуеуе.
Доље је дат пример функције приоритетног реда са целим бројевима као ставкама у Јави.
import java.util.*; class Main { public static void main(String args()) { // Create empty priority queue PriorityQueue priority_Queue = new PriorityQueue(); // Adding items to the priority_Queue using add() priority_Queue.add(1); priority_Queue.add(3); priority_Queue.add(5); priority_Queue.add(7); // display the most priority element System.out.println('peek()::Head value:' + priority_Queue.peek()); // Print all elements in Priotity queue System.out.println('The priority queue:'); Iterator itr = priority_Queue.iterator(); while (itr.hasNext()) System.out.print(itr.next() + ' '); // poll() function to remove the queue elements priority_Queue.poll(); System.out.println('
After poll() function, priority queue:'); Iterator itr2 = priority_Queue.iterator(); while (itr2.hasNext()) System.out.print(itr2.next() + ' '); // remove() function with priority queue priority_Queue.remove(5); System.out.println('
After Remove(5) function, priority queue:'); Iterator itr3 = priority_Queue.iterator(); while (itr3.hasNext()) System.out.print(itr3.next() + ' '); // Check if an element is present using contains() boolean b = priority_Queue.contains(3); System.out.println ( '
Priority queue contains 3?: ' + b); // use toArray() function to get objects from the queue and display the array elements Object() arr = priority_Queue.toArray(); System.out.println ( 'Array elements: '); for (int i = 0; i Излаз:
пеек () :: Вредност главе: 1
Приоритетни ред:
1 3 5 7
Након функције полл (), приоритетни ред:
3 7 5
Након функције Уклони (5), ред приоритета:
3 7
Приоритетни ред садржи 3 ?: тачно
Елементи низа:
Вредност: 3
Вредност: 7
У горњем програму користимо класу ПриоритиКуеуе Јава да бисмо креирали објекат ПриоритиКуеуе који садржи објект Интегер. Елементе додајемо у ред помоћу функције „додај“. Тада се позива функција полл () и она брише елемент са чела реда који је најмање елемент.
Поново позивамо функцију “ремове ()” која уклања елемент наведен као параметар из реда. Такође користимо функцију „Садржи ()“ да бисмо проверили да ли је одређени елемент присутан у реду. На крају, претварамо ред у објект низа помоћу функције „тоАрраи ()“.
Апликација
- Руковање уравнотежењем оптерећења и прекида оперативног система: Функције оперативног система попут уравнотежења оптерећења и руковања прекидима имплементиране су помоћу приоритетних редова. Активност уравнотежења терета планира ресурсе са највишим приоритетом како би ефикасно извршила наше уравнотежење терета. Руковање прекидима врши се сервисирањем прекида с највишим приоритетом. Ова функционалност се може ефикасно применити помоћу приоритетних редова.
- Рутирање: Усмеравање је функција која се користи за усмеравање мрежних ресурса тако да добијамо максималну пропусност уз минимално време обраде. Ово се такође може применити помоћу приоритетног реда.
- Хитна помоћ у болници: У болничкој хитној помоћи пацијентима се присуствује у зависности од тога колико је тешко стање пацијента. Ово се може симулирати помоћу приоритетних редова.
- Дијкстрин најкраћи алгоритам пута: Овде се граф чува као листа суседности и можемо користити приоритетни ред да бисмо ефикасно извукли минималну пондерисану ивицу са листе суседности да бисмо применили Дијкстрин најкраћи алгоритам путање.
- Приоритетни ред се такође може користити за чување кључева чвора и издвајање минималног чвора кључа током имплементације опсежног стабла.
Закључак
Приоритетни редови нису ништа друго до продужење реда. Али за разлику од редова који додају / уклањају ставке помоћу ФИФО приступа, у приоритетном реду се ставке уклањају из реда према приоритету. Стога је свака ставка у реду повезана са приоритетом, а ставка с највишим приоритетом прва је која се уклања из реда.
Ред приоритета има три главне операције, тј. Инсерт (), гетХигхестПриорити () и делетеХигхестПриорити (). Приоритетни ред се може применити помоћу низова или повезане листе, али рад није баш ефикасан. Приоритетни ред се такође може применити помоћу гомила, а перформансе су много брже.
У Ц ++ имамо и класу контејнера која имплементира функционалност приоритетног реда. У Јави постоји уграђена класа приорити_куеуе која пружа функционалност реда приоритета.
Ред приоритета углавном се користи у апликацијама које захтевају да се ставке обраде према приоритету. На пример, користи се у руковању прекидима.
Наш предстојећи водич ће истражити све о кружном реду који је још једно продужење реда.
=> Посетите овде за целокупан курс стручњака за Ц ++.
Препоручено читање
- Структура података у реду у Ц ++ са илустрацијом
- Редослед приоритета у СТЛ-у
- Структура података стека у Ц ++ са илустрацијом
- Структура података кружно повезане листе на Ц ++ са илустрацијом
- Повезана структура података листе на Ц ++ са илустрацијом
- Структура података двоструко повезане листе у Ц ++ са илустрацијом
- Увод у структуре података на језику Ц ++
- Како тестирати ред за размену апликација: Увод у ИБМ ВебСпхере МК