Structura datelor Heap: Ce este Heap-ul?

โšก Rezumat inteligent

Structura de date Heap este un arbore binar complet specializat รฎn care fiecare nod pฤƒrinte menศ›ine o relaศ›ie de ordonare strictฤƒ cu copiii sฤƒi, permiศ›รขnd inserศ›ii logaritmice, ศ™tergeri ศ™i operaศ›iuni de coadฤƒ prioritarฤƒ รฎn sarcinile de lucru de sortare, planificare ศ™i graficฤƒ.

  • ๐ŸŒณ Forma arborelui: Un Heap este un arbore binar complet umplut de la stรขnga la dreapta, cu chei unice la fiecare nod pentru o comparaศ›ie rapidฤƒ.
  • โฌ†๏ธ Max-Heap: Fiecare pฤƒrinte este mai mare sau egal cu copiii sฤƒi, deci cel mai mare element se aflฤƒ รฎntotdeauna la rฤƒdฤƒcinฤƒ pentru accesul O(1).
  • โฌ‡๏ธ Min-Heap: Fiecare pฤƒrinte este mai mic sau egal cu copiii sฤƒi, keeping cel mai mic element de la rฤƒdฤƒcinฤƒ pentru regฤƒsire prioritarฤƒ.
  • โœ… Nucleu Operaacศ›iuni: Funcศ›iile Find, Insert, Delete, Heapify ศ™i Merge se executฤƒ รฎn timp O(log n), suportรขnd logica Heap Sort ศ™i Priority Queue.
  • ๐Ÿงช Utilizฤƒri reale: Structura de date Heap este esenศ›ialฤƒ pentru filtrarea spamului, algoritmii grafici, planificarea sistemului de operare, codarea Huffman ศ™i cฤƒutarea euristicฤƒ prin inteligenศ›ฤƒ artificialฤƒ.

Ce este o structurฤƒ de date Heap?

Un Heap este o structurฤƒ de date specializatฤƒ, bazatฤƒ pe arbore. Structura de date Heap cuprinde un nod superior numit rฤƒdฤƒcinฤƒ (pฤƒrinte). Al doilea nod este copilul stรขng al rฤƒdฤƒcinii, รฎn timp ce al treilea nod este copilul drept al rฤƒdฤƒcinii. Nodurile succesive sunt completate de la stรขnga la dreapta. Cheia nodului pฤƒrinte se comparฤƒ cu cea a urmaศ™ilor sฤƒi, astfel รฎncรขt sฤƒ se producฤƒ o aranjare corectฤƒ. Arborele este uศ™or de vizualizat, fiecare entitate fiind numitฤƒ nod, iar fiecare nod are o cheie unicฤƒ pentru identificare.

รŽn termeni simpli, un Heap este un arbore binar complet care satisface proprietatea heap: fiecare pฤƒrinte este ordonat consecvent รฎn raport cu copiii sฤƒi, ceea ce รฎl face ideal pentru cozi de prioritate ศ™i sortare รฎn Heap.

De ce aveศ›i nevoie de Heap Data Structure?

Iatฤƒ principalele motive pentru utilizarea unui Heap:

  • Structura de date Heap permite ศ™tergerea ศ™i inserarea รฎn timp logaritmic โ€“ O(log2nu).
  • Datele din arbore sunt aranjate รฎntr-o anumitฤƒ ordine. Pe lรขngฤƒ actualizarea sau interogarea valorilor precum un maxim sau un minim, programatorul poate gฤƒsi relaศ›ii รฎntre pฤƒrinte ศ™i urmaศ™.
  • Puteศ›i aplica conceptul de Model de obiect document pentru a vฤƒ ajuta sฤƒ รฎnศ›elegeศ›i vizual structura de date Heap.
  • Heap-urile acceptฤƒ operaศ›ii eficiente รฎn coada de prioritate, care sunt esenศ›iale pentru algoritmi grafici, cum ar fi cea mai scurtฤƒ cale a lui Dijkstra ศ™i arborele de acoperire minim al lui Prim.

Tipuri de grฤƒmezi

Structura de date Heap are diverศ™i algoritmi pentru gestionarea inserศ›iilor ศ™i eliminarea elementelor, inclusiv coada de prioritate, heap binarฤƒ, heap binomialฤƒ ศ™i Sortare รฎn grฤƒmadฤƒ.

  • Coada prioritarฤƒ: Este un abdomentracStructura de date t conศ›ine obiecte prioritizate. Fiecare obiect sau element are o prioritate prestabilitฤƒ. Prin urmare, obiectul sau elementul cฤƒruia i se atribuie prioritatea mai mare primeศ™te serviciul รฎnaintea celorlalte.
  • Heap binar: Heap-urile binare sunt potrivite pentru operaศ›iuni simple de heap, cum ar fi ศ™tergerile ศ™i inserศ›iile. Acestea reprezintฤƒ implementarea implicitฤƒ din spatele majoritฤƒศ›ii cozilor de prioritate standard ale bibliotecilor.
  • Grฤƒmadฤƒ binomialฤƒ: Un heap binomial constฤƒ dintr-o serie de colecศ›ii de arbori binomiali care alcฤƒtuiesc heap-ul. Un arbore heap binomial nu este un arbore obiศ™nuit, deoarece este riguros definit. Numฤƒrul total de elemente dintr-un arbore binomial este รฎntotdeauna egal cu 2.n noduri.
  • Sortare รฎn heap: Spre deosebire de majoritatea algoritmilor de sortare, Heap Sort utilizeazฤƒ spaศ›iul O(1) pentru operaศ›ia sa de sortare. Este un algoritm de sortare bazat pe comparaศ›ii รฎn care sortarea are loc รฎn ordine crescฤƒtoare prin transformarea mai รฎntรขi a intrฤƒrii รฎntr-un Max-Heap. Puteศ›i considera Heap Sort ca un arbore binar de cฤƒutare รฎmbunฤƒtฤƒศ›it.

De obicei, o structurฤƒ de date Heap foloseศ™te douฤƒ strategii. Pentru intrฤƒrile 12 โ€“ 8 โ€“ 4 โ€“ 2 ศ™i 1:

  • Min-Heap โ€“ cea mai micฤƒ valoare รฎn partea de sus
  • Max-Heap โ€“ cea mai mare valoare din vรขrf

Tipuri de grฤƒmezi

Min-Heap

รŽn structura Min-Heap, nodul rฤƒdฤƒcinฤƒ are o valoare fie egalฤƒ, fie mai micฤƒ decรขt copiii acelui nod. Prin urmare, rฤƒdฤƒcina unui Min-Heap deศ›ine valoarea minimฤƒ. Min-Heap este, de asemenea, un arbore binar complet.

Odatฤƒ ce ai un Min-Heap รฎntr-un arbore, toate frunzele sunt candidaศ›i viabili pentru valoarea maximฤƒ. Cu toate acestea, trebuie sฤƒ examinezi fiecare frunzฤƒ pentru a obศ›ine valoarea exactฤƒ a Max-Heap.

Exemplu de Min-Heap

Exemplu min Heap

รŽn diagrama de mai sus, puteศ›i observa o secvenศ›ฤƒ clarฤƒ de la rฤƒdฤƒcinฤƒ pรขnฤƒ la nodul cel mai de jos.

Sฤƒ presupunem cฤƒ stocaศ›i elementele รฎn matricea Array_N[12, 2, 8, 1, 4]. Dupฤƒ cum puteศ›i vedea din matrice, elementul rฤƒdฤƒcinฤƒ รฎncalcฤƒ prioritatea Min-Heap. Pentru a menศ›ine proprietatea Min-Heap, trebuie sฤƒ efectuaศ›i operaศ›iile min-heapify pentru a schimba elementele pรขnฤƒ cรขnd regulile Min-Heap sunt รฎndeplinite.

Max-Heap

รŽn structura Max-Heap, nodul pฤƒrinte sau rฤƒdฤƒcinฤƒ are o valoare egalฤƒ sau mai mare decรขt fiii sฤƒi. Acest nod deศ›ine valoarea maximฤƒ. Este un arbore binar complet, deci puteศ›i construi un Max-Heap dintr-o colecศ›ie de valori รฎntr-un timp O(n).

Iatฤƒ cรขteva metode utilizate รฎn mod obiศ™nuit la implementarea unui Java Max-Heap:

  • Adฤƒugaศ›i (): Plaseazฤƒ un element nou รฎntr-o matrice (heap). Dacฤƒ utilizaศ›i o matrice (array), obiectele sunt adฤƒugate la sfรขrศ™itul matricei, รฎn timp ce รฎn arborele binar, obiectele sunt adฤƒugate de sus รฎn jos ศ™i apoi de la stรขnga la dreapta.
  • Eliminare (): Aceastฤƒ metodฤƒ vฤƒ permite sฤƒ eliminaศ›i primul element din lista de matrice. Deoarece elementul nou promovat nu mai este cel mai mare, metoda Sift-Down รฎl mutฤƒ รฎntotdeauna รฎn noua sa locaศ›ie.
  • Cernere (): Aceastฤƒ metodฤƒ comparฤƒ un obiect rฤƒdฤƒcinฤƒ cu copiii sฤƒi ศ™i apoi รฎmpinge nodul relocat รฎn poziศ›ia sa corectฤƒ.
  • Cernere (): Dacฤƒ utilizaศ›i metoda matricei pentru a adฤƒuga un element nou inserat รฎntr-o matrice, atunci metoda Sift-Up ajutฤƒ nodul nou adฤƒugat sฤƒ se mute รฎn poziศ›ia corectฤƒ. Noul element este mai รฎntรขi comparat cu pฤƒrintele sฤƒu prin simularea structurii de date arborescente.

    Aplicaศ›i formula Parent_Index = Child_Index / 2. Continuaศ›i sฤƒ faceศ›i acest lucru pรขnฤƒ cรขnd elementul maxim se aflฤƒ รฎn partea de sus a matricei.

Heap de bazฤƒ Operaศ›ii

Pentru a gฤƒsi cele mai mari ศ™i cele mai mici valori dintr-un set de date, aveศ›i nevoie de cรขteva operaศ›iuni heap de bazฤƒ, cum ar fi gฤƒsirea, inserarea ศ™i ศ™tergerea. Deoarece elementele apar ศ™i dispar constant, ar trebui sฤƒ ศ™tiศ›i cum sฤƒ:

  • Gฤƒsi โ€“ Cฤƒutaศ›i un articol รฎn grฤƒmada.
  • Insera โ€“ Adฤƒugaศ›i un nou copil รฎn grฤƒmada.
  • ศ˜terge โ€“ ศ˜tergeศ›i un nod dintr-un heap.

Creaศ›i grฤƒmezi

Procesul de construire a heap-urilor este cunoscut sub numele de creare a heap-urilor. Avรขnd o listฤƒ de chei, programatorul creeazฤƒ o heap goalฤƒ ศ™i apoi introduce celelalte chei pe rรขnd folosind operaศ›iile de bazฤƒ ale heap-urilor.

Aศ™adar, sฤƒ รฎncepem sฤƒ construim un Min-Heap folosind metoda lui William prin inserarea valorilor 12, 2, 8, 1 ศ™i 4. Puteศ›i construi heap-ul cu n elemente รฎncepรขnd cu un heap gol ศ™i apoi umplรขndu-l succesiv cu alte elemente folosind timpul O(n log n).

Creaศ›i grฤƒmezi

  • รŽngrฤƒmฤƒdire: O rutinฤƒ de inserare care ajutฤƒ la inserarea elementelor รฎntr-o heap, pฤƒstrรขnd รฎn acelaศ™i timp proprietatea heap.

    De exemplu, o operaศ›ie max-heapify verificฤƒ dacฤƒ valoarea elementului pฤƒrinte este mai mare decรขt cea a elementului urmaศ™. Elementele pot fi apoi sortate folosind metode precum swapping.

  • Combina: Cรขnd aveศ›i douฤƒ heap-uri de combinat รฎntr-una singurฤƒ, utilizaศ›i operaศ›ia de รฎmbinare pentru a aduce รฎmpreunฤƒ valorile din cele douฤƒ heap-uri. Heap-urile originale sunt รฎn continuare pฤƒstrate.

Inspectaศ›i grฤƒmezi

Inspectarea heap-urilor se referฤƒ la verificarea numฤƒrului de elemente din structura de date a heap-ului ศ™i la validarea dacฤƒ heap-ul este gol.

Este important sฤƒ inspectaศ›i heap-urile รฎn timp ce sortaศ›i sau puneศ›i elementele รฎn coadฤƒ. Verificarea dacฤƒ existฤƒ elemente de procesat folosind Is-Empty() este importantฤƒ. Dimensiunea heap-ului va ajuta la localizarea rฤƒdฤƒcinilor Max-Heap sau Min-Heap, aศ™a cฤƒ trebuie sฤƒ ศ™tiศ›i cรขte elemente urmeazฤƒ proprietatea heap.

  • Mฤƒrimea โ€“ returneazฤƒ magnitudinea sau lungimea heap-ului. Vฤƒ spune cรขte elemente sunt stocate รฎn ordine sortatฤƒ.
  • Este gol โ€“ returneazฤƒ TRUE dacฤƒ heap-ul este nul, altfel returneazฤƒ FALSE.

Aici, imprimaศ›i toate elementele din prioritateQ buclฤƒ ศ™i apoi verificรขnd cฤƒ priorityQ nu este goalฤƒ.

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

Utilizฤƒri ale structurii de date Heap

Structura de date Heap este utilฤƒ รฎn multe aplicaศ›ii de programare din viaศ›a realฤƒ, cum ar fi:

  • Ajutฤƒ la filtrarea spamului.
  • Implementarea algoritmilor grafici precum Dijkstra ศ™i Prim.
  • Operaechilibrarea รฎncฤƒrcฤƒrii sistemului ting ศ™i compresia datelor.
  • Gฤƒsirea statisticilor de ordine, cum ar fi al k-lea cel mai mic element.
  • Implementarea cozilor de prioritate รฎn care puteศ›i cฤƒuta elemente dintr-o listฤƒ รฎn timp logaritmic.
  • Structura de date Heap este utilizatฤƒ ศ™i pentru sortarea prin Heap Sort.
  • Simularea clienศ›ilor la coadฤƒ.
  • Gestionarea รฎntreruperilor รฎn Operating System.
  • รŽn codarea Huffman pentru compresia datelor.
  • รŽmbunฤƒtฤƒศ›irea cฤƒutฤƒrii de tip โ€žcel mai bun primulโ€ ศ™i a euristicilor A* รฎn planificarea traseelor โ€‹โ€‹prin inteligenศ›ฤƒ artificialฤƒ.

Proprietฤƒศ›i de coadฤƒ prioritarฤƒ heap

Urmฤƒtoarele proprietฤƒศ›i descriu cum se comportฤƒ coada de prioritฤƒศ›i construitฤƒ pe o heap:

  • รŽn heap-urile cu prioritate, elementele de date din listฤƒ sunt comparate รฎntre ele pentru a determina care este elementul mai mic sau mai mare.
  • Un element este plasat รฎntr-o coadฤƒ ศ™i apoi eliminat รฎn ordinea prioritฤƒศ›ii.
  • Fiecare element din coada de prioritฤƒศ›i are un numฤƒr unic asociat, identificat ca prioritate.
  • La ieศ™irea dintr-o coadฤƒ de prioritate, elementul cu prioritate maximฤƒ iese primul.

Paศ™i pentru implementarea cozii de prioritate Heap รฎn Java

Urmฤƒtoarea secศ›iune se mutฤƒ รฎntr-o zonฤƒ betonatฤƒ Java implementare care transformฤƒ aceste reguli รฎn cod funcศ›ional.

Paศ™i pentru implementarea Cozii de prioritate heap

Sortare รฎn grฤƒmada Java implementate cu Code Exemplu

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

producศ›ie

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

Sortare รฎn grฤƒmada Python implementate cu Code Exemplu

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)

producศ›ie

[1, 3, 4, 7, 9]

รŽn continuare, veศ›i afla despre Metoda Bisecศ›iei.

รŽntrebฤƒri frecvente

Un Heap garanteazฤƒ doar ordonarea pฤƒrinte-copil, deci rฤƒdฤƒcina este minimul sau maximul. Un arbore binar de cฤƒutare garanteazฤƒ ordonarea subarborelui stรขng mai mic decรขt rฤƒdฤƒcina mai micฤƒ decรขt subarborelui drept pe fiecare nod, suportรขnd parcurgerea rapidฤƒ รฎn ordine ศ™i cฤƒutarea cheilor.

Alegeศ›i un Max-Heap atunci cรขnd aplicaศ›ia dvs. are nevoie รฎn mod repetat de cel mai mare element, cum ar fi programarea sarcinii cu cea mai mare prioritate sau rularea sortฤƒrii Heap รฎn ordine crescฤƒtoare. Alegeศ›i un Min-Heap atunci cรขnd aveศ›i nevoie mai รฎntรขi de cel mai mic element, cum ar fi cea mai scurtฤƒ cale a lui Dijkstra.

Inserarea ศ™i ศ™tergerea รฎntr-o structurฤƒ de date Heap se executฤƒ รฎn O(log n) datoritฤƒ cฤƒii heapify de la rฤƒdฤƒcinฤƒ la frunzฤƒ. Verificarea execuศ›iilor minime sau maxime รฎn O(1) ศ™i construirea unui heap din n elemente necesitฤƒ O(n).

Sortarea รฎn heap este implementatฤƒ deoarece sorteazฤƒ matricea folosind O(1) memorie suplimentarฤƒ dincolo de intrare. Nu este stabilฤƒ, deoarece cheile egale pot schimba ordinea relativฤƒ รฎn timpul sortฤƒrii รฎn heap ศ™i ex.tracPaศ™ii t-max utilizaศ›i pentru a produce rezultatul sortat.

Algoritmii de cฤƒutare bazaศ›i pe inteligenศ›ฤƒ artificialฤƒ, cum ar fi A* ศ™i cฤƒutarea de tip โ€žcel mai bun primulโ€, stocheazฤƒ nodurile de frontierฤƒ รฎntr-un Min-Heap cu cheie euristicฤƒ. Heap-ul garanteazฤƒ cฤƒ cel mai ieftin candidat este extins รฎn continuare, ceea ce este esenศ›ial pentru gฤƒsirea rapidฤƒ a traseelor, inteligenศ›a artificialฤƒ รฎn jocuri ศ™i planificarea roboticii.

Da. Vizualizatoarele asistate de inteligenศ›ฤƒ artificialฤƒ pot genera diagrame pas cu pas ale inserศ›iilor, swap-urilor heapify ศ™i ex.tracoperaศ›iuni t-max din codul dvs. De asemenea, acestea semnaleazฤƒ รฎncฤƒlcฤƒrile proprietฤƒศ›ilor heap, sugereazฤƒ remedieri ศ™i explicฤƒ comportamentul asimptotic รฎn limbaj simplu, ceea ce accelereazฤƒ รฎnvฤƒศ›area ศ™i depanarea.

Rezumaศ›i aceastฤƒ postare cu: