Heap

Een heap is een abstracte datastructuur in de informatica, niet te verwarren met een zogenaamd heapgeheugen. Op een heap kunnen data-elementen worden opgeslagen, maar daar ook weer uit verwijderd worden. Aan elk van de elementen is een sleutel toegewezen die de prioriteit van het element bepaalt. In veel gevallen kunnen de elementen zelf als sleutel gebruikt worden.
Een heap is een array-datastructuur die een binaire boom representeert. Een array A is een heap als deze voldoet aan de heapvoorwaarde: als B een kind van A is, dan sleutel(A) ≥ sleutel(B).
Bewerkingen
Element toevoegen
Er wordt gestart met een array A met grootte N. Het te plaatsen element wordt op de plaats N+1 gezet. Op dit moment is niet noodzakelijk voldaan aan de heapvoorwaarde (het element kan groter zijn dan zijn ouder). Om terug aan de heapvoorwaarde te voldoen, worden volgende stappen herhaald totdat het element op zijn plaats staat, en dus kleiner is dan zijn ouder. Indien het toegevoegde element het grootste van de hele heap is, komt dit uiteindelijk zo in de wortel te staan.
- Is de sleutel van het nieuwe element groter dan zijn ouder?
- Zo ja: Wissel ouder en het nieuwe element van plaats
- Zo nee: Er is nu terug voldaan aan de heapvoorwaarde en het element staat op zijn plaats.
Codevoorbeeld (C++)
template <typename T>
void HeapSort<T>::element_toevoegen(vector<T> &v, T element){
//let op: de vector gebruikt indexen [0..N-1, de heap [1..N]
v.push_back(element);
int i = v.size(); //index van het nieuw toegevoegde element
while (i > 1 && v[i - 1] > v[i/2 - 1]){ //ouder heeft index i/2
swap(v[i - 1], v[i/2 - 1]);
i=i/2; //het element staat nu op de plaats van zijn ouder, we starten opnieuw vanop die plaats
}
}
Toepassingen
- Heapsort
- Prioriteitwachtrij (priority-queue)
Content Disclaimer
Informasi ini disarikan dari Wikipedia dan disajikan kembali untuk tujuan edukasi. Konten tersedia di bawah lisensi CC BY-SA 3.0. Kami tidak bertanggung jawab atas ketidakakuratan data yang bersumber dari kontribusi publik tersebut.
- The information displayed on this website is sourced in part or in whole from Wikipedia and has been adapted for the purpose of restating it. We strive to provide accurate and relevant information, however:
- There is no guarantee of absolute accuracy. Wikipedia is an open, collaborative project that can be edited by anyone, so information is subject to change.
- It is not intended to constitute professional advice. The content displayed is for informational and educational purposes only. For important decisions (e.g., medical, legal, or financial), please consult a professional.
- Content copyright. Wikipedia is licensed under the Creative Commons Attribution-ShareAlike License (CC BY-SA). This means that content may be reused with appropriate attribution and shared under a similar license.
- Responsible use. Any risk arising from the use of information from this website is entirely the responsibility of the user.