Ebben az oktatóanyagban megtudhatja, mi az elsőbbségi sor. Ezenkívül megismerheti Python, Java, C és C ++ implementációit.
A prioritási várólista egy speciális sorsor, amelyben minden elem társul egy prioritással, és prioritása szerint kerül kiszolgálásra. Ha azonos prioritású elemek fordulnak elő, akkor a sorrendjük szerint kerülnek kiszolgálásra a sorban.
Általában maga az elem értéke veszi figyelembe a prioritás hozzárendelését.
Például a legmagasabb értékű elemet tekintjük a legmagasabb prioritású elemnek. Más esetekben azonban a legkisebb értékű elemet feltételezhetjük a legmagasabb prioritású elemként. Más esetekben szükségleteinknek megfelelően állíthatunk prioritásokat.

Különbség a prioritási és a normál várakozási sor között
Sorban az első az elsőben ki szabályt hajtják végre, míg egy prioritási sorban az értékeket a prioritás alapján távolítják el . Először a legmagasabb prioritású elem kerül eltávolításra.
A prioritási sor megvalósítása
A prioritási sor egy tömb, egy összekapcsolt lista, egy halom adatszerkezet vagy egy bináris keresési fa segítségével valósítható meg. Ezen adatstruktúrák közül a halom adatstruktúra biztosítja a prioritási sorok hatékony megvalósítását.
Ezért a halom adatstruktúrát fogjuk használni az oktatóanyag prioritási sorának megvalósításához. A következő műveletekben egy maximális kupac van. Ha többet szeretne megtudni róla, kérjük, látogasson el a max-heap és a mean-heap oldalra.
Az alábbiakban összehasonlító elemzést adunk a prioritási sor különböző megvalósításairól.
Tevékenységek | kandikál | betét | töröl |
---|---|---|---|
Összekapcsolt lista | O(1) | O(n) | O(1) |
Bináris kupac | O(1) | O(log n) | O(log n) |
Bináris keresési fa | O(1) | O(log n) | O(log n) |
Kiemelt várólista műveletek
A prioritási sor alapvető műveletei az elemek beszúrása, eltávolítása és bepillantása.
Mielőtt tanulmányozná a prioritási várólistát, kérjük, olvassa el a halom adatszerkezetét a bináris halom jobb megértése érdekében, mivel az a cikk elsőbbségi sorának megvalósítására szolgál.
1. Helyezzen be egy elemet a Prioritási sorba
Elem beszúrása egy prioritási sorba (max-halom) a következő lépésekkel történik.
- Helyezze be az új elemet a fa végébe.
Helyezzen be egy elemet a sor végére
- Halmozd fel a fát.
Beszúrás után halmozzuk fel
Algoritmus egy elem beillesztésére a prioritási sorba (max-halom)
Ha nincs csomópont, hozzon létre egy új csomópontot. másképp (egy csomópont már van) illessze be az újNode-ot a végére (az utolsó csomópont balról jobbra.) Heapify a tömb
Min Heap esetében a fenti algoritmus úgy módosul, hogy parentNode
mindig kisebb legyen, mint newNode
.
2. Elem törlése a Prioritási sorból
Egy elem törlése a prioritási sorból (max-halom) a következőképpen történik:
- Válassza ki a törölni kívánt elemet.
Válassza ki a törölni kívánt elemet
- Cserélje az utolsó elemre.
Cserélje az utolsó levélcsomópont-elemre
- Távolítsa el az utolsó elemet.
Távolítsa el az utolsó elemlevelet
- Halmozd fel a fát.
Fejlessze a prioritási sort
Algoritmus egy elem törléséhez a prioritási sorban (max-halom)
Ha a nodeToBeDeleted a leafNode, távolítsa el a csomópontot Else swap csomópontot
Min Heap esetében a fenti algoritmust úgy módosítják, hogy mindkettő childNodes
kisebb legyen, mint currentNode
.
3. Pillantás a prioritási sorból (max / perc keresése)
A peek művelet a csomópont törlése nélkül adja vissza a maximális elemet a Max Heap-ból, a minimális elemet pedig a Min Heap-ből.
Mind Max halomhoz, mind Min Halomhoz
return rootNode
4. Extract-Max / Min a prioritási sorból
Az Extract-Max a maximális értékű csomópontot adja vissza, miután eltávolította a Max Heap-ból, míg az Extract-Min a minimális értékkel visszaadja a csomópontot, miután eltávolította a Min Heap-ból.
Prioritási várólista megvalósítások Pythonban, Java-ban, C-ben és C ++ -on
Python Java C C ++ # Priority Queue implementation in Python # Function to heapify the tree def heapify(arr, n, i): # Find the largest among root, left child and right child largest = i l = 2 * i + 1 r = 2 * i + 2 if l < n and arr(i) < arr(l): largest = l if r < n and arr(largest) < arr(r): largest = r # Swap and continue heapifying if root is not largest if largest != i: arr(i), arr(largest) = arr(largest), arr(i) heapify(arr, n, largest) # Function to insert an element into the tree def insert(array, newNum): size = len(array) if size == 0: array.append(newNum) else: array.append(newNum) for i in range((size // 2) - 1, -1, -1): heapify(array, size, i) # Function to delete an element from the tree def deleteNode(array, num): size = len(array) i = 0 for i in range(0, size): if num == array(i): break array(i), array(size - 1) = array(size - 1), array(i) array.remove(size - 1) for i in range((len(array) // 2) - 1, -1, -1): heapify(array, len(array), i) arr = () insert(arr, 3) insert(arr, 4) insert(arr, 9) insert(arr, 5) insert(arr, 2) print ("Max-Heap array: " + str(arr)) deleteNode(arr, 4) print("After deleting an element: " + str(arr))
// Priority Queue implementation in Java import java.util.ArrayList; class Heap ( // Function to heapify the tree void heapify(ArrayList hT, int i) ( int size = hT.size(); // Find the largest among root, left child and right child int largest = i; int l = 2 * i + 1; int r = 2 * i + 2; if (l hT.get(largest)) largest = l; if (r hT.get(largest)) largest = r; // Swap and continue heapifying if root is not largest if (largest != i) ( int temp = hT.get(largest); hT.set(largest, hT.get(i)); hT.set(i, temp); heapify(hT, largest); ) ) // Function to insert an element into the tree void insert(ArrayList hT, int newNum) ( int size = hT.size(); if (size == 0) ( hT.add(newNum); ) else ( hT.add(newNum); for (int i = size / 2 - 1; i>= 0; i--) ( heapify(hT, i); ) ) ) // Function to delete an element from the tree void deleteNode(ArrayList hT, int num) ( int size = hT.size(); int i; for (i = 0; i = 0; j--) ( heapify(hT, j); ) ) // Print the tree void printArray(ArrayList array, int size) ( for (Integer i : array) ( System.out.print(i + " "); ) System.out.println(); ) // Driver code public static void main(String args()) ( ArrayList array = new ArrayList(); int size = array.size(); Heap h = new Heap(); h.insert(array, 3); h.insert(array, 4); h.insert(array, 9); h.insert(array, 5); h.insert(array, 2); System.out.println("Max-Heap array: "); h.printArray(array, size); h.deleteNode(array, 4); System.out.println("After deleting an element: "); h.printArray(array, size); ) )
// Priority Queue implementation in C #include int size = 0; void swap(int *a, int *b) ( int temp = *b; *b = *a; *a = temp; ) // Function to heapify the tree void heapify(int array(), int size, int i) ( if (size == 1) ( printf("Single element in the heap"); ) else ( // Find the largest among root, left child and right child int largest = i; int l = 2 * i + 1; int r = 2 * i + 2; if (l array(largest)) largest = l; if (r array(largest)) largest = r; // Swap and continue heapifying if root is not largest if (largest != i) ( swap(&array(i), &array(largest)); heapify(array, size, largest); ) ) ) // Function to insert an element into the tree void insert(int array(), int newNum) ( if (size == 0) ( array(0) = newNum; size += 1; ) else ( array(size) = newNum; size += 1; for (int i = size / 2 - 1; i>= 0; i--) ( heapify(array, size, i); ) ) ) // Function to delete an element from the tree void deleteRoot(int array(), int num) ( int i; for (i = 0; i = 0; i--) ( heapify(array, size, i); ) ) // Print the array void printArray(int array(), int size) ( for (int i = 0; i < size; ++i) printf("%d ", array(i)); printf(""); ) // Driver code int main() ( int array(10); insert(array, 3); insert(array, 4); insert(array, 9); insert(array, 5); insert(array, 2); printf("Max-Heap array: "); printArray(array, size); deleteRoot(array, 4); printf("After deleting an element: "); printArray(array, size); )
// Priority Queue implementation in C++ #include #include using namespace std; // Function to swap position of two elements void swap(int *a, int *b) ( int temp = *b; *b = *a; *a = temp; ) // Function to heapify the tree void heapify(vector &hT, int i) ( int size = hT.size(); // Find the largest among root, left child and right child int largest = i; int l = 2 * i + 1; int r = 2 * i + 2; if (l hT(largest)) largest = l; if (r hT(largest)) largest = r; // Swap and continue heapifying if root is not largest if (largest != i) ( swap(&hT(i), &hT(largest)); heapify(hT, largest); ) ) // Function to insert an element into the tree void insert(vector &hT, int newNum) ( int size = hT.size(); if (size == 0) ( hT.push_back(newNum); ) else ( hT.push_back(newNum); for (int i = size / 2 - 1; i>= 0; i--) ( heapify(hT, i); ) ) ) // Function to delete an element from the tree void deleteNode(vector &hT, int num) ( int size = hT.size(); int i; for (i = 0; i = 0; i--) ( heapify(hT, i); ) ) // Print the tree void printArray(vector &hT) ( for (int i = 0; i < hT.size(); ++i) cout << hT(i) << " "; cout << ""; ) // Driver code int main() ( vector heapTree; insert(heapTree, 3); insert(heapTree, 4); insert(heapTree, 9); insert(heapTree, 5); insert(heapTree, 2); cout << "Max-Heap array: "; printArray(heapTree); deleteNode(heapTree, 4); cout << "After deleting an element: "; printArray(heapTree); )
Kiemelt várólista alkalmazások
Néhány prioritási sor alkalmazás a következő:
- Dijkstra algoritmusa
- verem megvalósításához
- a terhelés kiegyenlítésére és az operációs rendszer megszakításainak kezelésére
- az adatok tömörítéséhez Huffman-kódban