Het invoegen is alleen een O(n) operatie, terwijl dat bij de priority queue (de de-factor standaard die wordt gebruikt voor dit soort dingen, en met een reden) slechts O(log n) is
Je weet hoe een boomstructuur in elkaar zit neem ik aan?
code:
1
2
3
4
5
6
7
8
9
| [1]
|
+------+------+
| |
[2] [3]
| |
+---+---+ +---+---+
| | | |
[4] [5] [6] [7] |
En dat stop je gewoon op die manier in de array. De root komt op 1, de 2 kinderen op 2 en 3, enzovoort. In principe hoef je alleen maar te onthouden:
• De parent van n is n/2
• Het linker kind van n is n*2
• Het rechter kind van n is n*2+1
De hoogste prioriteit van je hele queue staat
altijd in de root. Als je die eruit weghaalt, dan staat daar dus een lege plaats. Om te bepalen wat daar staat, kijk je naar [2] en [3], en degene met de hoogste prioriteit verplaats je naar de plaats van [1]. Stel je hebt [2] verplaatst, dan staat daar een lege plek, en moet je weer kijken naar [4] en [5]. Dit gaat door net zolang tot je bij de bladeren bent.
Als er 23 items in de queue staan, dan is positie 1 t/m 23 dan ook gevuld met die elementen. Een nieuw item toevoegen doe je gewoon door 'm op positie 24 te zetten. Vervolgens kijk je naar de parent van [24], [12] dus, en als de prioriteit van [12] lager is dan die van [24] dan wissel je ze om. Vervolgens kijk je naar de parent van [12], [6] dus, en wissel je ze weer om als de prioriteit van [12] hoger is dan die van [6]. Daarna kijk je naar positie [3], en vervolgens naar positie [1]. Als je nieuwe element uiteindelijk op [1] terecht komt betekent dat dus dat ie een prioriteit heeft die hoger is dan de rest van de elementen.
Voorbeedje dan maar:
Stel je hebt nog een lege boom, en je gaat elementen toevoegen met de volgende prioriteiten: 16, 3, 5, 12, 45, 34. Een hogere waarde betekent een hogere prioriteit.
Je begint met een lege boom, dan voeg je 16 in. De boom is leeg, dus 16 komt in de root:
code:
1
2
3
| boom: [1:16]
array: [16,-] |
Dan doe je 3. Op index [2] staat een lege plaats, dus daar voeg je 'm toe:
code:
1
2
3
4
5
6
7
| boom: [1:16]
|
+------+------+
| |
[2:3] [3:-]
array: [16,3,-] |
Vervolgens kijk je naar de parent van [2], [1] dus, maar aangezien 16 hoger is dan 3 hoef je niet om te wisselen
Hetzelfde doe je met de 5, die start op plaats [3], en hoeft ook niet omgewisseld te worden met [1], dus je hebt nu:
code:
1
2
3
4
5
6
7
| boom: [16]
|
+------+------+
| |
[3] [5]
array: [16,3,5,-] |
Nu moet je 12 in gaan voeren. Plaats [4] is de eerste vrije plaats, dus je krijgt
code:
1
2
3
4
5
6
7
8
9
10
11
| boom: [1:16]
|
+------+------+
| |
[2:3] [3:5]
|
+---+---+
| |
[4:12] [5:-]
array: [16,3,5,12,-] |
Maar, 12 is groter dan 3 (je vergelijkt [4] met [2]), dus die wissel je om:
code:
1
2
3
4
5
6
7
8
9
10
11
| boom: [1:16]
|
+------+------+
| |
[2:12] [3:5]
|
+---+---+
| |
[4:3] [5:-]
array: [16,12,5,3,-] |
Nu ga je 45 invoegen, en plaats [5] is de eerste vrije plaats. Plaats [5] vergelijk je met plaats [2], en 45 is hoger dan 12, dus die wissel je om:
code:
1
2
3
4
5
6
7
8
9
10
11
| boom: [1:16]
|
+------+------+
| |
[2:45] [3:5]
|
+---+---+
| |
[4:3] [5:12]
array: [16,45,5,3,12,-] |
Dan ga je [2] met [1] vergelijken, en omdat 45 hoger is dan 16 wissel je die ook om:
code:
1
2
3
4
5
6
7
8
9
10
11
| boom: [1:45]
|
+------+------+
| |
[2:16] [3:5]
|
+---+---+
| |
[4:3] [5:12]
array: [45,16,5,3,12,-] |
Daarna moet je 34 invoegen, die komt op plaats [6], maar aangezien op plaats [3] een 5 staat, moet je die omwisselen. Vervolgens hoef je 'm niet met [1] om te wisselen, om dat de 45 die daar staat hoger is dan 34. Het resultaat is dus:
code:
1
2
3
4
5
6
7
8
9
10
11
| boom: [1:45]
|
+------+------+
| |
[2:16] [3:34]
| |
+---+---+ +---+---+
| | | |
[4:3] [5:12] [6:5] [7:-]
array: [45,16,34,3,12,5,-] |
Een element uit de boom halen is simpel: je pakt de root, oftewel het element op [1] met prioriteit 45. Dit is het element met het hoogste prioriteit. Nu je die afgehandeld hebt haal je 'm natuurlijk uit de boom, maar dat zorgt voor een gat bovenaan.
code:
1
2
3
4
5
6
7
8
9
| boom: [1:?]
|
+------+------+
| |
[2:16] [3:34]
| |
+---+---+ +---+---+
| | | |
[4:3] [5:12] [6:5] [7:-] |
De 2 kinderen van [1] zijn 1*2 en 1*2+1, dus [2] en [3]. 34 is natuurlijk hoger dan 16, dus de 34 verplaats je naar boven.
code:
1
2
3
4
5
6
7
8
9
| boom: [1:34]
|
+------+------+
| |
[2:16] [3:?]
| |
+---+---+ +---+---+
| | | |
[4:3] [5:12] [6:5] [7:-] |
Nu moet je [6] en [7] met elkaar vergelijken. Aangezien positie 7 nog niet gevuld is, kun je gewoon [6] naar [3] verplaatsen, en is [6] een nieuwe vrije positie
Ik hoop dat het zo een beetje duidelijk is