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

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




