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.

  • ๐ŸŒณ Ksztaล‚t drzewa: Stos to kompletne drzewo binarne wypeล‚nione od lewej do prawej, z unikalnymi kluczami w kaลผdym wฤ™ลบle, co umoลผliwia szybkie porรณwnywanie.
  • โฌ†๏ธ Maksymalna sterta: Kaลผdy rodzic jest wiฤ™kszy lub rรณwny swoim dzieciom, wiฤ™c najwiฤ™kszy element zawsze znajduje siฤ™ w korzeniu w przypadku dostฤ™pu O(1).
  • (Tj. Min-Heap: Kaลผdy z rodzicรณw jest mniejszy lub rรณwny swoim dzieciom,ping najmniejszy element w korzeniu do priorytetowego pobierania.
  • โœ… rdzeล„ Operacje: Znajdลบ, wstaw, usuล„, utwรณrz stos i scalaj dziaล‚ajฤ… w czasie O(log n), obsล‚ugujฤ…c logikฤ™ sortowania stosowego i kolejki priorytetowej.
  • ๐Ÿงช Rzeczywiste zastosowania: Struktura danych Heap obsล‚uguje filtrowanie spamu, algorytmy graficzne, planowanie systemu operacyjnego, kodowanie Huffmana i heurystyczne wyszukiwanie AI.

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

Rodzaje stosรณw

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

Przykล‚ad minimalnej sterty

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

Twรณrz stosy

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

Kroki implementowania kolejki priorytetรณw sterty

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.

FAQ

Kopiec gwarantuje jedynie kolejnoล›ฤ‡ rodzic-dziecko, wiฤ™c korzeล„ jest minimalny lub maksymalny. Drzewo poszukiwaล„ binarnych gwarantuje kolejnoล›ฤ‡ lewego poddrzewa mniejszego od korzenia i prawego poddrzewa w kaลผdym wฤ™ลบle, obsล‚ugujฤ…c szybkie przechodzenie w kolejnoล›ci i wyszukiwanie kluczy.

Wybierz opcjฤ™ Max-Heap, gdy Twoja aplikacja wielokrotnie potrzebuje najwiฤ™kszego elementu, na przykล‚ad do zaplanowania zadania o najwyลผszym priorytecie lub do wykonania sortowania kopcowego w kolejnoล›ci rosnฤ…cej. Wybierz opcjฤ™ Min-Heap, gdy najpierw potrzebujesz najmniejszego elementu, na przykล‚ad najkrรณtszej ล›cieลผki Dijkstry.

Wstawianie i usuwanie w strukturze danych kopca trwa O(log n) ze wzglฤ™du na ล›cieลผkฤ™ heapify od korzenia do liล›cia. Podglฤ…d wartoล›ci minimalnej lub maksymalnej trwa O(1), a budowanie kopca z n elementรณw trwa O(n).

Sortowanie kopcowe jest wdroลผone, poniewaลผ sortuje tablicฤ™, wykorzystujฤ…c O(1) dodatkowej pamiฤ™ci poza danymi wejล›ciowymi. Nie jest stabilne, poniewaลผ rรณwne klucze mogฤ… zamieniaฤ‡ siฤ™ wzglฤ™dnฤ… kolejnoล›ciฤ… podczas heapify i np.trackroki t-max uลผyte do wygenerowania posortowanego wyniku.

Algorytmy wyszukiwania AI, takie jak A* i wyszukiwanie โ€žnajlepszy pierwszyโ€, przechowujฤ… wฤ™zล‚y graniczne w kopcu minimalnym, opartym na koszcie heurystycznym. Kopiec gwarantuje, ลผe jako nastฤ™pny rozwijany jest najtaล„szy kandydat, co jest kluczowe dla szybkiego wyszukiwania ล›cieลผek, sztucznej inteligencji w grach i planowania robotyki.

Tak. Wizualizatory wspomagane sztucznฤ… inteligencjฤ… mogฤ… generowaฤ‡ diagramy krok po kroku dotyczฤ…ce wstawek, zamian heapify i extracOperacje t-max z Twojego kodu. Sygnalizujฤ… rรณwnieลผ naruszenia wล‚asnoล›ci sterty, sugerujฤ… poprawki i wyjaล›niajฤ… asymptotyczne zachowanie prostym jฤ™zykiem, co przyspiesza naukฤ™ i debugowanie.

Podsumuj ten post nastฤ™pujฤ…co: