Datové struktury a algoritmy

Výukový program haldy datové struktury

Výukový program haldy datové struktury
Data jsou množinou hodnot. Data lze sbírat a vkládat do řádků, sloupců, tabulek nebo stromů. Struktura dat není jen umístění dat v žádné z těchto forem. Ve výpočtech je datovou strukturou libovolný z těchto formátů, plus vztah mezi hodnotami plus operace (funkce) prováděné s hodnotami. Před příchodem sem byste měli mít základní znalosti o datové struktuře stromu, protože zde použité pojmy budou použity s malým nebo žádným vysvětlením. Pokud tyto znalosti nemáte, přečtěte si tutoriál s názvem Výukový program stromové datové struktury pro začátečníky na odkazu https: // linuxhint.com / tree_data_structure_tutorial_začátečníci /. Poté pokračujte ve čtení tohoto kurzu.Struktura haldy dat je úplný nebo téměř úplný binární strom, kde je podřízený prvek každého uzlu stejný nebo menší v hodnotě než hodnota jeho rodiče. Alternativně je to takový strom, kde hodnota rodiče je stejná nebo menší než hodnota kteréhokoli z jejích podřízených. Hodnota (vztažný bod) stromu se také nazývá klíč.

Ilustrace haldy datových struktur

Existují dva typy hromád: maximální hromada a minimální hromada. Struktura max-haldy je místo, kde maximální hodnotou je kořen a hodnoty se zmenšují, jak je strom sestupován; jakýkoli rodič má stejnou nebo větší hodnotu než kterékoli z jeho bezprostředních dětí. Struktura min-haldy je místo, kde minimální hodnota je kořen a hodnoty se zvětšují, jak je strom sestupován; jakýkoli rodič má stejnou nebo menší hodnotu než kterékoli z jeho bezprostředních dětí. V následujících diagramech je první halda max a druhá halda min:

U obou hromád si všimněte, že u dvojice dětí nezáleží na tom, zda je ta levá hodnota větší. Řádek na úrovni stromu nemusí být nutně vyplněn od minima po maximum zleva; není také nutně vyplněn z maxima na minimum, zleva.

Představující hromadu v poli

Aby software mohl snadno použít haldu, musí být halda zastoupena v poli. Maximální hromada výše, představovaná v poli, je:

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

To se děje počínaje kořenovou hodnotou jako první hodnotou pro pole. Hodnoty jsou průběžně umisťovány čtením stromu zleva doprava, shora dolů. Pokud prvek chybí, jeho poloha v poli se přeskočí. Každý uzel má dvě děti. Pokud je uzel na indexu (pozici) n, jeho první dítě v poli je na indexu 2n + 1 a jeho další dítě je na indexu 2n + 2. 89 je na indexu 0; jeho první dítě, 85 je na indexu 2 (0) + 1 = 1, zatímco jeho druhé dítě je na indexu 2 (0) + 2 = 2. 85 je na indexu 1; jeho první dítě, 84, je na indexu 2 (1) + 1 = 3, zatímco jeho druhé dítě, 82, je na indexu 2 (1) + 2 = 4. 79 je na indexu 5; jeho první dítě, 65 je na indexu 2 (5) + 1 = 11, zatímco jeho druhé dítě je na indexu 2 (5) + 2 = 12. Vzorce se použijí na zbytek prvků v poli.

Takové pole, kde je význam prvku a vztah mezi prvky implikován pozicí prvku, se nazývá implicitní datová struktura.

Implicitní datová struktura pro výše uvedenou min haldu je:

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

Výše uvedená max-halda je úplný binární strom, ale ne úplný binární strom. Proto jsou některá místa (pozice) v poli prázdná. U úplného binárního stromu nebude v poli prázdné žádné místo.

Nyní, pokud by halda byla téměř úplným stromem, například kdyby chyběla hodnota 82, pak by toto pole bylo:

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

V této situaci jsou tři místa prázdná. Vzorce jsou však stále použitelné.

Operace

Datová struktura je formát dat (např.G. strom), plus vztah mezi hodnotami plus operace (funkce) prováděné s hodnotami. U haldy je relací, která prochází celou haldou, že nadřazený musí mít stejnou nebo větší hodnotu než děti, pro maximální haldu; a nadřazená položka musí mít stejnou nebo menší hodnotu než děti, pokud jde o minimální hromadu. Tento vztah se nazývá vlastnost haldy. Operace haldy jsou seskupeny pod nadpisy Stvoření, Základní, Interní a Inspekce. Následuje souhrn operací haldy:

Shrnutí operací haldy

Existují určité softwarové operace, které jsou společné s hromadami, a to následovně:

Vytvoření hromady

create_heap: Vytvoření haldy znamená vytvoření objektu, který představuje haldu. V jazyce C můžete vytvořit haldu s typem objektu struktury. Jedním z členů struktury bude haldy pole. Zbytek členů budou funkce (operace) pro haldu. Create_heap znamená vytvoření prázdné hromady.

Heapify: Pole haldy je částečně seřazené (seřazené) pole. Heapify znamená, poskytnout pole haldy z netříděného pole - viz podrobnosti níže.

Sloučit: To znamená, vytvořit hromadu odborů ze dvou různých hromad - viz podrobnosti níže. Obě hromady by měly být jak maximální, tak minimální. Nová halda je v souladu s vlastností haldy, zatímco původní hromady jsou zachovány (nevymazány).

Meld: To znamená, spojit dvě hromady stejného typu a vytvořit novou, zachovat duplikáty - viz podrobnosti níže. Nová halda je v souladu s vlastností haldy, zatímco původní hromady jsou zničeny (vymazány). Hlavní rozdíl mezi slučováním a meldingem je ten, že pro melding se jeden strom hodí jako podstrom ke kořenu druhého stromu, což umožňuje duplicitní hodnoty v novém stromu, zatímco pro sloučení se vytvoří nový haldy a odstraní duplikáty. Není třeba udržovat dvě původní hromady tavením.

Základní operace haldy

find_max (find_min): Vyhledejte maximální hodnotu v poli max-heap a vraťte kopii, nebo vyhledejte minimální hodnotu v poli min-heap a vraťte kopii.

Vložit: Přidejte nový prvek do pole haldy a uspořádejte pole tak, aby byla zachována vlastnost haldy diagramu.

extract_max (extract_min): Vyhledejte maximální hodnotu v poli max-heap, odeberte ji a vraťte; nebo vyhledejte minimální hodnotu v poli min-heap, odeberte ji a vraťte ji.

delete_max (delete_min): Vyhledejte kořenový uzel max-haldy, která je prvním prvkem pole max-heap, odeberte jej, aniž byste jej museli nutně vracet; nebo vyhledejte kořenový uzel min-haldy, což je první prvek pole min-heap, odeberte jej bez nutnosti jeho vrácení;

Nahradit: Vyhledejte kořenový uzel kterékoli haldy, odeberte jej a nahraďte novým. Nezáleží na tom, zda je vrácen starý kořen.

Operace vnitřní haldy

increase_key (pokles_klíč): Zvyšte hodnotu libovolného uzlu pro max-haldu a přeskupte tak, aby byla zachována vlastnost haldy, nebo snižte hodnotu libovolného uzlu pro min-haldu a přeskupte, aby byla zachována vlastnost haldy.

Odstranit: odstranit libovolný uzel a poté změnit uspořádání, aby byla zachována vlastnost haldy pro maximální haldu nebo minimální haldu.

shift_up: přesunout uzel nahoru v haldě max nebo haldy tak dlouho, jak je potřeba, přeskupit, aby se zachovala vlastnost haldy.

shift_down: přesunout uzel dolů v haldě max nebo haldy tak dlouho, jak je potřeba, přeskupit, aby se zachovala vlastnost haldy.

Inspekce hromady

Velikost: Tím se vrátí počet klíčů (hodnot) v hromadě; nezahrnuje prázdná umístění haldy pole. Halda může být reprezentována kódem, jako v diagramu, nebo pomocí pole.

je prázdný: To vrátí logickou hodnotu true, pokud v haldě není žádný uzel, nebo logickou hodnotu false, pokud má halda alespoň jeden uzel.

Prosévání hromady

K dispozici je třídění nahoru a třídění dolů:

Sift-Up: To znamená vyměnit uzel za nadřazený. Pokud vlastnost haldy není splněna, vyměňte nadřazenou položku za vlastní nadřazenou položku. Pokračujte tímto způsobem v cestě, dokud není vlastnost haldy splněna. Postup může dosáhnout kořene.

Sift-Down: To znamená, že vyměníte uzel velké hodnoty s menším ze svých dvou dětí (nebo s jedním dítětem za téměř úplnou hromadu). Pokud vlastnost haldy není splněna, vyměňte dolní uzel s menším uzlem vlastních dvou podřízených. Pokračujte tímto způsobem v cestě, dokud není vlastnost haldy splněna. Postup může dosáhnout listu.

Heapifying

Heapify znamená seřadit netříděné pole, aby byla vlastnost haldy splněna pro maximální haldu nebo minimální haldu. To znamená, že v novém poli mohou být prázdná místa. Základní algoritmus pro heapifikaci max-haldy nebo min-haldy je následující:

- pokud je kořenový uzel extrémnější než kterýkoli z jeho podřízených uzlů, vyměňte kořen s méně extrémním podřízeným uzlem.

- Opakujte tento krok s podřízenými uzly ve schématu procházení stromu předobjednávky.

Konečný strom je halda, která splňuje vlastnost haldy. Halda může být reprezentována jako stromový diagram nebo v poli. Výsledná hromada je částečně tříděný strom, tj.E. částečně seřazené pole.

Podrobnosti operace haldy

Tato část článku poskytuje podrobnosti o haldy.

Vytvoření hromady podrobností

create_heap

Viz výše!

heapify

Viz výše

spojit

Pokud je halda pole,

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

a

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

jsou sloučeny, výsledek bez duplikátů může být,

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

Po nějakém prosívání. Všimněte si, že v prvním poli 82 nemá žádné děti. Ve výsledném poli je na indexu 4; a jeho umístění v indexu 2 (4) + 1 = 9 a 2 (4) + 2 = 10 jsou prázdná. To znamená, že také nemá děti v novém stromovém diagramu. Původní dvě hromady by neměly být odstraněny, protože jejich informace nejsou ve skutečnosti v nové hromadě (nové pole). Základní algoritmus pro sloučení hromad stejného typu je následující:

- Připojte jedno pole ke spodní části druhého pole.

- Heapify eliminuje duplikáty a zajišťuje, že uzly, které neměly děti v původní hromadě, stále nemají děti v nové haldě.

splynout

Algoritmus pro spojení dvou hromád stejného typu (buď dvě max- nebo dvě min-) je následující:

- Porovnejte dva kořenové uzly.

- Vytvořte méně extrémní kořen a zbytek jeho stromu (podstrom), druhé dítě extrémního kořene.

- Posuňte zbloudilé dítě kořene nyní extrémního podstromu dolů v extrémním podstromu.

Výsledná halda je stále ve shodě s vlastností haldy, zatímco původní hromady jsou zničeny (vymazány). Původní hromady mohou být zničeny, protože všechny informace, které mají, jsou stále v nové hromadě.

Základní operace haldy

find_max (find_min)

To znamená vyhledat maximální hodnotu v poli maximální haldy a vrátit kopii nebo vyhledat minimální hodnotu v poli minimální haldy a vrátit kopii. Pole haldy podle definice již splňuje vlastnost haldy. Stačí tedy vrátit kopii prvního prvku pole.

vložit

To znamená přidat do pole haldy nový prvek a uspořádat pole tak, aby byla zachována vlastnost haldy diagramu (splněno). Algoritmus, jak toho dosáhnout u obou typů hromad, je následující:

- Předpokládejme plný binární strom. To znamená, že pole musí být na konci vyplněno prázdnými místy, pokud je to nutné. Celkový počet uzlů celé hromady je 1, nebo 3 nebo 7 nebo 15 nebo 31 atd.; neustále zdvojnásobujte a přidávejte 1.

- Umístěte uzel na nejvhodnější prázdné místo o velikost směrem ke konci haldy (ke konci haldy). Pokud není prázdné místo, začněte nový řádek zleva dole.

- Je-li to nutné, projděte se, dokud není vlastnost haldy uspokojena.

extrahovat_max (extrahovat_min)

Vyhledejte maximální hodnotu v poli max-heap, odeberte ji a vraťte; nebo vyhledejte minimální hodnotu v poli min-heap, odeberte ji a vraťte ji. Algoritmus pro extrahování_max (extract_min) je následující:

- Odeberte kořenový uzel.

- Vezměte (odeberte) uzel zcela vpravo (poslední uzel v poli) a umístěte jej do kořenového adresáře.

- Podle potřeby propadejte, dokud není vlastnost haldy uspokojena.

delete_max (delete_min)

Vyhledejte kořenový uzel max-haldy, což je první prvek pole max-heap, odeberte jej, aniž byste jej nutně museli vracet; nebo vyhledejte kořenový uzel min-haldy, což je první prvek pole min-heap, odeberte jej, aniž byste jej museli nutně vracet. Algoritmus pro odstranění kořenového uzlu je následující:

- Odeberte kořenový uzel.

- Vezměte (odeberte) uzel zcela vpravo (poslední uzel v poli) a umístěte jej do kořenového adresáře.

- Podle potřeby propadejte, dokud není vlastnost haldy uspokojena.

nahradit

Vyhledejte kořenový uzel kterékoli haldy, odeberte jej a nahraďte novým. Nezáleží na tom, zda je vrácen starý kořen. Pokud je to vhodné, projděte dolů, dokud není vlastnost haldy splněna.

Operace vnitřní haldy

zvýšit_klíč (snížit_klíč)

Zvyšte hodnotu libovolného uzlu pro maximální haldu a přeskupte tak, aby byla zachována vlastnost haldy, nebo snižte hodnotu libovolného uzlu pro min. Haldu a přeskupte, aby byla zachována vlastnost haldy. Sift nahoru nebo dolů podle potřeby, dokud není vlastnost haldy uspokojena.

vymazat

Odeberte uzel zájmu a poté přeskupte, aby byla zachována vlastnost haldy pro maximální haldu nebo minimální haldu. Algoritmus pro odstranění uzlu je následující:

- Odeberte uzel zájmu.

- Take (remove) the right right bottom (last node in the array) and place at the index of the node deleted. Pokud je odstraněný uzel na posledním řádku, nemusí to být nutné.

- Sift nahoru nebo dolů podle potřeby, dokud není vlastnost haldy uspokojena.

shift_up

Přesuňte uzel nahoru v haldě max nebo haldy tak dlouho, jak je potřeba, přeskupením, abyste udrželi vlastnost haldy - prosít nahoru.

Posunout dolů

Přesuňte uzel dolů v haldě max nebo haldy tak dlouho, jak je potřeba, přeskupením, abyste udrželi vlastnost haldy - sift down.

Inspekce hromady

velikost

Viz výše!

je prázdný

Viz výše!

Ostatní třídy hromád

Haldu popsanou v tomto článku lze považovat za hlavní (obecnou) haldu. Existují i ​​jiné třídy hromád. Kromě toho byste ale měli vědět dva - Binary Heap a D-Ary Heap.

Binární halda

Binární halda je podobná této hlavní haldě, ale má více omezení. Zejména binární halda musí být úplný strom. Nezaměňujte mezi úplným stromem a plným stromem.

d-ary halda

Binární halda je 2-hromová hromada. Hromada, kde má každý uzel 3 děti, je hromada 3-ary. Halda, kde má každý uzel 4 děti, je halda se 4 ary atd. Halda typu d-ary má další omezení.

Závěr

Halda je úplný nebo téměř úplný binární strom, který splňuje vlastnost haldy. Vlastnost haldy má 2 alternativy: pro haldu max musí mít nadřazená hodnota stejnou nebo větší hodnotu než bezprostřední podřízené položky; pro hromadu min musí mít rodič stejnou nebo menší hodnotu než nejbližší děti. Halda může být reprezentována jako strom nebo v poli. Když je zastoupen v poli, kořenový uzel je první uzel pole; a pokud je uzel na indexu n, jeho první dítě v poli je na indexu 2n + 1 a jeho další dítě je na indexu 2n + 2. Halda má určité operace, které jsou prováděny na poli.

Chrys

Top 5 ergonomických produktů pro počítačové myši pro Linux
Způsobuje dlouhodobé používání počítače bolest zápěstí nebo prstů? Trpíte ztuhlými klouby a neustále si musíte třást ruce? Cítíte pálivou bolest pokaž...
Jak změnit nastavení myši a touchpadu pomocí Xinput v Linuxu
Většina linuxových distribucí je ve výchozím nastavení dodávána s knihovnou „libinput“ pro zpracování vstupních událostí v systému. Může zpracovávat v...
Přemapujte tlačítka myši odlišně pro jiný software pomocí ovládání myší X-Mouse
Možná potřebujete nástroj, který by mohl změnit ovládání myši u každé aplikace, kterou používáte. V takovém případě můžete vyzkoušet aplikaci s názvem...