Junior
Vai jūs zināt konteineru kā kaudzi?
sobes.tech AI
Atbilde no AI
Jā, pazīstu. Kupols (heap) ir specializēta koka struktūra, kas atbilst kupola noteikumam: katra virsotnei tās vērtība ir jābūt ne mazāka (vai ne lielāka) par tās bērnu vērtībām.
Atšķir:
- Maksimālais kupols (Max-heap): Vecāka virsotnes vērtība vienmēr ir lielāka vai vienāda ar tās bērnu vērtībām. Lielākais elements atrodas saknē.
- Minimālais kupols (Min-heap): Vecāka virsotnes vērtība vienmēr ir mazāka vai vienāda ar tās bērnu vērtībām. Mazākais elements atrodas saknē.
Populāra kupola realizācija ir binārais kupols, kas parasti tiek attēlots kā masīvs. Saistība starp vecāku un bērniem tiek noteikta pēc masīva indeksiem:
- Kreisais bērns
iindeksā ir2*i + 1. - Labais bērns
iindeksā ir2*i + 2. - Vecāks
iindeksā ir(i - 1) / 2.
Galvenās operācijas un to laika sarežģītība (bināram kupolam):
| Operācija | Laika sarežģītība |
|---|---|
| Kupola izveide | O(n) |
| Elementa pievienošana | O(log n) |
| Maksimuma/minimuma noņemšana | O(log n) |
| Augšējās virsotnes apskate | O(1) |
Kupola pielietojums:
- Prioritātes rindu realizācija.
- Sakārtošanas algoritms — kupola kārtošana (Heap Sort).
- Grafu būvniecības algoritmi (piemēram, Dijkstra, Prim).
C++ standarta bibliotēka nodrošina std::priority_queue, kas ir konteineru adapteris un pēc noklusējuma izmanto std::vector kā galveno konteineru un realizē maksimālo kupolu.
#include <queue>
#include <vector>
#include <iostream>
int main() {
// Prioritātes rinda (pēc noklusējuma — maksimālais kupols)
std::priority_queue<int> max_heap;
// Elementu pievienošana
max_heap.push(10);
max_heap.push(30);
max_heap.push(20);
max_heap.push(5);
// Elementu izņemšana (dilstošā secībā)
while (!max_heap.empty()) {
std::cout << max_heap.top() << " "; // Skats uz virsotni
max_heap.pop(); // Noņemšana
}
std::cout << std::endl;
// Minimālais kupols
std::priority_queue<int, std::vector<int>, std::greater<int>> min_heap;
min_heap.push(10);
min_heap.push(30);
min_heap.push(20);
min_heap.push(5);
// Elementu izņemšana (augošā secībā)
while (!min_heap.empty()) {
std::cout << min_heap.top() << " ";
min_heap.pop();
}
std::cout << std::endl;
return 0;
}