Datu struktūras un algoritmi

Kaudzes datu struktūras apmācība

Kaudzes datu struktūras apmācība
Dati ir vērtību kopa. Datus var apkopot un ievietot rindā, kolonnā, tabulā vai koka formā. Datu struktūra nav tikai datu izvietošana kādā no šīm formām. Aprēķinot, datu struktūra ir jebkurš no šiem formātiem, kā arī attiecība starp vērtībām un operācijas (funkcijas), kas tiek veiktas ar vērtībām. Pirms nākat šeit, jums jau vajadzētu būt pamatzināšanām par koku datu struktūru, jo šeit esošie jēdzieni tiks izmantoti ar nelielu paskaidrojumu vai bez tā. Ja jums nav šo zināšanu, tad saitē https: // linuxhint izlasiet pamācību koku datu struktūras apmācība iesācējiem.com / tree_data_structure_tutorial_beginners /. Pēc tam turpiniet lasīt šo apmācību.Kaudzes datu struktūra ir pilnīgs vai gandrīz pilnīgs binārs koks, kur katra mezgla bērns ir vienāds ar vērtību vai mazāks par tā vecāka vērtību. Alternatīvi, tas ir tāds koks, kurā vecāku vērtība ir vienāda vai mazāka par jebkura viņa bērna vērtību. Koka vērtību (atskaites punktu) sauc arī par atslēgu.

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. lpp

Tas 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. lpp

Iepriekš 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. lpp

un

89., 85., 84., 73., 79., 80., 83., 65., 68., 70., 71. lpp

ir apvienoti, rezultāts bez dublikātiem var būt,

89., 85., 87., 84., 82., 83., 81., 80., 79., 73., 68., 65., 69., 70., 71

Pē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

Atdariniet peles klikšķus, virzot kursoru, izmantojot operētājsistēmā Windows 10 bezklikšķu peli
Peles vai tastatūras lietošana nepareizā pozā, ja to lieto pārmērīgi daudz, var izraisīt daudz veselības problēmu, tostarp spriedzi, karpālā kanāla si...
Pievienojiet peles žestus operētājsistēmai Windows 10, izmantojot šos bezmaksas rīkus
Pēdējos gados datori un operētājsistēmas ir ievērojami attīstījušās. Bija laiks, kad lietotājiem bija jāizmanto komandas, lai pārvietotos pa failu pār...
Kontrolējiet un pārvaldiet peles kustību starp vairākiem monitoriem sistēmā Windows 10
Dual Display Mouse Manager ļauj kontrolēt un konfigurēt peles kustību starp vairākiem monitoriem, palēninot tās kustību robežas tuvumā. Windows 10/8 ļ...