Bu eğitimde, yığın veri yapısının ne olduğunu öğreneceksiniz. Ayrıca, C, C ++, Java ve Python'da yığın işlemlerinin çalışan örneklerini bulacaksınız.
Yığın veri yapısı, öbek özelliğini karşılayan tam bir ikili ağaçtır . Aynı zamanda ikili yığın olarak da adlandırılır .
Tam bir ikili ağaç, içinde özel bir ikili ağaçtır.
- muhtemelen son hariç her seviye doldurulur
- tüm düğümler olabildiğince solda
Heap Property, içinde bir düğümün özelliğidir.
- (maks yığın için) her düğümün anahtarı her zaman alt düğümlerinden daha büyüktür ve kök düğümün anahtarı diğer tüm düğümler arasında en büyüğüdür;
- Her bir düğümün (min heap için) anahtarı her zaman alt düğümden / düğümlerden daha küçüktür ve kök düğümün anahtarı diğer tüm düğümler arasında en küçük olanıdır.
Yığın İşlemleri
Bir yığın üzerinde gerçekleştirilen önemli işlemlerden bazıları, algoritmalarıyla birlikte aşağıda açıklanmıştır.
Yığınla
Heapify, ikili bir ağaçtan bir yığın veri yapısı oluşturma işlemidir. Min-Heap veya Max-Heap oluşturmak için kullanılır.
- Girdi dizisi olsun
- Diziden tam bir ikili ağaç oluşturun
- Dizini tarafından verilen yaprak olmayan düğümün ilk dizininden başlayın
n/2 - 1
. - Geçerli öğeyi
i
olarak ayarlalargest
. - Sol çocuk endeksi tarafından verilir
2i + 1
ve sağ çocuk tarafından verilir2i + 2
.
EğerleftChild
daha büyüktürcurrentElement
(en yani elemanith
indeksi), setleftChildIndex
büyük olarak.
EğerrightChild
içinde eleman daha büyüktürlargest
ayarlayınrightChildIndex
olaraklargest
. - Takas
largest
ilecurrentElement
- Alt ağaçlar da yığılıncaya kadar 3-7 arasındaki adımları tekrarlayın.
Algoritma
Heapify(array, size, i) set i as largest leftChild = 2i + 1 rightChild = 2i + 2 if leftChild > array(largest) set leftChildIndex as largest if rightChild > array(largest) set rightChildIndex as largest swap array(i) and array(largest)
Max-Heap oluşturmak için:
MaxHeap(array, size) loop from the first index of non-leaf node down to zero call heapify
Min-Heap için, hem leftChild
ve rightChild
tüm düğümler için üst öğeden daha küçük olmalıdır.
Öbeğe Öğe Ekleme
Max Heap'e ekleme için algoritma
If there is no node, create a newNode. else (a node is already present) insert the newNode at the end (last node from left to right.) heapify the array
- Yeni öğeyi ağacın sonuna ekleyin.
- Ağacı yığınlayın.
Min Heap için, yukarıdaki algoritma parentNode
, her zaman daha küçük olacak şekilde değiştirilir newNode
.
Öğeyi Yığından Sil
Max Heap'te silme algoritması
If nodeToBeDeleted is the leafNode remove the node Else swap nodeToBeDeleted with the lastLeafNode remove noteToBeDeleted heapify the array
- Silinecek öğeyi seçin.
- Son elementle değiştirin.
- Son öğeyi kaldırın.
- Ağacı yığınlayın.
Min Heap için, yukarıdaki algoritma, her ikisinin childNodes
de daha küçük olması için değiştirilmiştir currentNode
.
Göz at (Maksimum / dakika bul)
Peek işlemi, düğümü silmeden Max Heap'ten maksimum elementi veya Min Heap'ten minimum elementi döndürür.
Hem Max heap hem de Min Heap için
rootNode döndür
Ekstrakt-Maks / Min
Extract-Max, bir Max Heap'ten çıkardıktan sonra maksimum değeri olan düğümü döndürürken Extract-Min, Min Heap'ten çıkardıktan sonra düğümü minimum ile döndürür.
Python, Java, C / C ++ Örnekleri
Python Java C C ++ # Max-Heap data structure in Python def heapify(arr, n, i): largest = i l = 2 * i + 1 r = 2 * i + 2 if l < n and arr(i) < arr(l): largest = l if r < n and arr(largest) < arr(r): largest = r if largest != i: arr(i),arr(largest) = arr(largest),arr(i) heapify(arr, n, largest) def insert(array, newNum): size = len(array) if size == 0: array.append(newNum) else: array.append(newNum); for i in range((size//2)-1, -1, -1): heapify(array, size, i) def deleteNode(array, num): size = len(array) i = 0 for i in range(0, size): if num == array(i): break array(i), array(size-1) = array(size-1), array(i) array.remove(num) for i in range((len(array)//2)-1, -1, -1): heapify(array, len(array), i) arr = () insert(arr, 3) insert(arr, 4) insert(arr, 9) insert(arr, 5) insert(arr, 2) print ("Max-Heap array: " + str(arr)) deleteNode(arr, 4) print("After deleting an element: " + str(arr))
// Max-Heap data structure in Java import java.util.ArrayList; class Heap ( void heapify(ArrayList hT, int i) ( int size = hT.size(); int largest = i; int l = 2 * i + 1; int r = 2 * i + 2; if (l hT.get(largest)) largest = l; if (r hT.get(largest)) largest = r; if (largest != i) ( int temp = hT.get(largest); hT.set(largest, hT.get(i)); hT.set(i, temp); heapify(hT, largest); ) ) void insert(ArrayList hT, int newNum) ( int size = hT.size(); if (size == 0) ( hT.add(newNum); ) else ( hT.add(newNum); for (int i = size / 2 - 1; i>= 0; i--) ( heapify(hT, i); ) ) ) void deleteNode(ArrayList hT, int num) ( int size = hT.size(); int i; for (i = 0; i = 0; j--) ( heapify(hT, j); ) ) void printArray(ArrayList array, int size) ( for (Integer i : array) ( System.out.print(i + " "); ) System.out.println(); ) public static void main(String args()) ( ArrayList array = new ArrayList(); int size = array.size(); Heap h = new Heap(); h.insert(array, 3); h.insert(array, 4); h.insert(array, 9); h.insert(array, 5); h.insert(array, 2); System.out.println("Max-Heap array: "); h.printArray(array, size); h.deleteNode(array, 4); System.out.println("After deleting an element: "); h.printArray(array, size); ) )
// Max-Heap data structure in C #include int size = 0; void swap(int *a, int *b) ( int temp = *b; *b = *a; *a = temp; ) void heapify(int array(), int size, int i) ( if (size == 1) ( printf("Single element in the heap"); ) else ( int largest = i; int l = 2 * i + 1; int r = 2 * i + 2; if (l array(largest)) largest = l; if (r array(largest)) largest = r; if (largest != i) ( swap(&array(i), &array(largest)); heapify(array, size, largest); ) ) ) void insert(int array(), int newNum) ( if (size == 0) ( array(0) = newNum; size += 1; ) else ( array(size) = newNum; size += 1; for (int i = size / 2 - 1; i>= 0; i--) ( heapify(array, size, i); ) ) ) void deleteRoot(int array(), int num) ( int i; for (i = 0; i = 0; i--) ( heapify(array, size, i); ) ) void printArray(int array(), int size) ( for (int i = 0; i < size; ++i) printf("%d ", array(i)); printf(""); ) int main() ( int array(10); insert(array, 3); insert(array, 4); insert(array, 9); insert(array, 5); insert(array, 2); printf("Max-Heap array: "); printArray(array, size); deleteRoot(array, 4); printf("After deleting an element: "); printArray(array, size); )
// Max-Heap data structure in C++ #include #include using namespace std; void swap(int *a, int *b) ( int temp = *b; *b = *a; *a = temp; ) void heapify(vector &hT, int i) ( int size = hT.size(); int largest = i; int l = 2 * i + 1; int r = 2 * i + 2; if (l hT(largest)) largest = l; if (r hT(largest)) largest = r; if (largest != i) ( swap(&hT(i), &hT(largest)); heapify(hT, largest); ) ) void insert(vector &hT, int newNum) ( int size = hT.size(); if (size == 0) ( hT.push_back(newNum); ) else ( hT.push_back(newNum); for (int i = size / 2 - 1; i>= 0; i--) ( heapify(hT, i); ) ) ) void deleteNode(vector &hT, int num) ( int size = hT.size(); int i; for (i = 0; i = 0; i--) ( heapify(hT, i); ) ) void printArray(vector &hT) ( for (int i = 0; i < hT.size(); ++i) cout << hT(i) << " "; cout << ""; ) int main() ( vector heapTree; insert(heapTree, 3); insert(heapTree, 4); insert(heapTree, 9); insert(heapTree, 5); insert(heapTree, 2); cout << "Max-Heap array: "; printArray(heapTree); deleteNode(heapTree, 4); cout << "After deleting an element: "; printArray(heapTree); )
Yığın Veri Yapısı Uygulamaları
- Heap, bir öncelik kuyruğu uygulanırken kullanılır.
- Dijkstra Algoritması
- Yığın Sıralama