Datastrukturer og algoritmer

Vejledning i Heap-datastruktur

Vejledning i Heap-datastruktur
Data er et sæt værdier. Data kan indsamles og placeres i en række eller i en kolonne eller i en tabel eller i form af et træ. Datastrukturen er ikke kun placering af data i nogen af ​​disse former. I computing er datastrukturen et af disse formater plus forholdet mellem værdierne plus de operationer (funktioner), der udføres på værdierne. Du bør allerede have grundlæggende viden om trædatastruktur, før du kommer her, da begreberne der vil blive brugt her med ringe eller ingen forklaring. Hvis du ikke har den viden, skal du læse vejledningen med titlen Tree Data Structure Tutorial for Beginners på linket https: // linuxhint.com / tree_data_structure_tutorial_beginners /. Derefter skal du fortsætte med at læse denne vejledning.En bunke-datastruktur er et komplet eller næsten komplet binært træ, hvor barnet til hver node er lig med eller mindre i værdi end værdien af ​​dets overordnede. Alternativt er det et sådant træ, hvor værdien af ​​en forælder er lig med eller mindre end værdien af ​​et af dets børn. Værdien (datum) for et træ kaldes også nøglen.

Illustration af bunke datastrukturer

Der er to typer dynger: en max-bunke og en min-bunke. En maks-bunke-struktur er, hvor den maksimale værdi er roden, og værdierne bliver mindre, når træet nedstammer; enhver forælder er enten lig med eller større i værdi end nogen af ​​sine nærmeste børn. En min-bunke-struktur er hvor minimumsværdien er roden, og værdierne bliver større, når træet nedstammer; enhver forælder er enten lig med eller mindre i værdi end nogen af ​​sine nærmeste børn. I de følgende diagrammer er den første en maks-bunke, og den anden er en min-bunke:

For begge dynger skal du bemærke, at det for et par børn ikke betyder noget, om den ene til venstre er den større værdi. En række i et niveau i træet skal ikke nødvendigvis udfyldes fra minimum til maksimum fra venstre; det er ikke nødvendigvis også fyldt fra maksimum til minimum fra venstre.

Repræsenterer en bunke i en matrix

For at software nemt kan bruge en bunke, skal bunken være repræsenteret i en matrix. Den maksimale bunke ovenfor, der er repræsenteret i en matrix, er:

89, 85, 87, 84, 82, 79, 73, 80, 81,,, 65, 69

Dette gøres begyndende med rodværdien som den første værdi for arrayet. Værdierne placeres kontinuerligt ved at læse træet fra venstre mod højre, fra top til bund. Hvis et element er fraværende, springes dets position i arrayet over. Hver knude har to børn. Hvis en node er ved indeks (position) n, er dens første barn i arrayet ved indeks 2n + 1, og dets næste barn er ved indeks 2n + 2. 89 er ved indeks 0; dets første barn, 85 er i indeks 2 (0) + 1 = 1, mens dets andet barn er i indeks 2 (0) + 2 = 2. 85 er ved indeks 1; dets første barn, 84, er i indeks 2 (1) + 1 = 3, mens dets andet barn, 82 er i indeks 2 (1) + 2 = 4. 79 er ved indeks 5; dets første barn, 65 er ved indeks 2 (5) + 1 = 11, mens dets andet barn er på indeks 2 (5) + 2 = 12. Formlerne anvendes på resten af ​​elementerne i arrayet.

En sådan matrix, hvor betydningen af ​​et element og forholdet mellem elementerne er underforstået af elementets position, kaldes en implicit datastruktur.

Den implicitte datastruktur for ovenstående min-bunke er:

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

Ovenstående max-heap er et komplet binært træ, men ikke et fuldt binært træ. Derfor er nogle placeringer (positioner) tomme i arrayet. For et komplet binært træ vil ingen placering være tom i arrayet.

Nu, hvis bunken var et næsten komplet træ, for eksempel hvis værdien 82 manglede, ville matrixen være:

89, 85, 87, 84,, 79, 73, 80, 81,,, 65, 69

I denne situation er tre steder tomme. Formlerne er dog stadig gældende.

Operationer

En datastruktur er et dataformat (f.eks.g. et træ) plus forholdet mellem værdierne plus de operationer (funktioner), der udføres på værdierne. For en bunke er forholdet, der løber gennem hele bunken, at forældren skal være lig med eller større i værdi end børnene for en maksimal bunke; og forældren skal være lig med eller mindre i værdi end børnene for en min bunke. Dette forhold kaldes bunkeejendom. Driften af ​​en bunke er grupperet under overskrifterne Oprettelse, Grundlæggende, Intern og Inspektion. Et resumé af bunkeoperationerne følger:

Oversigt over bunkeoperationer

Der er visse softwarehandlinger, der er almindelige med dynger, som følger:

Oprettelse af en bunke

create_heap: Oprettelse af en bunke betyder, at der dannes et objekt, der repræsenterer bunken. På C-sproget kan du oprette en bunke med struct-objekttypen. Et af medlemmerne af strukturen vil være bunke-arrayet. Resten af ​​medlemmerne er funktioner (operationer) til bunken. Create_heap betyder at oprette en tom bunke.

Heapify: Heap-arrayet er et delvist sorteret (ordnet) array. Heapify betyder, tilvejebring et heap-array fra et usorteret array - se detaljer nedenfor.

Fletning: Dette betyder, dann en unionsbunke fra to forskellige dynger - se detaljer nedenfor. De to bunke skal begge være max-heap eller begge min-bunke. Den nye bunke er i overensstemmelse med bungejendommen, mens de originale bunke er bevaret (ikke slettet).

Meldt: Dette betyder, at du slutter dig til to dynger af samme type for at danne en ny og opretholder duplikater - se detaljer nedenfor. Den nye bunke er i overensstemmelse med bungejendom, mens de oprindelige bunker ødelægges (slettes). Den største forskel mellem sammenfletning og sammensmeltning er, at ved sammenmeltning passer det ene træ til et undertræ til roden af ​​det andet træ, hvilket tillader duplikatværdier i det nye træ, mens der til sammenfletning dannes et nyt dyngetræ, der fjerner dubletter. Der er ikke behov for at vedligeholde de to originale dynger med melding.

Grundlæggende bunkeoperationer

find_max (find_min): Find den maksimale værdi i max-heap-arrayet, og returner en kopi, eller find den minimale værdi i min-heap-arrayet og returner en kopi.

Indsæt: Føj et nyt element til bunkearrayet, og omarranger arrayet, så diagrammets bunkeegenskab opretholdes.

extract_max (extract_min): Find den maksimale værdi i max-heap-arrayet, fjern og returner den; eller find minimumsværdien i min-heap-arrayet, fjern og returner den.

delete_max (delete_min): Find rodknudepunktet for en max-heap, som er det første element i max-heap-arrayet, fjern det uden nødvendigvis at returnere det; eller find rodknudepunktet på en min-bunke, som er det første element i min-bunke-arrayet, fjern den uden nødvendigvis at returnere den;

Udskift: Find rodknudepunktet på en af ​​bunkerne, fjern den og udskift den med en ny. Det betyder ikke noget, om den gamle rod returneres.

Interne bunkeoperationer

forhøje_nøgle (reducere_nøgle): Forøg værdien af ​​en hvilken som helst node for en max-heap og omarranger, så heap-egenskaben opretholdes, eller reducer værdien af ​​en hvilken som helst node for en min-heap og omarranger, så heap-ejendommen opretholdes.

Slet: slet enhver knude, og omarranger derefter, så heap-egenskaben opretholdes for max-heap eller en min-heap.

shift_up: flyt en node op i en max-bunke eller min-bunke, så længe det er nødvendigt, omarrangere for at opretholde bunkeegenskaben.

shift_down: flyt en node ned i en max-bunke eller min-bunke, så længe det er nødvendigt, omarrangere for at opretholde heap-ejendommen.

Inspektion af en bunke

Størrelse: Dette returnerer antallet af nøgler (værdier) i en bunke; det inkluderer ikke de tomme placeringer i bunkearrayet. En bunke kan repræsenteres ved hjælp af kode, som i diagrammet, eller med en matrix.

er tom: Dette returnerer boolsk sand, hvis der ikke er nogen node i en bunke, eller boolsk falsk, hvis bunken har mindst en node.

Sigtning i en bunke

Der sigtes op og sigtes ned:

Sigt op: Dette betyder at bytte en node med sin overordnede. Hvis bunkeegenskaben ikke er opfyldt, skal du bytte forælder med sin egen forælder. Fortsæt denne vej i stien, indtil bunkejendommen er tilfreds. Proceduren når muligvis roden.

Sigt ned: Dette betyder at bytte en node af stor værdi med den mindste af sine to børn (eller et barn til en næsten komplet bunke). Hvis heap-ejendommen ikke er opfyldt, skal du bytte den nederste node med den mindre node af sine egne to børn. Fortsæt denne vej i stien, indtil bunkejendommen er tilfreds. Proceduren når muligvis et blad.

Hæmmende

Heapify betyder at sortere et usorteret array for at få heap-ejendommen opfyldt for max-heap eller min-heap. Dette betyder, at der muligvis er nogle tomme placeringer i det nye array. Den grundlæggende algoritme til at heapify en max-heap eller min-heap er som følger:

- hvis rodknudepunktet er mere ekstremt end en af ​​dets barns knudepunkter, skal du udveksle roden med den mindre ekstreme barneknude.

- Gentag dette trin med børneknudepunkterne i en forudbestillingsskema for trækørsel.

Det sidste træ er et bunketræ, der tilfredsstiller bungejendom. En bunke kan repræsenteres som et trædiagram eller i en matrix. Den resulterende bunke er et delvist sorteret træ, dvs.e. et delvist sorteret array.

Heap Operation Detaljer

Dette afsnit af artiklen giver detaljer om bunkeoperationer.

Oprettelse af en bunkeoplysninger

create_heap

Se ovenfor!

heapify

Se ovenfor

fusionere

Hvis bunken arrays,

89, 85, 87, 84, 82, 79, 73, 80, 81,,, 65, 69

og

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

bliver slået sammen, kan resultatet være uden duplikater,

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

Efter noget sigtning. Bemærk, at 82 i det første array ikke har børn. I det resulterende array er det ved indeks 4; og dets placeringer ved indeks 2 (4) + 1 = 9 og 2 (4) + 2 = 10 er ledige. Dette betyder, at det heller ikke har børn i det nye trædiagram. De to oprindelige bunker bør ikke slettes, da deres oplysninger ikke er i den nye bunke (nyt array). Den grundlæggende algoritme til at flette dynger af samme type er som følger:

- Deltag i et array til bunden af ​​det andet array.

- Heapify fjerner duplikater og sørger for, at noder, der ikke havde børn i de originale dynger, stadig ikke har børn i den nye bunke.

meld

Algoritmen til at smelte to dynger af samme type (enten to max- eller to min-) er som følger:

- Sammenlign de to rodknudepunkter.

- Lav den mindre ekstreme rod og resten af ​​dens træ (undertræ), det andet barn til den ekstreme rod.

- Sigt det omstrejfede barn fra roden til nu det ekstreme undertræ, nedad i det ekstreme undertræ.

Den resulterende bunke er stadig i overensstemmelse med bungejendom, mens de oprindelige bunker destrueres (slettes). De originale dynger kan ødelægges, fordi al information de besidder stadig findes i den nye bunke.

Grundlæggende bunkeoperationer

find_max (find_min)

Dette betyder at lokalisere den maksimale værdi i max-heap-arrayet og returnere en kopi eller lokalisere minimumsværdien i min-heap-arrayet og returnere en kopi. En bunkeopstilling opfylder pr. Definition allerede bunkeegenskaben. Så returner bare en kopi af det første element i arrayet.

indsæt

Dette betyder at tilføje et nyt element til bunkearrayet og omarrangere arrayet, så diagrammets bueegenskab opretholdes (opfyldt). Algoritmen til at gøre dette for begge typer dynger er som følger:

- Antag et fuldt binært træ. Dette betyder, at matrixen skal udfyldes i slutningen med tomme placeringer, hvis det er nødvendigt. Det samlede antal noder for en fuld bunke er 1, eller 3 eller 7 eller 15 eller 31 osv.; fortsæt med at fordoble og tilføje 1.

- Sæt knudepunktet på det mest egnede tomme sted efter størrelse, mod slutningen af ​​bunken (mod slutningen af ​​bunkearrayet). Hvis der ikke er nogen tom placering, skal du starte en ny række nederst til venstre.

- Sigt op, hvis det er nødvendigt, indtil bunkejendom er opfyldt.

extract_max (ekstrakt_min)

Find den maksimale værdi i max-heap-arrayet, fjern og returner den; eller find minimumsværdien i min-heap-arrayet, fjern og returner den. Algoritmen til extract_max (extract_min) er som følger:

- Fjern rodnoden.

- Tag (fjern) den nederste højre node (sidste node i arrayet) og placer den ved roden.

- Sigt ned efter behov, indtil bunkejendom er opfyldt.

delete_max (delete_min)

Find rodknudepunktet for en max-heap, som er det første element i max-heap-arrayet, fjern det uden nødvendigvis at returnere det; eller find rodknudepunktet på en min-bunke, som er det første element i min-bunke-arrayet, fjern den uden nødvendigvis at returnere den. Algoritmen til at slette rodnoden er som følger:

- Fjern rodnoden.

- Tag (fjern) den nederste højre node (sidste node i arrayet) og placer den ved roden.

- Sigt ned efter behov, indtil bunkejendom er opfyldt.

erstatte

Find rodknudepunktet på en af ​​bunkerne, fjern den og udskift den med den nye. Det betyder ikke noget, om den gamle rod returneres. Sigt ned, hvis det er relevant, indtil bunkejendom er opfyldt.

Interne bunkeoperationer

stigningstast (faldstast)

Forøg værdien af ​​en hvilken som helst node for en max-heap og omarranger, så heap-ejendommen opretholdes, eller reducer værdien af ​​en hvilken som helst node for en min-heap og omarranger, så beap-egenskaben opretholdes. Sigt op eller ned efter behov, indtil bunkejendom er tilfreds.

slet

Fjern noden af ​​interesse, og omarranger derefter, så bunkeegenskaben opretholdes for max-bunken eller en min-bunken. Algoritmen til at slette en node er som følger:

- Fjern noden af ​​interesse.

- Tag (fjern) den nederste højre hjørne (sidste knude i matrixen) og placer ved indekset på den fjernede knude. Hvis den slettede node er i sidste række, er dette muligvis ikke nødvendigt.

- Sigt op eller ned efter behov, indtil bunkejendom er opfyldt.

shift_up

Flyt en node op i en max-bunke eller min-bunke, så længe det er nødvendigt, omarranger for at opretholde bunkeegenskaben - sigt op.

geare ned

Flyt en node ned i en max-bunke eller min-bunke, så længe det er nødvendigt, omarranger for at opretholde bunkeegenskaben - sigt ned.

Inspektion af en bunke

størrelse

Se ovenfor!

er tom

Se ovenfor!

Andre klasser af dynger

Bunken beskrevet i denne artikel kan betragtes som den vigtigste (generelle) bunke. Der er andre klasser af dynger. Imidlertid er de to, som du bør kende ud over dette, den binære bunke og den d-ary bunke.

Binær bunke

Den binære bunke svarer til denne hovedbunke, men med flere begrænsninger. Især skal den binære bunke være et komplet træ. Forveks ikke mellem et komplet træ og et fuldt træ.

d-ary Bunke

En binær bunke er en 2-ary bunke. En bunke, hvor hver node har 3 børn, er en 3-ary bunke. En bunke, hvor hver knude har 4 børn, er en 4-arig bunke og så videre. En d-ary bunke har andre begrænsninger.

Konklusion

En bunke er et komplet eller næsten komplet binært træ, der tilfredsstiller bunkeegenskaben. Heapsejendommen har to alternativer: for en max-heap skal en forælder være lig med eller større i værdi end de umiddelbare børn; for en min-bunke skal en forælder være lig med eller mindre i værdi end de umiddelbare børn. En bunke kan repræsenteres som et træ eller i en matrix. Når den er repræsenteret i en matrix, er rodnoden den første node i matrixen; og hvis en node er ved indeks n, er dens første barn i arrayet ved indeks 2n + 1, og dets næste barn er ved indeks 2n + 2. En bunke har visse operationer, der udføres på arrayet.

Chrys

Mus AppyMouse pegefelt på skærmen og musemarkør til Windows-tablets
AppyMouse pegefelt på skærmen og musemarkør til Windows-tablets
Tabletbrugere savner ofte musemarkøren, især når de er vante til at bruge bærbare computere. Touchscreen-smartphones og tablets har mange fordele, og ...
Mus Midterste museknap fungerer ikke i Windows 10
Midterste museknap fungerer ikke i Windows 10
Det midterste museknap hjælper dig med at rulle gennem lange websider og skærme med en masse data. Hvis det stopper, vil du ende med at bruge tastatur...
Mus Sådan ændres venstre og højre museknap på Windows 10-pc
Sådan ændres venstre og højre museknap på Windows 10-pc
Det er en ganske normal, at alle computermusenheder er ergonomisk designet til højrehåndede brugere. Men der er musenheder til rådighed, der er specie...