Struktura danych sterty: Czym jest sterta?
โก Inteligentne podsumowanie
Struktura danych sterty to specjalistyczne kompletne drzewo binarne, w ktรณrym kaลผdy wฤzeล nadrzฤdny zachowuje ลcisลy zwiฤ zek kolejnoลciowy ze swoimi potomkami, umoลผliwiajฤ c logarytmiczne wstawianie, usuwanie i wykonywanie operacji na kolejkach priorytetowych w ramach sortowania, planowania i obciฤ ลผeล graficznych.

Czym jest struktura danych Heap?
Kopiec to specjalistyczna struktura danych oparta na drzewie. Struktura danych kopca skลada siฤ z najwyลผszego wฤzลa zwanego korzeniem (rodzicem). Drugi wฤzeล jest lewym dzieckiem korzenia, a trzeci โ prawym dzieckiem korzenia. Kolejne wฤzลy sฤ wypeลniane od lewej do prawej. Klucz wฤzลa nadrzฤdnego jest porรณwnywany z kluczem wฤzลa potomnego, co zapewnia wลaลciwe uporzฤ dkowanie. Drzewo jest ลatwe do zwizualizowania, gdzie kaลผdy element nazywany jest wฤzลem, a kaลผdy wฤzeล ma unikalny klucz do identyfikacji.
Mรณwiฤ c najproลciej, kopiec to kompletne drzewo binarne speลniajฤ ce wลaลciwoลci kopca: kaลผdy element nadrzฤdny jest uporzฤ dkowany spรณjnie wzglฤdem swoich elementรณw potomnych, co czyni je idealnym rozwiฤ zaniem dla kolejek priorytetowych i sortowania kopcowego.
Dlaczego potrzebujesz struktury danych sterty?
Oto gลรณwne powody uลผywania sterty:
- Struktura danych Heap umoลผliwia usuwanie i wstawianie w czasie logarytmicznym โ O(log2N).
- Dane w drzewie sฤ uporzฤ dkowane w okreลlonej kolejnoลci. Oprรณcz aktualizowania lub wyszukiwania wartoลci, takich jak maksimum lub minimum, programista moลผe znaleลบฤ relacje miฤdzy elementem nadrzฤdnym a potomnym.
- Moลผna zastosowaฤ koncepcjฤ Dokumentowy model obiektowy aby pomรณc Ci zrozumieฤ strukturฤ danych Heap wizualnie.
- Stosy obsลugujฤ wydajne operacje kolejek priorytetowych, ktรณre sฤ krytyczne dla algorytmรณw grafowych, takich jak najkrรณtsza ลcieลผka Dijkstry i minimalne drzewo rozpinajฤ ce Prima.
Rodzaje stosรณw
Struktura danych kopca ma rรณลผne algorytmy do obsลugi wstawiania i usuwania elementรณw, w tym kolejkฤ priorytetowฤ , kopiec binarny, kopiec dwumianowy i Sortowanie na stosie.
- Kolejka priorytetowa: To jest brzuchtracStruktura danych zawierajฤ ca obiekty o okreลlonym priorytecie. Kaลผdy obiekt lub element ma ustalony priorytet. W zwiฤ zku z tym obiekt lub element o wyลผszym priorytecie jest obsลugiwany przed pozostaลymi.
- Stos binarny: Stosy binarne nadajฤ siฤ do prostych operacji na stosie, takich jak usuwanie i wstawianie. Stanowiฤ domyลlnฤ implementacjฤ wiฤkszoลci kolejek priorytetowych bibliotek standardowych.
- Kopiec dwumianowy: Kopiec dwumianowy skลada siฤ z serii zbiorรณw drzew dwumianowych, ktรณre tworzฤ kopiec. Drzewo kopca dwumianowego nie jest zwykลym drzewem, poniewaลผ jest ลciลle zdefiniowane. Caลkowita liczba elementรณw w drzewie dwumianowym zawsze wynosi 2.n wฤzลy
- Sortowanie kopcowe: W przeciwieลstwie do wiฤkszoลci algorytmรณw sortowania, sortowanie kopcowe wykorzystuje przestrzeล O(1) do operacji sortowania. Jest to algorytm sortowania oparty na porรณwnaniach, w ktรณrym sortowanie odbywa siฤ w kolejnoลci rosnฤ cej, najpierw przeksztaลcajฤ c dane wejลciowe do kopca Max-Heap. Sortowanie kopcowe moลผna traktowaฤ jako ulepszone drzewo poszukiwaล binarnych.
Zazwyczaj struktura danych kopca wykorzystuje dwie strategie. Dla danych wejลciowych 12 โ 8 โ 4 โ 2 i 1:
- Min-Heap โ najmniejsza wartoลฤ na gรณrze
- Max-Heap โ najwyลผsza wartoลฤ na gรณrze
Min-Heap
W strukturze Min-Heap wฤzeล gลรณwny ma wartoลฤ rรณwnฤ lub mniejszฤ od wartoลci potomnych tego wฤzลa. Zatem korzeล Min-Heap zawiera wartoลฤ minimalnฤ . Min-Heap jest rรณwnieลผ kompletnym drzewem binarnym.
Gdy w drzewie znajduje siฤ Min-Heap, wszystkie liลcie sฤ potencjalnymi kandydatami na wartoลฤ maksymalnฤ . Naleลผy jednak zbadaฤ kaลผdy liลฤ, aby uzyskaฤ dokลadnฤ wartoลฤ Max-Heap.
Przykลad kopca minimalnego
Na powyลผszym diagramie moลผna zauwaลผyฤ wyraลบnฤ sekwencjฤ od korzenia do najniลผszego wฤzลa.
Zaลรณลผmy, ลผe przechowujesz elementy w tablicy Array_N[12, 2, 8, 1, 4]. Jak widaฤ z tablicy, element gลรณwny narusza priorytet Min-Heap. Aby zachowaฤ wลaลciwoลฤ Min-Heap, naleลผy wykonaฤ operacje min-heapify, aby zamieniฤ elementy, aลผ do speลnienia reguล Min-Heap.
Max-Heap
W strukturze Max-Heap wฤzeล nadrzฤdny lub gลรณwny ma wartoลฤ rรณwnฤ lub wiฤkszฤ od swoich potomkรณw. Ten wฤzeล przechowuje wartoลฤ maksymalnฤ . Jest to kompletne drzewo binarne, wiฤc moลผna zbudowaฤ Max-Heap ze zbioru wartoลci w czasie O(n).
Oto kilka metod powszechnie stosowanych podczas wdraลผania Java Maksymalna sterta:
- Dodaฤ (): Umieszcza nowy element w stercie. W przypadku tablicy obiekty sฤ dodawane na koลcu tablicy, natomiast w drzewie binarnym obiekty sฤ dodawane od gรณry do doลu, a nastฤpnie od lewej do prawej.
- Usunฤ ฤ (): Ta metoda pozwala usunฤ ฤ pierwszy element z listy tablicowej. Poniewaลผ nowo promowany element nie jest juลผ najwiฤkszy, metoda Sift-Down zawsze umieszcza go w nowej lokalizacji.
- Sift-Down (): Ta metoda porรณwnuje obiekt gลรณwny z jego elementami podrzฤdnymi, a nastฤpnie umieszcza przeniesiony wฤzeล na jego wลaลciwฤ pozycjฤ.
- Sift-Up (): Jeลli uลผyjesz metody array do dodania nowo wstawionego elementu do tablicy, metoda Sift-Up pomoลผe nowo dodanemu wฤzลowi przenieลฤ siฤ na wลaลciwe miejsce. Nowy element jest najpierw porรณwnywany z elementem nadrzฤdnym poprzez symulacjฤ struktury danych drzewa.
Zastosuj formuลฤ Parent_Index = Child_Index / 2. Powtarzaj tฤ czynnoลฤ, aลผ maksymalny element znajdzie siฤ na poczฤ tku tablicy.
Podstawowy stos Operanych
Aby znaleลบฤ najwyลผsze i najniลผsze wartoลci w zbiorze danych, potrzebujesz kilku podstawowych operacji na stercie, takich jak wyszukiwanie, wstawianie i usuwanie. Poniewaลผ elementy stale siฤ pojawiajฤ i znikajฤ , powinieneล wiedzieฤ, jak:
- Znajdลบ โ Poszukaj przedmiotu na stosie.
- wstawka โ Dodaj nowe dziecko do sterty.
- Usuniฤcia โ Usuล wฤzeล ze sterty.
Twรณrz stosy
Proces konstruowania stosรณw nazywa siฤ tworzeniem stosรณw. Majฤ c listฤ kluczy, programista tworzy pusty stos, a nastฤpnie wstawia pozostaลe klucze jeden po drugim, korzystajฤ c z podstawowych operacji na stosie.
Zacznijmy wiฤc budowaฤ kopiec minimalny, stosujฤ c metodฤ Williama, wstawiajฤ c wartoลci 12, 2, 8, 1 i 4. Kopiec moลผna zbudowaฤ z n elementรณw, zaczynajฤ c od pustego kopca, a nastฤpnie wypeลniajฤ c go kolejno innymi elementami, korzystajฤ c z czasu O(n log n).
- Heapify: Procedura wstawiania, ktรณra pomaga wstawiaฤ elementy do sterty, zachowujฤ
c jednoczeลnie jej wลaลciwoลci.
Na przykลad operacja โmax-heapifyโ sprawdza, czy wartoลฤ elementu nadrzฤdnego jest wiฤksza niลผ wartoลฤ jego elementu potomnego. Elementy moลผna nastฤpnie posortowaฤ za pomocฤ metod takich jak โswapโ (zamieล).ping.
- ลฤ czyฤ: Jeลli masz dwa stosy do poลฤ czenia w jeden, uลผyj operacji scalania, aby poลฤ czyฤ wartoลci z obu stosรณw. Oryginalne stosy zostanฤ zachowane.
Sprawdลบ stosy
Inspekcja stosรณw polega na sprawdzeniu liczby elementรณw w strukturze danych stosu i upewnieniu siฤ, ลผe stos jest pusty.
Podczas sortowania lub kolejkowania elementรณw waลผne jest sprawdzanie stert. Waลผne jest sprawdzenie, czy istniejฤ elementy do przetworzenia za pomocฤ funkcji Is-Empty(). Rozmiar sterty pomoลผe zlokalizowaฤ pierwiastki sterty maksymalnej lub minimalnej, dlatego musisz wiedzieฤ, ile elementรณw znajduje siฤ za wลaลciwoลciฤ sterty.
- Rozmiar โ zwraca wielkoลฤ lub dลugoลฤ stosu. Informuje, ile elementรณw jest przechowywanych w kolejnoลci posortowanej.
- Jest pusty โ zwraca TRUE, jeลli stos jest pusty, w przeciwnym wypadku zwraca FALSE.
Tutaj drukujesz wszystkie elementy w pliku priorytetQ pฤtli, a nastฤpnie sprawdzamy, czy priorytetQ nie jest pusty.
//print head the head values While (!priorityQ.isEmpty()) { System.out.print(priorityQ.poll()+" ");
Zastosowania struktury danych sterty
Struktura danych Heap jest przydatna w wielu praktycznych zastosowaniach programistycznych, takich jak:
- Pomaga w filtrowaniu spamu.
- Implementacja algorytmรณw grafowych takich jak Dijkstra i Prim.
- Operarรณwnowaลผenie obciฤ ลผenia systemu i kompresja danych.
- Znajdowanie statystyk rzฤdu, takich jak k-ty najmniejszy element.
- Implementacja kolejek priorytetowych umoลผliwiajฤ cych wyszukiwanie elementรณw na liลcie w czasie logarytmicznym.
- Struktura danych Heap jest rรณwnieลผ wykorzystywana do sortowania za pomocฤ sortowania kopcowego.
- Symulacja klientรณw oczekujฤ cych w kolejce.
- Obsลuga przerwaล w Operasystemu.
- W kodowaniu Huffmana do kompresji danych.
- Wspieranie wyszukiwania โnajlepszy-najpierwโ i heurystyki A* w planowaniu ลcieลผek AI.
Wลaลciwoลci kolejki priorytetu sterty
Poniลผsze wลaลciwoลci opisujฤ zachowanie kolejki priorytetowej zbudowanej na stosie:
- W przypadku stosรณw priorytetowych elementy danych na liลcie sฤ porรณwnywane ze sobฤ w celu okreลlenia, ktรณry element jest mniejszy lub wiฤkszy.
- Element umieszczany jest w kolejce, a nastฤpnie usuwany wedลug kolejnoลci priorytetรณw.
- Kaลผdy element w kolejce priorytetowej ma przypisany unikalny numer, ktรณry okreลla priorytet.
- Po opuszczeniu kolejki priorytetowej, element o najwyลผszym priorytecie wychodzi pierwszy.
Kroki implementacji kolejki priorytetowej sterty w Java
Nastฤpna sekcja przenosi siฤ do betonu Java implementacja, ktรณra zamienia te reguลy w dziaลajฤ cy kod.
Sortowanie sterty Java w Code Przykลad
import java.util.Arrays; public class HeapSort { public static void main(String[] args) { int[] arr = {5, 9, 3, 1, 8, 6}; // Sort the array using heap sort heapSort(arr); // Print the sorted array System.out.println(Arrays.toString(arr)); } public static void heapSort(int[] arr) { // Convert the array into a heap for (int i = arr.length / 2 - 1; i >= 0; i--) { heapify(arr, arr.length, i); } // Extract the maximum element from the heap and place it at the end of the array for (int i = arr.length - 1; i >= 0; i--) { int temp = arr[0]; arr[0] = arr[i]; arr[i] = temp; heapify(arr, i, 0); } } public static void heapify(int[] arr, int n, int i) { int largest = i; int left = 2 * i + 1; int right = 2 * i + 2; // Find the largest element among the root, left child, and right child if (left < n && arr[left] > arr[largest]) { largest = left; } if (right < n && arr[right] > arr[largest]) { largest = right; } // If the largest element is not the root, swap and heapify the sub-tree if (largest != i) { int temp = arr[i]; arr[i] = arr[largest]; arr[largest] = temp; heapify(arr, n, largest); } } }
Wydajnoลฤ
Original Array: 5 9 3 1 8 6 Heap after insertion: 9 8 6 1 5 3 Heap after sorting: 1 3 5 6 8 9
Sortowanie sterty Python w Code Przykลad
def heap_sort(arr): """ Sorts an array in ascending order using heap sort algorithm. Parameters: arr (list): The array to be sorted. Returns: list: The sorted array. """ n = len(arr) # Build a max heap from the array for i in range(n // 2 - 1, -1, -1): heapify(arr, n, i) # Extract elements from the heap one by one for i in range(n - 1, 0, -1): arr[0], arr[i] = arr[i], arr[0] # swap the root with the last element heapify(arr, i, 0) # heapify the reduced heap return arr def heapify(arr, n, i): """ Heapifies a subtree with the root at index i in the given array. Parameters: arr (list): The array containing the subtree to be heapified. n (int): The size of the subtree. i (int): The root index of the subtree. """ largest = i # initialize largest as the root left = 2 * i + 1 # left child index right = 2 * i + 2 # right child index # If left child is larger than root if left < n and arr[left] > arr[largest]: largest = left # If right child is larger than largest so far if right < n and arr[right] > arr[largest]: largest = right # If largest is not root if largest != i: arr[i], arr[largest] = ( arr[largest], arr[i], ) # swap the root with the largest element heapify(arr, n, largest) # recursively heapify the affected subtree arr = [4, 1, 3, 9, 7] sorted_arr = heap_sort(arr) print(sorted_arr)
Wydajnoลฤ
[1, 3, 4, 7, 9]
Nastฤpnie dowiesz siฤ o Metoda bisekcji.




