Struktury danych i algorytmy

Samouczek dotyczący struktury danych sterty

Samouczek dotyczący struktury danych sterty
Dane to zbiór wartości. Dane mogą być gromadzone i umieszczane w rzędzie, kolumnie, tabeli lub w formie drzewa. Struktura danych to nie tylko rozmieszczenie danych w którejkolwiek z tych form. W obliczeniach struktura danych to dowolny z tych formatów plus relacja między wartościami oraz operacje (funkcje) wykonywane na wartościach. Powinieneś już mieć podstawową wiedzę na temat struktury danych drzewa przed przyjazdem tutaj, ponieważ pojęcia tam będą używane tutaj bez wyjaśnienia lub z niewielkim wyjaśnieniem. Jeśli nie masz tej wiedzy, przeczytaj samouczek zatytułowany Tree Data Structure Tutorial dla początkujących, dostępny pod linkiem https://linuxhint.com/tree_data_structure_tutorial_beginners/. Następnie kontynuuj czytanie tego samouczka.Struktura danych sterty jest kompletnym lub prawie kompletnym drzewem binarnym, w którym potomek każdego węzła ma taką samą lub mniejszą wartość niż wartość jego rodzica. Alternatywnie jest to takie drzewo, w którym wartość rodzica jest równa lub mniejsza niż wartość któregokolwiek z jego dzieci its. Wartość (punkt odniesienia) drzewa nazywana jest również kluczem.

Ilustracja struktur danych sterty

Istnieją dwa rodzaje hałd: hałda maksymalna i hałda minimalna. Struktura max-heap to miejsce, w którym maksymalna wartość to korzeń, a wartości stają się mniejsze w miarę schodzenia drzewa; każdy rodzic ma taką samą lub większą wartość niż którykolwiek z jego najbliższych dzieci. Struktura min-sterty to miejsce, w którym minimalną wartością jest korzeń, a wartości stają się większe wraz ze spadkiem drzewa; każdy rodzic ma taką samą lub mniejszą wartość niż którykolwiek z jego bezpośrednich dzieci. Na poniższych diagramach pierwszy to sterta maksymalna, a drugi to sterta minimalna:

W przypadku obu stosów zauważ, że dla pary dzieci nie ma znaczenia, czy ta po lewej ma większą wartość. Wiersz na poziomie w drzewie niekoniecznie musi być wypełniony od minimum do maksimum, od lewej; niekoniecznie jest też wypełniony od maksimum do minimum, od lewej strony.

Reprezentowanie stosu w tablicy

Aby oprogramowanie mogło łatwo korzystać ze sterty, musi być ona reprezentowana w postaci tablicy. Powyższa sterta max, reprezentowana w tablicy to:

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

Odbywa się to zaczynając od wartości głównej jako pierwszej wartości tablicy. Wartości są umieszczane w sposób ciągły poprzez odczytywanie drzewa od lewej do prawej, od góry do dołu. Jeśli element jest nieobecny, jego pozycja w tablicy jest pomijana. Każdy węzeł ma dwoje dzieci. Jeśli węzeł ma indeks (pozycja) n, jego pierwsze dziecko w tablicy ma indeks 2n+1, a następne dziecko ma indeks 2n+2. 89 jest w indeksie 0; jego pierwsze dziecko, 85 ma indeks 2(0)+1=1, podczas gdy drugie dziecko ma indeks 2(0)+2=2. 85 jest przy indeksie 1; jego pierwsze dziecko, 84, ma indeks 2(1)+1=3, podczas gdy drugie dziecko, 82, jest pod indeksem 2(1)+2=4. 79 jest przy indeksie 5; jego pierwsze dziecko, 65 ma indeks 2(5)+1=11, podczas gdy drugie dziecko ma indeks 2(5)+2=12. Formuły są stosowane do pozostałych elementów tablicy.

Taka tablica, w której znaczenie elementu i relacja między elementami jest implikowana przez położenie elementu, nazywana jest niejawną strukturą danych.

Niejawna struktura danych dla powyższego min-sterty to:

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

Powyższy max-heap jest kompletnym drzewem binarnym, ale nie pełnym drzewem binarnym. Dlatego niektóre lokalizacje (pozycje) są puste w tablicy. W przypadku pełnego drzewa binarnego żadna lokalizacja w tablicy nie będzie pusta.

Teraz, gdyby sterta była prawie kompletnym drzewem, na przykład, gdyby brakowało wartości 82, to tablica wyglądałaby tak:

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

W tej sytuacji trzy lokalizacje są puste. Jednak formuły nadal obowiązują.

Operacje

Struktura danych to format danych (e.sol. drzewo), plus związek między wartościami, plus operacje (funkcje) wykonywane na wartościach. W przypadku sterty relacja przebiegająca przez całą stertę polega na tym, że rodzic musi mieć taką samą lub większą wartość niż dzieci, dla sterty max; a rodzic musi mieć taką samą lub mniejszą wartość niż dzieci, na min-kupę. Ta relacja nazywana jest właściwością sterty. Operacje hałdy są pogrupowane pod nagłówkami Tworzenie, Podstawowe, Wewnętrzne i Kontroli. Podsumowanie operacji hałdy przedstawia się następująco:

Podsumowanie operacji na stercie

Istnieją pewne operacje programowe, które są wspólne ze stertami, takie jak:

Tworzenie stosu

create_heap: Tworzenie sterty oznacza tworzenie obiektu, który reprezentuje stertę. W języku C możesz utworzyć stertę z typem obiektu struct. Jednym z elementów struktury będzie tablica sterty. Reszta członków będzie funkcjami (operacjami) dla sterty. Create_heap oznacza tworzenie pustej sterty.

Heapify: tablica sterty jest częściowo posortowaną (uporządkowaną) tablicą. Heapify oznacza, podaj tablicę sterty z nieposortowanej tablicy - zobacz szczegóły poniżej.

Scalanie:  oznacza to utworzenie stosu łączącego z dwóch różnych stosów — zobacz szczegóły poniżej. Dwie sterty powinny być obiema kopiami maks. lub obiema min-stertami. Nowa sterta jest zgodna z właściwością sterty, podczas gdy oryginalne sterty są zachowywane (nie usuwane).

Połącz: oznacza to połączenie dwóch stosów tego samego typu, aby utworzyć nowy, zachowując duplikaty — zobacz szczegóły poniżej. Nowa sterta jest zgodna z właściwością sterty, podczas gdy oryginalne sterty są niszczone (skasowane). Główna różnica między łączeniem a łączeniem polega na tym, że w przypadku łączenia jedno drzewo pasuje jako poddrzewo do korzenia drugiego drzewa, umożliwiając zduplikowane wartości w nowym drzewie, podczas gdy w przypadku łączenia tworzone jest nowe drzewo sterty, usuwając duplikaty. Nie ma potrzeby utrzymywania dwóch oryginalnych stosów za pomocą meldingu.

Podstawowe operacje na stercie

find_max (find_min): Znajdź maksymalną wartość w tablicy max-heap i zwróć kopię lub znajdź minimalną wartość w tablicy min-heap i zwróć kopię.

Wstaw: Dodaj nowy element do tablicy sterty i zmień kolejność tablicy tak, aby zachowana została właściwość sterty diagramu.

extract_max (extract_min): Znajdź maksymalną wartość w tablicy max-heap, usuń ją i zwróć; lub znajdź minimalną wartość w tablicy min-heap, usuń ją i zwróć.

delete_max (delete_min): Zlokalizuj węzeł główny max-heap, który jest pierwszym elementem tablicy max-heap, usuń go bez konieczności zwracania; lub zlokalizuj węzeł główny min-sterty, który jest pierwszym elementem tablicy min-sterty, usuń go bez konieczności zwracania;

Zamień: Zlokalizuj węzeł główny dowolnej sterty, usuń go i zastąp nowym. Nie ma znaczenia, czy zwrócony zostanie stary korzeń.

Wewnętrzne operacje na stercie

Increase_key (decrease_key): Zwiększ wartość dowolnego węzła dla maksymalnej sterty i zmień kolejność, aby właściwość sterty została zachowana, lub zmniejsz wartość dowolnego węzła dla min-sterty i zmień kolejność, aby właściwość sterty została zachowana.

Usuń: usuń dowolny węzeł, a następnie zmień kolejność, aby właściwość sterty była zachowana dla sterty max lub min sterty.

shift_up: przenieś węzeł w górę w stercie max lub min tak długo, jak to konieczne, zmieniając kolejność, aby zachować właściwość sterty.

shift_down: przesuń węzeł w dół w maksymalnej lub minimalnej stercie tak długo, jak to konieczne, zmieniając kolejność, aby zachować właściwość sterty.

Inspekcja hałdy

Rozmiar: Zwraca liczbę kluczy (wartości) w stercie; nie zawiera pustych lokalizacji tablicy sterty. Sterta może być reprezentowana przez kod, jak na diagramie, lub za pomocą tablicy.

jest pusty: Zwraca Boolean true, jeśli nie ma węzła w stercie, lub boolean false, jeśli sterta ma co najmniej jeden węzeł.

Przesiewanie w kupie

Jest przesiewanie i przesiewanie:

Przesiewanie: Oznacza to zamianę węzła z jego rodzicem. Jeśli właściwość sterty nie jest spełniona, zamień rodzica z własnym rodzicem. Kontynuuj w ten sposób na ścieżce, aż właściwość sterty zostanie spełniona. Procedura może dotrzeć do korzenia.

Przesiewanie: Oznacza to zamianę węzła o dużej wartości na mniejszy z jego dwojga dzieci (lub jedno dziecko na prawie cały stos). Jeśli właściwość sterty nie jest spełniona, zamień dolny węzeł na mniejszy węzeł dwójki własnych dzieci. Kontynuuj w ten sposób na ścieżce, aż właściwość sterty zostanie spełniona. Procedura może dotrzeć do liścia.

Heapifying

Heapify oznacza sortowanie nieposortowanej tablicy, aby właściwość sterty była spełniona dla max-heap lub min-heap. Oznacza to, że w nowej tablicy mogą znajdować się puste lokalizacje. Podstawowy algorytm do stertowania max-heap lub min-heap jest następujący:

- jeśli węzeł główny jest bardziej ekstremalny niż którykolwiek z jego węzłów potomnych, zamień korzeń z mniej ekstremalnym węzłem potomnym.

- Powtórz ten krok z węzłami podrzędnymi w schemacie przechodzenia przez drzewo w przedsprzedaży.

Ostatnie drzewo to drzewo sterty spełniające właściwość sterty. Sterta może być reprezentowana jako diagram drzewa lub tablica. Powstała sterta jest częściowo posortowanym drzewem, i.mi. częściowo posortowana tablica.

Szczegóły operacji na stercie

Ta sekcja artykułu zawiera szczegóły operacji na stercie.

Tworzenie szczegółów sterty

utwórz_stertę

Patrz wyżej!

zwałować

Patrz wyżej

łączyć

Jeśli tablice sterty,

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

i

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

są scalone, wynik bez duplikatów może być,

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

Po pewnym przesiewaniu. Zauważ, że w pierwszej tablicy 82 nie ma dzieci. W wynikowej tablicy ma indeks 4; a jego lokalizacje o indeksie 2(4)+1=9 i 2(4)+2=10 są wolne. Oznacza to, że na nowym diagramie drzewa również nie ma dzieci. Oryginalne dwie sterty nie powinny być usuwane, ponieważ ich informacje tak naprawdę nie znajdują się w nowej stercie (nowa tablica). Podstawowy algorytm scalania stosów tego samego typu wygląda następująco:

- Dołącz jedną tablicę do dolnej części drugiej tablicy.

- Heapify eliminuje duplikaty, upewniając się, że węzły, które nie miały dzieci w oryginalnych stertach, nadal nie mają dzieci w nowej stercie.

łączyć

Algorytm łączenia dwóch stosów tego samego typu (dwa max- lub dwa min-) wygląda następująco:

- Porównaj dwa węzły główne.

- Stwórz mniej skrajny korzeń i resztę jego drzewa (poddrzewo), drugie dziecko skrajnego korzenia.

- Przesiej zabłąkane dziecko z korzenia teraz skrajnego poddrzewa, w dół w skrajnym poddrzewie.

Wynikowa sterta jest nadal zgodna z właściwością sterty, podczas gdy oryginalne sterty są niszczone (skasowane). Oryginalne stosy można zniszczyć, ponieważ wszystkie posiadane przez nich informacje nadal znajdują się w nowej stercie he.

Podstawowe operacje na stercie

find_max (znajdź_min)

Oznacza to zlokalizowanie maksymalnej wartości w tablicy max-heap i zwrócenie kopii lub zlokalizowanie minimalnej wartości w tablicy min-heap i zwrócenie kopii. Tablica sterty z definicji spełnia już właściwość sterty. Więc po prostu zwróć kopię pierwszego elementu tablicy.

wstawić

Oznacza to dodanie nowego elementu do tablicy sterty i przeorganizowanie tablicy tak, aby zachowana została właściwość sterty diagramu (spełniona). Algorytm do wykonania tego dla obu typów stosów jest następujący:

- Załóż pełne drzewo binarne. Oznacza to, że tablica musi być wypełniona na końcu pustymi lokalizacjami, jeśli to konieczne. Całkowita liczba węzłów pełnej sterty to 1 lub 3 lub 7 lub 15 lub 31 itd.; podwajaj i dodawaj 1.

- Umieść węzeł w najbardziej odpowiedniej pustej lokalizacji pod względem wielkości, w kierunku końca sterty (w kierunku końca tablicy sterty). Jeśli nie ma pustej lokalizacji, zacznij nowy wiersz od lewego dolnego rogu.

- W razie potrzeby przesiać, aż do zaspokojenia własności hałdy.

ekstrakt_maks (wyciąg_min)

Znajdź maksymalną wartość w tablicy max-heap, usuń ją i zwróć; lub znajdź minimalną wartość w tablicy min-heap, usuń ją i zwróć. Algorytm ekstrakcji_maks (extract_min) wygląda następująco:

- Usuń węzeł główny.

- Weź (usuń) dolny prawy węzeł (ostatni węzeł w tablicy) i umieść u nasady.

- Przesiać odpowiednio, aż właściwość sterty zostanie zaspokojona.

delete_max (delete_min)

Zlokalizuj węzeł główny max-heap, który jest pierwszym elementem tablicy max-heap, usuń go bez konieczności zwracania; lub zlokalizuj węzeł główny min-sterty, który jest pierwszym elementem tablicy min-sterty, usuń go bez konieczności zwracania. Algorytm usuwania węzła głównego jest następujący:

- Usuń węzeł główny.

- Weź (usuń) dolny prawy węzeł (ostatni węzeł w tablicy) i umieść u nasady.

- Przesiać odpowiednio, aż właściwość sterty zostanie zaspokojona.

zastąpić

Zlokalizuj węzeł główny każdej sterty, usuń go i zastąp nowym. Nie ma znaczenia, czy zwrócony zostanie stary korzeń. Jeśli to konieczne, przesiać, aż właściwość sterty zostanie zaspokojona.

Wewnętrzne operacje na stercie

klucz_wzrostu (klucz_zmniejszenia)

Zwiększ wartość dowolnego węzła dla maksymalnej sterty i zmień kolejność, aby właściwość sterty została zachowana lub zmniejsz wartość dowolnego węzła dla minimalnej sterty i zmień kolejność, aby właściwość sterty została zachowana. Przesiewaj w górę lub w dół, w zależności od potrzeb, aż do zaspokojenia właściwości hałdy.

kasować

Usuń interesujący węzeł, a następnie zmień kolejność, tak aby właściwość sterty była zachowana dla sterty max lub min. Algorytm usuwania węzła wygląda następująco:

- Usuń interesujący węzeł.

- Weź (usuń) dolny prawy węzeł (ostatni węzeł w tablicy) i umieść w indeksie usuniętego węzła. Jeśli usunięty węzeł znajduje się w ostatnim wierszu, może to nie być konieczne.

- Przesiewaj w górę lub w dół, w zależności od potrzeb, aż do zaspokojenia właściwości hałdy.

zmieniać bieg na wyższy

Przenieś węzeł w górę w stercie maksymalnej lub minimalnej tak długo, jak to konieczne, zmieniając kolejność, aby zachować właściwość sterty - przesiewaj.

Bieg w dół

Przenieś węzeł w dół w maksymalnej lub minimalnej stercie tak długo, jak to konieczne, zmieniając kolejność, aby zachować właściwość sterty - przesiewaj w dół.

Inspekcja hałdy

rozmiar

Patrz wyżej!

jest pusty

Patrz wyżej!

Inne klasy stosów

Hałda opisana w tym artykule może być traktowana jako hałda główna (ogólna). Istnieją inne klasy hałd. Jednak dwa, które powinieneś wiedzieć poza tym, to sterta binarna i sterta d-ary.

Sterta binarna

Sterta binarna jest podobna do tej głównej sterty, ale ma więcej ograniczeń. W szczególności sterta binarna musi być kompletnym drzewem. Nie pomyl pełnego drzewa z pełnym drzewem.

d-ary Heap

Kopiec binarny to kopia dwuargumentowa. Sterta, w której każdy węzeł ma 3 dzieci, jest stertą 3-arną. Sterta, w której każdy węzeł ma 4 dzieci, jest stertą 4-argumentową i tak dalej. Sterta d-ary ma inne ograniczenia.

Wniosek

Sterta to kompletne lub prawie kompletne drzewo binarne, które spełnia właściwość sterty. Własność sterty ma 2 alternatywy: dla max-heap, rodzic musi mieć taką samą lub większą wartość niż bezpośrednie dzieci; w przypadku min-sterty rodzic musi mieć taką samą lub mniejszą wartość niż bezpośrednie dzieci. Sterta może być reprezentowana jako drzewo lub tablica. W przypadku reprezentacji w tablicy węzeł główny jest pierwszym węzłem tablicy; a jeśli węzeł ma indeks n, jego pierwsze dziecko w tablicy ma indeks 2n+1, a następne dziecko ma indeks 2n+2. Sterta ma pewne operacje wykonywane na tablicy.

Chrys

Gry Zainstaluj najnowszą grę strategiczną OpenRA na Ubuntu Linux
Zainstaluj najnowszą grę strategiczną OpenRA na Ubuntu Linux
OpenRA to darmowy silnik gier strategicznych czasu rzeczywistego, który odtwarza wczesne gry Westwood, takie jak klasyczny Command & Conquer: Red Aler...
Gry Zainstaluj najnowszy emulator Dolphin dla Gamecube i Wii w systemie Linux
Zainstaluj najnowszy emulator Dolphin dla Gamecube i Wii w systemie Linux
Emulator Dolphin pozwala grać w wybrane gry Gamecube i Wii na komputerach osobistych z systemem Linux (PC). Będąc ogólnodostępnym emulatorem gier o o...
Gry Jak korzystać z GameConqueror Cheat Engine w systemie Linux
Jak korzystać z GameConqueror Cheat Engine w systemie Linux
Artykuł zawiera przewodnik dotyczący korzystania z silnika oszukującego GameConqueror w systemie Linux. Wielu użytkowników, którzy grają w gry w syste...