Tässä opetusohjelmassa opit, mikä prioriteettijono on. Opit myös sen toteutuksista Pythonissa, Java: ssa, C: ssä ja C ++: ssa.
Prioriteettijono on erityinen jonotyyppi, jossa jokainen elementti liittyy prioriteettiin ja sitä palvellaan prioriteetin mukaan. Jos elementtejä, joilla on sama prioriteetti, esiintyy, ne näytetään jonossa olevan järjestyksen mukaan.
Yleensä prioriteetin määrittämisessä otetaan huomioon itse elementin arvo.
Esimerkiksi korkeimman arvon elementtiä pidetään tärkeimpänä prioriteettina. Muissa tapauksissa voimme kuitenkin olettaa, että alimman arvon omaava elementti on korkeimman prioriteetin elementti. Muissa tapauksissa voimme asettaa prioriteetit tarpeidemme mukaan.

Ero tärkeysjärjestyksen ja normaalin jonon välillä
Jonossa toteutetaan ensin ensin sisään-ulos -sääntö, kun taas prioriteettijonossa arvot poistetaan prioriteetin perusteella . Korkeimman prioriteetin elementti poistetaan ensin.
Prioriteettijonon toteutus
Prioriteettijono voidaan toteuttaa käyttämällä taulukkoa, linkitettyä luetteloa, kasan tietorakennetta tai binaarista hakupuuta. Näistä tietorakenteista kasan tietorakenne tarjoaa tehokkaan prioriteettijonojen toteuttamisen.
Siksi käytämme kasan tietorakennetta prioriteettijonon toteuttamiseen tässä opetusohjelmassa. Suurin kasa on kone on seuraavissa toiminnoissa. Jos haluat oppia lisää siitä, käy osoitteessa max-heap ja mean-heap.
Seuraavassa esitetään vertaileva analyysi prioriteettijonon eri toteutuksista.
Toiminnot | kurkistaa | lisää | poistaa |
---|---|---|---|
Linkitetty luettelo | O(1) | O(n) | O(1) |
Binaarinen kasa | O(1) | O(log n) | O(log n) |
Binaarinen hakupuu | O(1) | O(log n) | O(log n) |
Prioriteettijonotoiminnot
Prioriteettijonon perustoiminnot ovat elementtien lisääminen, poistaminen ja kurkistaminen.
Ennen kuin tarkastelet prioriteettijonoa, tutustu kasan tietorakenteeseen saadaksesi paremman käsityksen binäärikoneesta, koska sitä käytetään tämän artiklan prioriteettijonon toteuttamiseen.
1. Lisää elementti prioriteettijonoon
Elementin lisääminen prioriteettijonoon (max-kasa) tapahtuu seuraavasti.
- Lisää uusi elementti puun päähän.
Lisää elementti jonon loppuun
- Kasvata puuta.
Kasaa lisäyksen jälkeen
Algoritmi elementin lisäämiseksi prioriteettijonoon (max-kasa)
Jos solmua ei ole, luo uusi solmu. muuten (solmu on jo läsnä) lisää uusi solmu loppuun (viimeinen solmu vasemmalta oikealle.) kasaa taulukko
Min Heapia varten yllä olevaa algoritmia muokataan siten, että se parentNode
on aina pienempi kuin newNode
.
2. Elementin poistaminen prioriteettijonosta
Elementin poistaminen prioriteettijonosta (max-heap) tapahtuu seuraavasti:
- Valitse poistettava elementti.
Valitse poistettava elementti
- Vaihda se viimeisen elementin kanssa.
Vaihda viimeisen lehtisolmuelementin kanssa
- Poista viimeinen elementti.
Poista viimeinen elementtilehti
- Kasvata puuta.
Heapify prioriteettijono
Algoritmi elementin poistamiseksi prioriteettijonosta (max-kasa)
Jos nodeToBeDeleted on leafNode, poista solmu Muuten vaihda nodeToBeDeleted with lastLeafNode poista noteToBeDeleted heapify array
Min Heapia varten yllä olevaa algoritmia muokataan niin, että molemmat childNodes
ovat pienempiä kuin currentNode
.
3. Kurkistus prioriteettijonolta (Etsi maksimi / min)
Peek-toiminto palauttaa enimmäiselementin Max Heapista tai minimielementin Min Heapista poistamatta solmua.
Sekä Max-kasalle että Min-kasalle
palauta rootNode
4. Extract-Max / Min prioriteettijonosta
Extract-Max palauttaa solmun suurimmalla arvolla sen jälkeen, kun se on poistettu Max-kasasta, kun taas Extract-Min palauttaa solmun vähimmäisarvolla, kun se on poistettu Min-kasasta.
Prioriteettijonon toteutukset Pythonissa, Java: ssa, C: ssä ja C ++: ssa
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); )
Prioriteettijonosovellukset
Jotkut prioriteettijonon sovelluksista ovat:
- Dijkstran algoritmi
- pinon toteuttamiseen
- kuormituksen tasapainottamiseen ja keskeytysten käsittelyyn käyttöjärjestelmässä
- tietojen pakkaamiseen Huffman-koodissa