Kupu datu struktūru ilustrācija
Ir divu veidu kaudzes: max-kaudze un min-kaudze. Max-heap struktūra ir vieta, kur maksimālā vērtība ir sakne, un vērtības kļūst mazākas, kad koks nokāpj; jebkura vecāka vērtība ir vai nu vienāda, vai lielāka par jebkuru no tuvākajiem bērniem. Min-kaudzes struktūra ir vieta, kur minimālā vērtība ir sakne, un vērtības kļūst lielākas, kad koks nokāpj; jebkura vecāka vērtība ir vai nu vienāda, vai mazāka nekā jebkurš no tuvākajiem bērniem. Nākamajās diagrammās pirmais ir max-heap un otrais ir min-heap:
Attiecībā uz abām kaudzēm ņemiet vērā, ka bērnu pārim nav svarīgi, vai kreisajā pusē esošā vērtība ir lielāka. Rinda koka līmenī nav obligāti jāaizpilda no minimālā līdz maksimālajam, no kreisās puses; tas arī nav obligāti jāaizpilda no maksimuma līdz minimumam, no kreisās puses.
Pārstāvēt kaudzi masīvā
Lai programmatūra varētu viegli izmantot kaudzi, kaudze ir jāatspoguļo masīvā. Maksimālais kaudze, kas attēlota masīvā, ir:
89., 85., 87., 84., 82., 79., 73., 80., 81.,, 65., 69. lppTas tiek darīts, sākot ar saknes vērtību kā pirmo masīva vērtību. Vērtības tiek nepārtraukti izvietotas, nolasot koku no kreisās uz labo pusi, no augšas uz leju. Ja elementa nav, tā pozīcija masīvā tiek izlaista. Katrā mezglā ir divi bērni. Ja mezgls atrodas indeksā (pozīcijā) n, tā pirmais bērns masīvā atrodas indeksā 2n + 1 un nākamais bērns indeksā 2n + 2. 89 ir indeksā 0; tā pirmais bērns, 85 ir indeksā 2 (0) + 1 = 1, bet otrais bērns ir indeksā 2 (0) + 2 = 2. 85 ir 1. indeksā; tā pirmais bērns, 84, atrodas indeksā 2 (1) + 1 = 3, bet otrais bērns, 82, ir indeksā 2 (1) + 2 = 4. 79 ir indeksā 5; tā pirmais bērns, 65, atrodas indeksā 2 (5) + 1 = 11, bet otrais bērns ir indeksā 2 (5) + 2 = 12. Formulas tiek izmantotas pārējiem masīva elementiem.
Šādu masīvu, kur elementa nozīmi un attiecību starp elementiem nozīmē elementa atrašanās vieta, sauc par netiešu datu struktūru.
Netiešā iepriekš minētā kaudzes datu struktūra ir:
65, 68, 70, 73., 71., 83., 84., 79., 80., 85., 89. lppIepriekš minētais maksimālais kaudze ir pilnīgs binārs koks, bet ne pilns binārs koks. Tāpēc masīvā dažas vietas (pozīcijas) ir tukšas. Pilna binārā koka gadījumā masīvā neviena vieta nebūs tukša.
Tagad, ja kaudze būtu gandrīz pilnīgs koks, piemēram, ja trūkst vērtības 82, masīvs būtu:
89., 85., 87., 84., 79., 73., 80., 81.,, 65., 69. lppŠajā situācijā trīs vietas ir tukšas. Tomēr formulas joprojām ir piemērojamas.
Operācijas
Datu struktūra ir datu formāts (piemēram,.g. koks), plus attiecība starp vērtībām, kā arī darbības (funkcijas), ko veic ar vērtībām. Kaudzei attiecības, kas iziet cauri visai kaudzei, ir tādas, ka vecāku vērtībai jābūt vienādai vai lielākai par bērniem, lai iegūtu maksimālu kaudzi; un vecāka vērtībai jābūt vienādai vai mazākai par bērniem, lai iegūtu min-kaudzi. Šīs attiecības sauc par kaudzes īpašumu. Kaudzes darbība ir sagrupēta sadaļā Radīšana, Pamata, Iekšējā un Pārbaude. Kausa darbību kopsavilkums ir šāds:
Kupu operāciju kopsavilkums
Ir dažas programmatūras darbības, kas kopīgas ar kaudzēm, šādi:
Kaudzes izveide
create_heap: kaudzes izveidošana nozīmē objekta izveidošanu, kas apzīmē kaudzi. C valodā jūs varat izveidot kaudzi ar struktūras objekta tipu. Viens no struktūras locekļiem būs kaudzes masīvs. Pārējie dalībnieki būs kaudzes funkcijas (operācijas). Create_heap nozīmē izveidot tukšu kaudzi.
Heapify: kaudzes masīvs ir daļēji sakārtots (sakārtots) masīvs. Heapify nozīmē nodrošināt kaudzes masīvu no nešķirota masīva - sīkāku informāciju skatiet zemāk.
Apvienot: tas nozīmē, ka veidojiet savienojuma kaudzi no diviem dažādiem kaudzēm - skatiet sīkāku informāciju zemāk. Abiem kaudzēm jābūt maksimāli kuplām vai abām min-kaudzēm. Jaunais kaudze atbilst kaudzes īpašumam, savukārt sākotnējie kaudzes tiek saglabātas (nav izdzēstas).
Meld: Tas nozīmē, ka apvienojiet divus viena veida kaudzes, lai izveidotu jaunu, saglabājot dublikātus - skatiet sīkāku informāciju zemāk. Jaunais kaudze atbilst kaudzes īpašumam, savukārt sākotnējie kaudzes tiek iznīcinātas (izdzēstas). Galvenā atšķirība starp sapludināšanu un sapludināšanu ir tāda, ka sapludināšanai viens koks der kā apakškoks otra koka saknei, ļaujot jaunajā kokā dublēt vērtības, savukārt apvienošanai tiek izveidots jauns kaudzes koks, noņemot dublikātus. Nav nepieciešams saglabāt divus oriģinālos kaudzes ar sapludināšanu.
Pamata operācijas
find_max (find_min): atrodiet masīvā max-heap maksimālo vērtību un atdodiet kopiju, vai atrodiet minimālo vērtību masīvā min-heap un atgrieziet kopiju.
Ievietot: Pievienojiet jaunu elementu kaudzes masīvam un pārkārtojiet masīvu tā, lai diagrammas kaudzes īpašība tiktu saglabāta.
extract_max (extract_min): atrodiet masīvā max-heap maksimālo vērtību, noņemiet un atgrieziet to; vai atrodiet masīvā min-heap minimālo vērtību, noņemiet un atgrieziet to.
delete_max (delete_min): atrodiet max-heap saknes mezglu, kas ir pirmais masīva max-heap elements, noņemiet to, obligāti neatdodot; vai atrodiet min-heap saknes mezglu, kas ir min-heap masīva pirmais elements, noņemiet to, obligāti neatdodot;
Aizstāt: atrodiet jebkura kaudzes saknes mezglu, noņemiet to un nomainiet to ar jaunu. Nav svarīgi, vai vecā sakne tiek atgriezta.
Iekšējās kaudzes operācijas
palielināt_atslēgu (samazināt_atslēgu): palieliniet jebkura mezgla vērtību maksimālajam kaudzei un pārkārtojiet tā, lai tiktu saglabāts kaudzes īpašums, vai samaziniet jebkura mezgla vērtību min-kaudzei un pārkārtojiet tā, lai tiktu saglabāts kaudzes rekvizīts.
Dzēst: izdzēsiet jebkuru mezglu un pēc tam pārkārtojiet tā, lai kupona rekvizīts tiktu saglabāts max-heap vai min-heap.
shift_up: pārvietojiet mezglu uz augšu max-heap vai min-heap tik ilgi, cik nepieciešams, pārkārtojot, lai saglabātu kaudzes īpašību.
shift_down: pārvietojiet mezglu uz leju max-heap vai min-heap tik ilgi, cik nepieciešams, pārkārtojot, lai saglabātu kaudzes īpašību.
Kaudzes pārbaude
Izmērs: Tas atgriež atslēgu (vērtību) skaitu kaudzē; tas neietver kaudzes masīva tukšās vietas. Kaudzi var attēlot ar kodu, kā diagrammā, vai ar masīvu.
ir tukšs: Tas atgriež Būla taisnību, ja kaudzē nav mezglu, vai Būla viltus, ja kaudzē ir vismaz viens mezgls.
Sijāšana kaudzē
Ir siets uz augšu un siets uz leju:
Sift-Up: Tas nozīmē nomainīt mezglu ar vecāku. Ja kaudzes īpašums nav apmierināts, nomainiet vecāku ar savu vecāku. Turpiniet ceļu pa šo ceļu, līdz kaudzes īpašums ir apmierināts. Procedūra var sasniegt sakni.
Sift-down: Tas nozīmē nomainīt lielas vērtības mezglu ar mazāko no diviem bērniem (vai vienu bērnu pret gandrīz pilnu kaudzi). Ja kaudzes īpašums nav apmierināts, nomainiet apakšējo mezglu ar mazāko pašu divu bērnu mezglu. Turpiniet ceļu pa šo ceļu, līdz kaudzes īpašums ir apmierināts. Procedūra var sasniegt lapu.
Uzkrājošs
Heapify nozīmē kārtot nešķirotu masīvu, lai kaudzes īpašība būtu apmierināta ar max-heap vai min-heap. Tas nozīmē, ka jaunajā masīvā var būt dažas tukšas vietas. Pamata algoritms, lai palielinātu maksimālo kaudzi vai min-kaudzi, ir šāds:
- ja saknes mezgls ir ekstrēmāks nekā kāds no tā bērna mezgliem, apmainiet sakni ar mazāk ekstrēmo bērna mezglu.
- Atkārtojiet šo darbību ar bērnu mezgliem Pre-Order Tree Traversing Scheme.
Galīgais koks ir kaudzes koks, kas apmierina kaudzes īpašību. Kaudzi var attēlot kā koka diagrammu vai masīvā. Iegūtais kaudze ir daļēji sašķirots koks, t.i.e. daļēji sakārtots masīvs.
Informācija par kaudzes operāciju
Šajā raksta sadaļā ir sniegta sīkāka informācija par kaudzes darbībām.
Kaudzes detaļu izveide
izveidot_heap
Skatīt iepriekš!
uzkrāt
Skatīt iepriekš
apvienot
Ja kaudze masīvi,
89., 85., 87., 84., 82., 79., 73., 80., 81.,, 65., 69. lppun
89., 85., 84., 73., 79., 80., 83., 65., 68., 70., 71. lppir apvienoti, rezultāts bez dublikātiem var būt,
89., 85., 87., 84., 82., 83., 81., 80., 79., 73., 68., 65., 69., 70., 71Pēc nelielas sijāšanas. Ievērojiet, ka pirmajā masīvā 82 nav bērnu. Rezultātā esošajā masīvā tas atrodas 4. indeksā; un tā atrašanās vietas indeksā 2 (4) + 1 = 9 un 2 (4) + 2 = 10 ir brīvas. Tas nozīmē, ka jaunajā koku diagrammā tam nav arī bērnu. Sākotnējos divus kaudzes nevajadzētu dzēst, jo to informācija patiesībā neatrodas jaunajā kaudzē (jauns masīvs). Pamata algoritms tāda paša veida kaudzīšu apvienošanai ir šāds:
- Pievienojiet vienu masīvu otra masīva apakšai.
- Heapify novērš dublikātus, pārliecinoties, ka mezglos, kuriem sākotnējā kaudzē nebija bērnu, jaunajā kaudzē joprojām nav bērnu.
sapludināts
Divu viena tipa kaudzīšu (vai nu divu, vai divu min.) Kausēšanas algoritms ir šāds:
- Salīdziniet divus saknes mezglus.
- Izveidojiet mazāk ekstrēmo sakni un pārējo tās koku (apakškoku), kas ir galējās saknes otrais bērns.
- Izsijāt klaiņojošo bērnu tagadējā gala apakškoka saknē, galējā apakškokā uz leju.
Iegūtais kaudze joprojām atbilst kaudzes īpašumam, savukārt sākotnējie kaudzes tiek iznīcinātas (izdzēstas). Sākotnējās kaudzes var iznīcināt, jo visa viņu rīcībā esošā informācija joprojām atrodas jaunajā kaudzē.
Galvenās kaudzes operācijas
atrast_max (atrast_min)
Tas nozīmē atrast maksimālo vērtību masīvā max-heap un atgriezt kopiju vai atrast minimālo vērtību masīvā min-heap un atgriezt kopiju. Kaudzes masīvs pēc definīcijas jau atbilst kaudzes īpašumam. Tātad, vienkārši atgrieziet masīva pirmā elementa kopiju.
ievietot
Tas nozīmē pievienot jaunu elementu kaudzes masīvam un pārkārtot masīvu tā, lai diagrammas kaudzes īpašība tiktu saglabāta (apmierināta). Algoritms, kā to izdarīt abu veidu kaudzēm, ir šāds:
- Pieņemsim pilnu bināro koku. Tas nozīmē, ka masīvs beigās ir jāaizpilda ar tukšām vietām, ja nepieciešams. Pilnas kaudzes mezglu kopējais skaits ir 1, 3 vai 7, vai 15, vai 31 utt.; turpiniet dubultot un pievienot 1.
- Novietojiet mezglu pēc lieluma vispiemērotākajā tukšajā vietā uz kaudzes galu (uz kaudzes masīva beigām). Ja nav tukšas vietas, sāciet jaunu rindu no apakšas pa kreisi.
- Ja nepieciešams, izsijāt, līdz kaudzes īpašums ir apmierināts.
extract_max (extract_min)
Masīvā max-heap atrodiet maksimālo vērtību, noņemiet un atgrieziet to; vai atrodiet masīvā min-heap minimālo vērtību, noņemiet un atgrieziet to. Algoritms, lai iegūtu_max (ekstrakts_min), ir šāds:
- Noņemiet saknes mezglu.
- Paņemiet (noņemiet) apakšējo labo mezglu (masīva pēdējais mezgls) un novietojiet pie saknes.
- Pēc vajadzības izsijiet, līdz kaudzes īpašums ir apmierināts.
delete_max (dzēst_min)
Atrodiet max-heap saknes mezglu, kas ir masīva max-heap pirmais elements, noņemiet to, obligāti neatdodot; vai atrodiet min-heap saknes mezglu, kas ir masīva min-heap pirmais elements, noņemiet to, obligāti neatdodot. Saknes mezgla dzēšanas algoritms ir šāds:
- Noņemiet saknes mezglu.
- Paņemiet (noņemiet) apakšējo labo mezglu (masīva pēdējais mezgls) un novietojiet pie saknes.
- Pēc vajadzības izsijiet, līdz kaudzes īpašums ir apmierināts.
aizvietot
Atrodiet jebkura kaudzes saknes mezglu, noņemiet to un nomainiet to ar jauno. Nav svarīgi, vai vecā sakne tiek atgriezta. Ja nepieciešams, izsijiet, līdz kaudzes īpašums ir apmierināts.
Iekšējās kaudzes operācijas
palielināt_atslēgu (samazināt_atslēgu)
Palieliniet jebkura mezgla vērtību max-heap un pārkārtojiet tā, lai tiktu saglabāts kaudzes īpašums, vai samaziniet jebkura mezgla vērtību min-heap un pārkārtojiet tā, lai tiktu saglabāts kaudzes rekvizīts. Vajadzīgi siet uz augšu vai uz leju, līdz kaudzes īpašums ir apmierināts.
dzēst
Noņemiet interesējošo mezglu un pēc tam pārkārtojiet tā, lai kaudzes īpašība tiktu saglabāta max-heap vai min-heap. Mezgla dzēšanas algoritms ir šāds:
- Noņemiet interesējošo mezglu.
- Paņemiet (noņemiet) apakšējo labo mezglu (masīva pēdējais mezgls) un novietojiet noņemtā mezgla rādītājā. Ja izdzēstais mezgls atrodas pēdējā rindā, tas var nebūt vajadzīgs.
- Vajadzīgi siet uz augšu vai uz leju, līdz kaudzes īpašums ir apmierināts.
Pārslēgt
Pārvietojiet mezglu uz augšu maksimālajā kaudzē vai min-kaudzē tik ilgi, cik nepieciešams, pārkārtojot, lai saglabātu kaudzes īpašību - izsijājiet uz augšu.
shift_down
Pārvietojiet mezglu uz leju max-heap vai min-heap tik ilgi, cik nepieciešams, pārkārtojot, lai saglabātu kaudzes īpašību - izsijājiet uz leju.
Kaudzes pārbaude
Izmērs
Skatīt iepriekš!
ir tukšs
Skatīt iepriekš!
Citas kaudzes klases
Šajā rakstā aprakstīto kaudzi var uzskatīt par galveno (vispārējo) kaudzi. Ir arī citas kaudzes klases. Tomēr divi, kas jums jāzina ārpus šī, ir binārā kaudze un d-āra kaudze.
Binārais kaudze
Binārais kaudze ir līdzīga šai galvenajai kaudzei, bet ar vairāk ierobežojumiem. Binārajai kaudzei jo īpaši jābūt pilnam kokam. Nejauciet pilnu koku un pilnu koku.
d-āra kaudze
Binārā kaudze ir 2-āru kaudze. Kaudze, kurā katram mezglam ir 3 bērni, ir 3-āru kaudze. Kaudze, kurā katram mezglam ir 4 bērni, ir 4-āru kaudze utt. D-āra kaudzei ir citi ierobežojumi.
Secinājums
Kaudze ir pilnīgs vai gandrīz pilnīgs binārs koks, kas apmierina kaudzes īpašību. Kaudzes īpašumam ir 2 alternatīvas: lai iegūtu maksimālo kaudzi, vecākiem jābūt vienādam vai lielākam par vērtību nekā tuvākajiem bērniem; Lai iegūtu min-kaudzi, vecāku vērtībai jābūt vienādai vai mazākai par tiešajiem bērniem. Kaudzi var attēlot kā koku vai masīvā. Saknes mezgls, kas attēlots masīvā, ir masīva pirmais mezgls; un, ja mezgls atrodas indeksā n, tā pirmais bērns masīvā atrodas indeksā 2n + 1 un nākamais bērns ir indeksā 2n + 2. Kaudzei ir noteiktas operācijas, kas tiek veiktas masīvā.
Chrys