Struktura podataka Heap: Što je Heap?

⚡ Pametni sažetak

Heap struktura podataka je specijalizirano potpuno binarno stablo gdje svaki roditeljski čvor održava strogi odnos uređenja sa svojom djecom, omogućujući logaritamsko umetanje, brisanje i operacije prioritetnog reda čekanja u sortiranju, raspoređivanju i grafovskim opterećenjima.

  • ???? Oblik stabla: Heap je potpuno binarno stablo popunjeno slijeva nadesno, s jedinstvenim ključevima na svakom čvoru za brzu usporedbu.
  • ⬆️ Max-Heap: Svaki roditelj je veći ili jednak svojoj djeci, tako da se najveći element uvijek nalazi u korijenu za O(1) pristup.
  • ⬇️ Min-Heap: Svaki roditelj je manji ili jednak svojoj djeci, keeping najmanji element u korijenu za pronalaženje prioriteta.
  • srž Operaticije: Pronađi, Umetni, Izbriši, Heapify i Merge izvode se u vremenu O(log n), podržavajući logiku Heap sortiranja i Priority Queue.
  • 🧪 Prava upotreba: Struktura podataka gomile omogućuje filtriranje neželjene pošte, algoritme grafova, raspoređivanje operativnih sustava, Huffmanovo kodiranje i heurističko pretraživanje umjetne inteligencije.

Što je struktura podataka Heap?

Heap je specijalizirana struktura podataka temeljena na stablu. Struktura podataka Heap sastoji se od najvišeg čvora koji se naziva korijen (roditelj). Njegov drugi čvor je lijevo dijete korijena, dok je treći čvor desno dijete korijena. Sljedeći čvorovi popunjavaju se slijeva nadesno. Ključ roditeljskog čvora uspoređuje se s ključem njegovog potomka tako da se postiže pravilan raspored. Stablo je lako vizualizirati gdje se svaki entitet naziva čvorom, a svaki čvor ima jedinstveni ključ za identifikaciju.

Jednostavno rečeno, Heap je potpuno binarno stablo koje zadovoljava svojstvo heapa: svaki roditelj je konzistentno uređen u odnosu na svoju djecu, što ga čini idealnim za redove prioriteta i Heap sortiranje.

Zašto vam je potrebna Heap Data Structure?

Evo glavnih razloga za korištenje Heap-a:

  • Struktura podataka Heap omogućuje brisanje i umetanje u logaritamskom vremenu – O(log2ne).
  • Podaci u stablu su poredani određenim redoslijedom. Osim ažuriranja ili ispitivanja vrijednosti poput maksimuma ili minimuma, programer može pronaći odnose između roditelja i potomka.
  • Možete primijeniti koncept Model objekta dokumenta kako bismo vam pomogli vizualno razumjeti strukturu podataka Heap.
  • Heaps podržavaju učinkovite operacije s prioritetnim redovima, koje su ključne za grafovske algoritme poput Dijkstrinog najkraćeg puta i Primovog minimalnog razapinjućeg stabla.

Vrste gomila

Struktura podataka Heap ima različite algoritme za rukovanje umetanjem i uklanjanjem elemenata, uključujući red prioriteta, binarni heap, binomni heap i Sortiranje po hrpi.

  • Red prioriteta: To su trbušnjacitract struktura podataka koja sadrži objekte s prioritetom. Svaki objekt ili stavka ima unaprijed određen prioritet. Stoga objekt ili stavka kojoj je dodijeljen viši prioritet dobiva uslugu prije ostalih.
  • Binarna hrpa: Binarni heapovi su prikladni za jednostavne operacije s heapovima poput brisanja i umetanja. Oni su zadana implementacija iza većine standardnih redova prioriteta biblioteka.
  • Binomna hrpa: Binomni hrpa sastoji se od niza kolekcija binomnih stabala koja čine hrpu. Binomno hrpasto stablo nije obično stablo jer je rigorozno definirano. Ukupan broj elemenata u binomnom stablu uvijek je jednak 2.n čvorovi.
  • Sortiranje hrpe: Za razliku od većine algoritama za sortiranje, Heap Sort koristi O(1) prostora za svoju operaciju sortiranja. To je algoritam sortiranja temeljen na usporedbi gdje se sortiranje odvija u rastućem redoslijedu tako da se prvo ulaz pretvori u Max-Heap. Heap Sort možete promatrati kao nadograđeno binarno stablo pretraživanja.

Tipično, struktura podataka tipa Heap koristi dvije strategije. Za ulaz 12 – 8 – 4 – 2 i 1:

  • Min-Heap – najmanja vrijednost na vrhu
  • Max-Heap – najviša vrijednost na vrhu

Vrste gomila

Min-Heap

U Min-Heap strukturi, korijenski čvor ima vrijednost jednaku ili manju od djece tog čvora. Korijen Min-Heapa stoga sadrži minimalnu vrijednost. Min-Heap je također potpuno binarno stablo.

Nakon što imate Min-Heap u stablu, svi listovi su održivi kandidati za maksimalnu vrijednost. Međutim, morate ispitati svaki list kako biste dobili točnu vrijednost Max-Heap.

Primjer Min-Heap-a

Primjer minimalne hrpe

Na gornjem dijagramu možete primijetiti jasan slijed od korijena do najnižeg čvora.

Pretpostavimo da elemente pohranjujete u niz Array_N[12, 2, 8, 1, 4]. Kao što možete vidjeti iz niza, korijenski element krši prioritet Min-Heap. Da biste održali svojstvo Min-Heap, morate izvršiti operacije min-heapify kako biste zamijenili elemente dok se ne zadovolje pravila Min-Heap.

Max-Heap

U strukturi Max-Heap, roditeljski ili korijenski čvor ima vrijednost jednaku ili veću od svojih potomaka. Ovaj čvor sadrži maksimalnu vrijednost. To je potpuno binarno stablo, tako da možete izgraditi Max-Heap iz kolekcije vrijednosti u vremenu O(n).

Evo nekoliko metoda koje se obično koriste prilikom implementacije Java Max-Heap:

  • Dodaj (): Smješta novi element u hrpu. Ako koristite niz, objekti se dodaju na kraj niza, dok se u binarnom stablu objekti dodaju od vrha prema dnu, a zatim s lijeva na desno.
  • Ukloni (): Ova metoda vam omogućuje uklanjanje prvog elementa s popisa nizova. Budući da novo promovirani element više nije najveći, metoda Sift-Down uvijek ga pomiče na novu lokaciju.
  • Prosijavanje (): Ova metoda uspoređuje korijenski objekt s njegovom djecom, a zatim premještani čvor pomiče na njegovu pravu poziciju.
  • Prosijavanje (): Ako koristite metodu polja za dodavanje novo umetnutog elementa u polje, tada metoda Sift-Up pomaže novo dodanom čvoru da se premjesti na ispravnu poziciju. Novi element se prvo uspoređuje sa svojim roditeljem simulirajući strukturu podataka stabla.

    Primijenite formulu Roditeljski_indeks = Podređeni_indeks / 2. Nastavite to raditi sve dok maksimalni element ne bude na početku polja.

Osnovna gomila Operama

Da biste pronašli najviše i najniže vrijednosti u skupu podataka, potrebno vam je nekoliko osnovnih operacija na hrpi kao što su pronalaženje, umetanje i brisanje. Budući da elementi stalno dolaze i odlaze, trebali biste znati kako:

  • naći – Potražite predmet na hrpi.
  • umetak – Dodajte novo dijete u hrpu.
  • Izbrisati – Brisanje čvora iz gomile.

Stvorite gomile

Proces konstruiranja hrpa poznat je kao stvaranje hrpa. S obzirom na popis ključeva, programer stvara praznu hrpu, a zatim ubacuje ostale ključeve jedan po jedan koristeći osnovne operacije s hrpom.

Dakle, započnimo s izgradnjom Min-Heapa koristeći Williamovu metodu umetanjem vrijednosti 12, 2, 8, 1 i 4. Heap možete izgraditi s n elemenata tako da započnete s praznim heapom, a zatim ga sukcesivno popunite drugim elementima koristeći vrijeme O(n log n).

Stvorite gomile

  • Heapify: Rutina za umetanje koja pomaže u umetanju elemenata u hrpu (heap) uz očuvanje svojstva hrpe.

    Na primjer, operacija max-heapify provjerava je li vrijednost roditelja veća od vrijednosti njegovog potomka. Elementi se zatim mogu sortirati metodama poput swapping.

  • Sjediniti: Kada imate dvije hrpe koje želite spojiti u jednu, upotrijebite operaciju spajanja kako biste spojili vrijednosti iz dvije hrpe. Izvorne hrpe ostaju sačuvane.

Pregledajte gomile

Inspekcija hrpa odnosi se na provjeru broja elemenata u strukturi podataka hrpe i provjeru je li hrpa prazna.

Važno je pregledati hrpe prilikom sortiranja ili stavljanja elemenata u red čekanja. Važno je provjeriti postoje li elementi za obradu pomoću Is-Empty(). Veličina hrpe pomoći će u lociranju korijena Max-Heap ili Min-Heap, stoga morate znati koliko elemenata slijedi svojstvo hrpe.

  • Veličina – vraća veličinu ili duljinu hrpe. Pokazuje koliko je elemenata pohranjeno sortiranim redoslijedom.
  • Je prazno – vraća TRUE ako je heap null, inače vraća FALSE.

Ovdje ispisujete sve elemente u prioritetQ petlja i zatim provjera da priorityQ nije prazan.

//print head the head values
       While (!priorityQ.isEmpty()) {
        System.out.print(priorityQ.poll()+" ");

Upotreba strukture podataka hrpe

Struktura podataka Heap korisna je u mnogim programskim primjenama u stvarnom životu, kao što su:

  • Pomaže u filtriranju neželjene pošte.
  • Implementacija grafovskih algoritama kao što su Dijkstra i Prim.
  • Operauravnoteženje opterećenja sustava i kompresija podataka.
  • Pronalaženje statistika reda kao što je k-ti najmanji element.
  • Implementacija redova prioriteta gdje možete pretraživati ​​stavke na popisu u logaritamskom vremenu.
  • Struktura podataka heap se također koristi za sortiranje putem heap sortiranja.
  • Simuliranje kupaca u redu čekanja.
  • Obrada prekida u Operating sustav.
  • U Huffmanovom kodiranju za kompresiju podataka.
  • Osnaživanje pretraživanja po principu "najbolje prvo" i A* heuristike u planiranju puta umjetne inteligencije.

Svojstva reda čekanja prioriteta hrpe

Sljedeća svojstva opisuju kako se ponaša red prioriteta izgrađen na hrpi:

  • U prioritetnim hrpama, podatkovne stavke na popisu uspoređuju se jedna s drugom kako bi se odredio manji ili veći element.
  • Element se stavlja u red čekanja, a zatim uklanja prema prioritetnom redoslijedu.
  • Svaki element u redu prioriteta ima jedinstveni broj koji se odnosi na njega i identificiran je kao prioritet.
  • Prilikom izlaska iz reda prioriteta, element s najvišim prioritetom izlazi prvi.

Koraci za implementaciju reda prioriteta gomile u Java

Sljedeći dio prelazi u beton Java implementacija koja ta pravila pretvara u funkcionalni kod.

Koraci za implementaciju reda čekanja prioriteta hrpe

Hrpa Sortiraj u Java sa Code Primjer

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);
        }
    }
}

Izlaz

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

Hrpa Sortiraj u Python sa Code Primjer

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)

Izlaz

[1, 3, 4, 7, 9]

Zatim ćete saznati više o Metoda bisekcije.

Pitanja i odgovori

Heap jamči samo poredak roditelj-dijete, tako da je korijen minimalni ili maksimalni. Binarno stablo pretraživanja jamči poredak lijevo-podstablo-manje-od-korijena-manje-od-desnog-podstabla u svakom čvoru, podržavajući brzi prolaz po redoslijedu i pretraživanje ključa.

Odaberite Max-Heap kada vašoj aplikaciji više puta treba najveći element, kao što je raspoređivanje zadatka s najvišim prioritetom ili izvođenje Heap sortiranja uzlaznim redoslijedom. Odaberite Min-Heap kada vam je prvo potreban najmanji element, kao što je Dijkstrin najkraći put.

Umetanje i brisanje u strukturi podataka Heap izvode se za O(log n) zbog heapify puta od korijena do lista. Pregledavanje minimuma ili maksimuma izvodi se za O(1), a izgradnja heapa od n stavki traje O(n).

Heap sortiranje je na mjestu jer sortira niz koristeći O(1) dodatne memorije izvan ulaza. Nije stabilno jer jednaki ključevi mogu zamijeniti relativni redoslijed tijekom heapify i ex.tract-max koraka korištenih za dobivanje sortiranog izlaza.

Algoritmi umjetne inteligencije za pretraživanje poput A* i pretraživanja po principu "prvi najbolji" pohranjuju granične čvorove u Min-Heap s heurističkim cijenom. Heap jamči da se sljedeći proširuje najjeftiniji kandidat, što je ključno za brzo pronalaženje puta, umjetnu inteligenciju u igrama i planere robotike.

Da. Vizualizatori potpomognuti umjetnom inteligencijom mogu generirati detaljne dijagrame umetanja, heapify zamjena i extract-max operacije iz vašeg koda. Oni također označavaju kršenja svojstava heap-a, predlažu ispravke i objašnjavaju asimptotsko ponašanje jednostavnim jezikom, što ubrzava učenje i otklanjanje pogrešaka.

Sažmite ovu objavu uz: