Heap adatszerkezet: Mi a heap?

⚡ Okos összefoglaló

A heap adatstruktúra egy speciális, teljes bináris fa, ahol minden szülő csomópont szigorú rendezési kapcsolatot tart fenn gyermekeivel, lehetővé téve a logaritmikus beszúrásokat, törléseket és prioritási sorműveleteket a rendezési, ütemezési és gráffeldolgozási feladatok között.

  • ???? Fa alakja: A heap egy teljes bináris fa, amely balról jobbra van kitöltve, és minden csomópontban egyedi kulcsokkal rendelkezik a gyors összehasonlítás érdekében.
  • ⬆️ Max-Heap: Minden szülő nagyobb vagy egyenlő a gyermekeinél, így az O(1) hozzáférés esetén a legnagyobb elem mindig a gyökérben található.
  • ⬇️ Min-Heap: Minden szülő kisebb vagy egyenlő a gyermekeivel, keeping a gyökérben lévő legkisebb elem a prioritásos lekéréshez.
  • ✅ Mag Operafeltételek: A Keresés, Beszúrás, Törlés, Halmozottan rendezés és Egyesítés műveletek O(log n) idő alatt futnak, támogatva a Halmozottan rendezés és a Prioritási sor logikát.
  • 🧪 Valódi felhasználások: A Heap Data Structure támogatja a spam szűrését, a gráfalgoritmusokat, az operációs rendszer ütemezését, a Huffman-kódolást és a mesterséges intelligencia heurisztikus keresését.

Mi az a halom adatszerkezet?

A heap egy speciális, fa alapú adatstruktúra. A heap adatstruktúra egy legfelső csomópontból, a gyökérből (szülőből) áll. A második csomópont a gyökér bal oldali gyermeke, míg a harmadik csomópont a gyökér jobb oldali gyermeke. Az egymást követő csomópontok balról jobbra töltődnek ki. A szülő-csomópont kulcs összehasonlítható az utód kulcsával, így megfelelő elrendezés jön létre. A fa könnyen vizualizálható, ahol minden entitást csomópontnak neveznek, és minden csomópontnak egyedi kulcsa van az azonosításhoz.

Egyszerűen fogalmazva, a Heap egy teljes bináris fa, amely kielégíti a heap tulajdonságot: minden szülő konzisztensen rendezett a gyermekeihez képest, ami ideálissá teszi prioritási sorokhoz és Heap rendezéshez.

Miért van szüksége a Heap adatszerkezetre?

Íme a Heap használatának fő okai:

  • A Heap adatstruktúra logaritmikus idő alatt – O(log) – lehetővé teszi a törlést és a beszúrást.2nem).
  • A fában lévő adatok egy adott sorrendben vannak elrendezve. Az olyan értékek frissítése vagy lekérdezése mellett, mint a maximum vagy minimum, a programozó kapcsolatokat is kereshet a szülő és az utód között.
  • Alkalmazhatja a koncepciót a Dokumentumobjektum-modell hogy segítsen vizuálisan megérteni a Heap adatszerkezetét.
  • A halmok hatékony prioritási sorműveleteket támogatnak, amelyek kritikus fontosságúak olyan gráfalgoritmusok számára, mint a Dijkstra-féle legrövidebb út és a Prim-féle minimális feszítőfa.

A kupacok típusai

A Heap Data Structure különféle algoritmusokkal rendelkezik az elemek beszúrásának és eltávolításának kezelésére, beleértve a prioritási sort, a bináris halmot, a binomiális halmot és a Halom rendezés.

  • Elsőbbségi sor: Ez egy hasizmottracPriorizált objektumokat tartalmazó adatstruktúra. Minden objektumhoz vagy elemhez előre beállított prioritás tartozik. Ezért a magasabb prioritású objektum vagy elem kapja meg a szolgáltatást a többi előtt.
  • Bináris halom: A bináris heapek alkalmasak egyszerű heap műveletekhez, például törlésekhez és beszúrásokhoz. Ezek az alapértelmezett implementációk a legtöbb szabványos könyvtári prioritási sor mögött.
  • Binomiális halom: Egy binomiális halom binomiális fák sorozatából áll, amelyek a halmot alkotják. A binomiális halomfa nem egy szokványos fa, mivel szigorúan definiált. A binomiális fa elemeinek teljes száma mindig 2.n csomópontokat.
  • Halomrendezés: A legtöbb rendezőalgoritmussal ellentétben a Heap Sort O(1) teret használ a rendezési művelethez. Ez egy összehasonlításon alapuló rendezési algoritmus, ahol a rendezés növekvő sorrendben történik, először a bemenetet egy Max-Heap-pé alakítva. A Heap Sort-ot egy továbbfejlesztett bináris keresőfának tekinthetjük.

Egy halom adatstruktúra jellemzően két stratégiát alkalmaz. A 12 – 8 – 4 – 2 és 1 bemenetek esetén:

  • Min-Heap – legalacsonyabb érték felül
  • Max-Heap – legmagasabb érték felül

A kupacok típusai

Min-Heap

A Min-Heap struktúrában a gyökércsomópont értéke vagy egyenlő, vagy kisebb, mint a csomópont gyermekeinek értéke. A Min-Heap gyökere tehát a minimális értéket tartalmazza. A Min-Heap egy teljes bináris fa is.

Ha egy fában létrehoztunk egy Min-Heap-et, akkor minden levél szóba jöhet a maximális érték elérésére. Azonban minden egyes levelet meg kell vizsgálnunk, hogy megkapjuk a pontos Max-Heap értéket.

Min-Heap példa

Minimális kupac példa

A fenti ábrán jól látható a gyökértől a legalacsonyabb csomópontig tartó sorrend.

Tegyük fel, hogy az elemeket az Array_N[12, 2, 8, 1, 4] tömbben tároljuk. Amint a tömbből látható, a gyökérelem megsérti a Min-Heap prioritást. A Min-Heap tulajdonság fenntartásához a min-heapify műveleteket kell végrehajtani az elemek felcseréléséhez, amíg a Min-Heap szabályok nem teljesülnek.

Max-Heap

A Max-Heap struktúrában a szülő- vagy gyökércsomópont értéke egyenlő vagy nagyobb, mint a gyermekeié. Ez a csomópont tartalmazza a maximális értéket. Ez egy teljes bináris fa, így egy Max-Heap struktúrát O(n) idő alatt felépíthetsz értékek egy gyűjteményéből.

Íme néhány módszer, amelyet általában a megvalósítás során használnak Java Max-Heap:

  • Hozzáadás (): Új elemet helyez el egy halomban. Tömb használata esetén az objektumok a tömb végére kerülnek, míg a bináris fában az objektumok felülről lefelé, majd balról jobbra kerülnek hozzáadásra.
  • Eltávolítás (): Ez a metódus lehetővé teszi az első elem eltávolítását a tömblistából. Mivel az újonnan előléptetett elem már nem a legnagyobb, a Sift-Down metódus mindig az új helyére helyezi át.
  • Leszűrés (): Ez a metódus összehasonlítja a gyökérobjektumot a gyermekeivel, majd az áthelyezett csomópontot a megfelelő pozícióba helyezi.
  • Szitálás (): Ha a tömb metódust használod egy újonnan beszúrt elem tömbhöz való hozzáadásához, akkor a Sift-Up metódus segít az újonnan hozzáadott csomópontnak a megfelelő pozícióba helyezni. Az új elemet először a szülőjével hasonlítja össze a fa adatstruktúra szimulációjával.

    Alkalmazd a Parent_Index = Child_Index / 2 képletet. Ezt addig folytasd, amíg a maximális elem a tömb elejére nem kerül.

Alapkupac OperaTIONS

Ahhoz, hogy megtaláld egy adathalmaz legmagasabb és legalacsonyabb értékét, néhány alapvető halomműveletre van szükséged, mint például a keresés, beszúrás és törlés. Mivel az elemek folyamatosan jönnek és mennek, tudnod kell, hogyan:

  • Találjon – Keressen egy tárgyat egy kupacban.
  • betétlap – Adjon hozzá egy új gyereket a kupachoz.
  • Törölni – Csomópont törlése a kupacból.

Hozzon létre kupacokat

A heapek létrehozásának folyamatát heapek létrehozásának nevezzük. Adott kulcslista alapján a programozó létrehoz egy üres heap-et, majd az alapvető heap műveletek segítségével egyenként beszúrja a többi kulcsot.

Kezdjük el egy Min-Heap építését William módszerével a 12, 2, 8, 1 és 4 értékek beillesztésével. Az n elemű halmot úgy építhetjük fel, hogy egy üres halommal kezdünk, majd O(n log n) idő alatt egymás után más elemekkel töltjük fel.

Hozzon létre kupacokat

  • Heapify: Egy beszúrási rutin, amely segít elemeket beszúrni egy halomba, miközben megőrzi a halom tulajdonságot.

    Például egy max-heapify művelet ellenőrzi, hogy a szülő értéke nagyobb-e, mint az utód értéke. Az elemek ezután olyan metódusokkal rendezhetők, mint a swapping.

  • Összeolvad: Ha két halom értékét kell egybevonni, az egyesítés művelettel egyesítheted a két halom értékeit. Az eredeti halmok továbbra is megőrződnek.

Vizsgálja meg a kupacokat

A heapek ellenőrzése a heap adatszerkezetében lévő elemek számának ellenőrzését és annak ellenőrzését jelenti, hogy a heap üres-e.

Fontos a heapek vizsgálata az elemek rendezése vagy sorba állítása közben. Fontos ellenőrizni, hogy vannak-e feldolgozandó elemek az Is-Empty() használatával. A heap mérete segít megtalálni a Max-Heap vagy Min-Heap gyökereit, ezért tudnod kell, hogy hány elem követi a heap tulajdonságot.

  • Méret – visszaadja a halom nagyságát vagy hosszát. Megmutatja, hogy hány elem van rendezett sorrendben tárolva.
  • Üres – IGAZ értéket ad vissza, ha a heap null, egyébként HAMIS értéket.

Itt az összes elemet kinyomtatja prioritásQ ciklust, majd ellenőrizze, hogy a priorityQ nem üres-e.

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

A kupac adatstruktúra felhasználása

A heap adatszerkezet számos programozási alkalmazásban hasznos a való életben, például:

  • Segít a spam szűrésében.
  • Gráfalgoritmusok, például Dijkstra és Prim megvalósítása.
  • Operaa rendszer terheléselosztása és az adattömörítés.
  • Rendezési statisztikák keresése, például a k-adik legkisebb elem.
  • Prioritási sorok megvalósítása, ahol logaritmikus időben kereshetsz egy lista elemeit.
  • A halom adatszerkezetet a halomrendezésen keresztüli rendezésre is használják.
  • Várakozó sorban álló ügyfelek szimulálása.
  • Megszakításkezelés a Operating rendszer.
  • Huffman kódolás az adattömörítéshez.
  • A legjobbat elsőként keresés és az A* heurisztikák támogatása a mesterséges intelligencia általi úttervezésben.

Halom prioritási sor tulajdonságai

A következő tulajdonságok leírják, hogyan viselkedik a halomra épített prioritási sor:

  • A prioritási kupacokban a lista adatelemeit összehasonlítják egymással, hogy meghatározzák a kisebb vagy nagyobb elemet.
  • Egy elemet egy sorba helyeznek, majd prioritási sorrendben eltávolítanak.
  • A prioritási sorban minden egyes elemhez egyedi szám tartozik, amelyet prioritásként azonosítanak.
  • Egy prioritási sorból való kilépéskor a legmagasabb prioritású elem lép ki először.

A Heap prioritási sor megvalósításának lépései a következőben: Java

A következő szakasz betonba kerül. Java olyan implementáció, amely ezeket a szabályokat működő kóddá alakítja.

A kupac prioritási sor megvalósításának lépései

Halom Rendezés Java ahol Code Példa

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

teljesítmény

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

Halom Rendezés Python ahol Code Példa

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)

teljesítmény

[1, 3, 4, 7, 9]

Ezután megismerkedhetsz a Felezési módszer.

GYIK

Egy Heap csak a szülő-gyermek rendezést garantálja, tehát a gyökér a minimum vagy a maximum. Egy bináris keresőfa garantálja a bal részfa-gyökérnél kisebb-jobb részfa rendezést minden csomópontban, támogatva a gyors sorrenden belüli bejárást és a kulcskeresést.

Válasszon Max-Heap rendezést, ha az alkalmazásnak ismételten szüksége van a legnagyobb elemre, például a legmagasabb prioritású feladat ütemezésekor vagy növekvő sorrendű Heap Rendezés futtatásakor. Válasszon Min-Heap rendezést, ha a legkisebb elemre van szüksége először, például a Dijkstra-féle legrövidebb út meghatározásakor.

Egy heap adatstruktúrában a beszúrás és törlés O(log n) idő alatt fut, mivel a heap-elés során a gyökértől a levélig tartó útvonal szükséges. A minimum vagy maximum kikeresése O(1) idő alatt fut, és egy n elemből álló heap felépítése O(n) időt vesz igénybe.

A heap rendezése azért van így, mert a bemeneten túl O(1) extra memóriát használva rendezi a tömböt. Ez nem stabil, mivel az egyenlő kulcsok felcserélhetik a relatív sorrendet a heap rendezés és az ex során.tracA rendezett kimenet előállításához használt t-max lépések.

Az olyan mesterséges intelligencia alapú keresési algoritmusok, mint az A* és a legjobb-első keresés, a határcsomópontokat egy heurisztikus költséggel kulcsolt Min-Heap-ben tárolják. A halom garantálja, hogy a legolcsóbb jelölt kerül következőként kibontásra, ami kritikus fontosságú a gyors útkeresés, a játékokban használt mesterséges intelligencia és a robotika tervezése szempontjából.

Igen. A mesterséges intelligencia által támogatott vizualizátorok lépésről lépésre diagramokat tudnak generálni a beszúrásokról, heapify swapokról és ex-ekről.tract-max műveleteket a kódodból. Jelzik a heap-tulajdonságok megsértéseit, javításokat javasolnak, és egyszerű nyelven elmagyarázzák az aszimptotikus viselkedést, ami felgyorsítja a tanulást és a hibakeresést.

Foglald össze ezt a bejegyzést a következőképpen: