logo

Введення в Min-Heap – Навчальні посібники зі структури даних і алгоритмів

А Min-Heap визначається як вид Структура даних купи — це тип двійкового дерева, який зазвичай використовується в інформатиці для різних цілей, включаючи сортування, пошук і впорядкування даних.

Введення в Min-Heap – Навчальні посібники зі структури даних і алгоритмів



Призначення та випадки використання Min-Heap:

  • Реалізація пріоритетної черги: Одним із основних застосувань структури даних купи є реалізація пріоритетних черг.
  • Алгоритм Дейкстри : Алгоритм Дейкстри — це алгоритм найкоротшого шляху, який знаходить найкоротший шлях між двома вузлами на графі. Мінімальна купа може бути використана для відстеження невідвіданих вузлів із найменшою відстанню від вихідного вузла.
  • Сортування: Мінімальна купа може бути використана як алгоритм сортування для ефективного сортування колекції елементів у порядку зростання.
  • Середній результат: Min heap можна використовувати для ефективного знаходження медіани потоку чисел. Ми можемо використовувати одну мінімальну купу для зберігання більшої половини чисел і одну максимальну купу для зберігання меншої половини. Медіана буде коренем мінімальної купи.

Структура даних Min-Heap на різних мовах:

1. Min-Heap в C++

Мінімальна купа може бути реалізована за допомогою priority_queue контейнер зі стандартної бібліотеки шаблонів (STL). The priority_queue контейнер — це тип адаптера контейнера, який забезпечує спосіб зберігання елементів у структурі даних, подібній до черги, у якій кожен елемент має пов’язаний з ним пріоритет.

Синтаксис :



C++
priority_queue < int, vector , більше > minH;>

2. Min-Heap в Java

У Java мінімальну купу можна реалізувати за допомогою PriorityQueue клас від пакет java.util . Клас PriorityQueue — це пріоритетна черга, яка забезпечує спосіб зберігання елементів у структурі даних, подібній до черги, у якій кожен елемент має пов’язаний з ним пріоритет.

Синтаксис :

Java
PriorityQueue minHeap = новий PriorityQueue ();>

3. Min-Heap в Python

У Python мінімальну купу можна реалізувати за допомогою heapq модуль, який надає функції для реалізації куп. Зокрема, heapq Модуль забезпечує спосіб створення та керування структурами даних купи.



діаграма моделі e-r

Синтаксис:

Python
heap = [] heapify(heap)>

4. Min-Heap в C#

У C# мінімальну купу можна реалізувати за допомогою класу PriorityQueue з System.Collections.Generic простір імен . Клас PriorityQueue — це пріоритетна черга, яка забезпечує спосіб зберігання елементів у структурі даних, подібній до черги, у якій кожен елемент має пов’язаний з ним пріоритет.

Синтаксис:

C#
var minHeap = new PriorityQueue ();>

5. Min-heap в JavaScript

Мінімальна купа — це бінарне дерево, де кожен вузол має значення, менше або дорівнює дочірнім вузлам. У JavaScript ви можете реалізувати мінімальну купу за допомогою масиву, де перший елемент представляє кореневий вузол, а дочірні елементи вузла за індексом i розташовані за індексами 2і+1 і 2і+2.

Синтаксис:

JavaScript
const minHeap = new MinHeap();>

Різниця між мінімальною та максимальною купою:

Мінімальна купа

Макс Хіп

1.

У Min-Heap ключ, присутній у кореневому вузлі, має бути меншим або дорівнювати ключам, присутнім у всіх його дочірніх вузлах.

У Max-Heap ключ, присутній у кореневому вузлі, повинен бути більшим або дорівнювати ключам, присутнім у всіх його дочірніх вузлах.

2.

У Min-Heap мінімальний ключовий елемент присутній у корені.

У Max-Heap максимальний ключовий елемент присутній у корені.

3.

Min-Heap використовує зростаючий пріоритет.

Max-Heap використовує низхідний пріоритет.

4.

При побудові Min-Heap найменший елемент має пріоритет.

При побудові Max-Heap найбільший елемент має пріоритет.

5.

У Min-Heap найменший елемент є першим, який виривається з купи.

У Max-Heap найбільший елемент є першим, який виривається з купи.

Внутрішня реалізація структури даних Min-Heap:

А Мінімальна купа зазвичай представляється у вигляді масиву .

  • Кореневий елемент буде at Прибуток[0] .
  • Для будь-якого i-го вузла Arr[i] :
    • Arr[(i -1) / 2] повертає свій батьківський вузол.
    • Arr[(2 * i) + 1] повертає свій лівий дочірній вузол.
    • Arr[(2 * i) + 2] повертає правий дочірній вузол.

Внутрішнє впровадження Min-Heap вимагає 3 основних кроків:

  1. Вставка : Щоб вставити елемент у мінімальну купу, ми спочатку додаємо елемент до кінця масиву, а потім регулюємо властивість купи, постійно міняючи елемент його батьківським елементом, доки він не займе правильну позицію.
  2. Видалення : Щоб видалити мінімальний елемент із мінімальної купи, ми спочатку міняємо кореневий вузол останнім елементом у масиві, видаляємо останній елемент, а потім регулюємо властивість купи, постійно міняючи місцями елемент найменшим дочірнім елементом, доки він не опиниться в правильне положення.
  3. Heapify : операцію heapify можна використовувати для створення мінімальної купи з несортованого масиву.

Операції над структурою даних Min-heap та їх реалізація:

Ось кілька поширених операцій, які можна виконати над структурою даних купи,

1. Вставка в структуру даних Min-Heap :

Елементи можна вставляти в купу за подібним підходом, як описано вище для видалення. Ідея полягає в тому, щоб:

  • Операція вставки в міні-купу включає наступні кроки:
  • Додайте новий елемент у кінець купи, у наступну доступну позицію на останньому рівні дерева.
  • Порівняйте новий елемент з його батьківським. Якщо батьківський елемент більший за новий елемент, поміняйте їх місцями.
  • Повторюйте крок 2, доки батьківський елемент не стане меншим або дорівнює новому елементу або доки новий елемент не досягне кореня дерева.
  • Тепер новий елемент займає правильну позицію в мінімальній купі, і властивість купи виконано.

Ілюстрація:

Припустимо, що купа є мінімальною купою, як:

Вставка в Min-Heap

Реалізація операції вставки в Min-Heap:

C++
#include  #include  using namespace std; // Function to insert a new element into the min-heap void insert_min_heap(vector & heap, int value) { // Додати новий елемент у кінець купи heap.push_back(value);  // Отримання індексу останнього елемента int index = heap.size() - 1;  // Порівняйте новий елемент із його батьківським // місцем, якщо необхідно, while (index> 0 && heap[(index - 1) / 2]> heap[index]) { swap(heap[index], heap[(index - 1) / 2]);  // Перейти вгору по дереву до батьківського // елемента index = (index - 1) / 2;  } } // Головна функція для перевірки функції insert_min_heap int main() { вектор купа;  int values[] = { 10, 7, 11, 5, 4, 13 };  int n = sizeof(значення) / sizeof(значення[0]);  для (int i = 0; i< n; i++) {  insert_min_heap(heap, values[i]);  cout << 'Inserted ' << values[i]  << ' into the min-heap: ';  for (int j = 0; j < heap.size(); j++) {  cout << heap[j] << ' ';  }  cout << endl;  }  return 0; }>
Java
import java.util.*; public class GFG {  // Function to insert a new element into the min-heap  public static void insertMinHeap(int[] heap, int size,  int value)  {  // Add the new element to the end of the heap  heap[size] = value;  // Get the index of the last element  int index = size;  // Compare the new element with its parent and swap  // if necessary  while (index>0 && heap[(index - 1) / 2]> heap[index]) { swap(heap, index, (index - 1) / 2);  // Перейти вгору по дереву до батьківського // елемента index = (index - 1) / 2;  } } // Функція для обміну місцями двох елементів у масиві public static void swap(int[] arr, int i, int j) { int temp = arr[i];  arr[i] = arr[j];  arr[j] = темп;  } // Основна функція для перевірки функції insertMinHeap public static void main(String[] args) { int[] heap = new int[6];  int[] значення = { 10, 7, 11, 5, 4, 13 };  int size = 0;  для (int i = 0; i< values.length; i++) {  insertMinHeap(heap, size, values[i]);  size++;  System.out.print('Inserted ' + values[i]  + ' into the min-heap: ');  for (int j = 0; j < size; j++) {  System.out.print(heap[j] + ' ');  }  System.out.println();  }  } }>
Python3
def insert_min_heap(heap, value): # Add the new element to the end of the heap heap.append(value) # Get the index of the last element index = len(heap) - 1 # Compare the new element with its parent and swap if necessary while index>0 і купа[(індекс - 1) // 2]> купа[індекс]: купа[індекс], купа[(індекс - 1) // 2] = купа[(індекс - 1) // 2], купа[ index] # Переміщення вверх по дереву до батьківського елемента поточного елемента index = (index - 1) // 2 купа = [] values ​​= [10, 7, 11, 5, 4, 13] для значення у values: insert_min_heap( купа, значення) print(f'Вставлено {value} у min-heap: {heap}')>
C#
using System; using System.Collections.Generic; public class Program {  // Function to insert a new element into the min-heap  static void InsertMinHeap(List heap, int value) { // Додати новий елемент у кінець купи heap.Add(value);  // Отримання індексу останнього елемента int index = heap.Count - 1;  // Порівняйте новий елемент із його батьківським і // за необхідності поміняйте місцями while (index> 0 && heap[(index - 1) / 2]> heap[index]) { int temp = heap[index];  купа[індекс] = купа[(індекс - 1) / 2];  купа[(індекс - 1) / 2] = temp;  // Перейти вгору по дереву до батьківського // елемента index = (index - 1) / 2;  } } // Основна функція для перевірки функції InsertMinHeap public static void Main() { List купа = новий список ();  int[] значення = { 10, 7, 11, 5, 4, 13 };  foreach(int value in values) { InsertMinHeap(heap, value);  Console.Write('Inserted ' + value + ' into the min-heap: ');  foreach(int елемент у купі) { Console.Write(element + ' ');  } Console.WriteLine();  } } }>
Javascript
function insertMinHeap(heap, value) {  heap.push(value);  let index = heap.length - 1;  let parentIndex = Math.floor((index - 1) / 2);  while (index>0 && heap[parentIndex]> heap[index]) { [heap[index], heap[parentIndex]] = [heap[parentIndex], heap[index]];  індекс = parentIndex;  parentIndex = Math.floor((індекс - 1) / 2);  } } // Приклад використання const heap = []; значення const = [10, 7, 11, 5, 4, 13]; for (const значення значень) { insertMinHeap(heap, value);  console.log(`Вставлено ${value} у міні-кучу: ${heap}`); }>

Вихід
Inserted 10 into the min-heap: 10 Inserted 7 into the min-heap: 7 10 Inserted 11 into the min-heap: 7 10 11 Inserted 5 into the min-heap: 5 7 11 10 Inserted 4 into the min-heap: 4 5 11 10 7 Inser...>

Часова складність: O(log(n)) ( де n – кількість елементів у купі )
Допоміжний простір: O(n)

2. Видалення в структурі даних Min-Heap :

Видалення найменшого елемента (кореневого) з min heap. Корінь замінюється останнім елементом у купі, а потім властивість купи відновлюється шляхом заміни нового кореня його найменшим дочірнім елементом, доки батьківський елемент не стане меншим за обох дочірніх елементів або доки новий корінь не досягне листкового вузла.

  • Замініть корінь або елемент, який потрібно видалити, на останній елемент.
  • Видалити останній елемент із купи.
  • Оскільки останній елемент тепер розміщено на позиції кореневого вузла. Отже, він може не відповідати властивості heap. Тому нагромаджуйте останній вузол, розміщений на місці кореня.

Ілюстрація :

Припустимо, що купа є мінімальною купою, як:

Структура даних Min-Heap

Структура даних Min-Heap

Елемент, який потрібно видалити, це root, тобто 13.

латексні розміри тексту

процес :

Останній елемент 100.

Крок 1: Замініть останній елемент на root і видаліть його.

Структура даних Min-Heap

Структура даних Min-Heap

Крок 2 : Heapify корінь.

Остаточна купа:

Структура даних Min-Heap

Структура даних Min-Heap

Реалізація операції видалення в Min-Heap:

C++
#include  #include  using namespace std; // Function to insert a new element into the min-heap void insert_min_heap(vector & heap, int value) { // Додати новий елемент у кінець купи heap.push_back(value);  // Отримання індексу останнього елемента int index = heap.size() - 1;  // Порівняйте новий елемент із його батьківським // місцем, якщо необхідно, while (index> 0 && heap[(index - 1) / 2]> heap[index]) { swap(heap[index], heap[(index - 1) / 2]);  // Перейти вгору по дереву до батьківського // елемента index = (index - 1) / 2;  } } // Функція видалення вузла з мінімальної купи void delete_min_heap(вектор & heap, int value) { // Знайти індекс елемента, який потрібно видалити int index = -1;  для (int i = 0; i< heap.size(); i++) {  if (heap[i] == value) {  index = i;  break;  }  }  // If the element is not found, return  if (index == -1) {  return;  }  // Replace the element to be deleted with the last  // element  heap[index] = heap[heap.size() - 1];  // Remove the last element  heap.pop_back();  // Heapify the tree starting from the element at the  // deleted index  while (true) {  int left_child = 2 * index + 1;  int right_child = 2 * index + 2;  int smallest = index;  if (left_child < heap.size()  && heap[left_child] < heap[smallest]) {  smallest = left_child;  }  if (right_child < heap.size()  && heap[right_child] < heap[smallest]) {  smallest = right_child;  }  if (smallest != index) {  swap(heap[index], heap[smallest]);  index = smallest;  }  else {  break;  }  } } // Main function to test the insert_min_heap and // delete_min_heap functions int main() {  vector купа;  int values[] = { 13, 16, 31, 41, 51, 100 };  int n = sizeof(значення) / sizeof(значення[0]);  для (int i = 0; i< n; i++) {  insert_min_heap(heap, values[i]);  }  cout << 'Initial heap: ';  for (int j = 0; j < heap.size(); j++) {  cout << heap[j] << ' ';  }  cout << endl;  delete_min_heap(heap, 13);  cout << 'Heap after deleting 13: ';  for (int j = 0; j < heap.size(); j++) {  cout << heap[j] << ' ';  }  cout << endl;  return 0; }>
Java
import java.util.*; public class GFG {  // Function to insert a new element into the min-heap  public static void insertMinHeap(List heap, int value) { // Додати новий елемент у кінець купи heap.add(value);  // Отримання індексу останнього елемента int index = heap.size() - 1;  // Порівняйте новий елемент із його батьківським і // за необхідності замініть місцями while (index> 0 && heap.get((index - 1) / 2)> heap.get(index)) { Collections.swap(heap, index, (індекс - 1) / 2);  // Перейти вгору по дереву до батьківського // елемента index = (index - 1) / 2;  } } // Функція для видалення вузла з мінімальної купи public static void deleteMinHeap(List heap, int value) { // Знайти індекс елемента, який потрібно видалити int index = -1;  для (int i = 0; i< heap.size(); i++) {  if (heap.get(i) == value) {  index = i;  break;  }  }  // If the element is not found, return  if (index == -1) {  return;  }  // Replace the element to be deleted with the last  // element  heap.set(index, heap.get(heap.size() - 1));  // Remove the last element  heap.remove(heap.size() - 1);  // Heapify the tree starting from the element at the  // deleted index  while (true) {  int leftChild = 2 * index + 1;  int rightChild = 2 * index + 2;  int smallest = index;  if (leftChild < heap.size()  && heap.get(leftChild)  < heap.get(smallest)) {  smallest = leftChild;  }  if (rightChild < heap.size()  && heap.get(rightChild)  < heap.get(smallest)) {  smallest = rightChild;  }  if (smallest != index) {  Collections.swap(heap, index, smallest);  index = smallest;  }  else {  break;  }  }  }  // Main function to test the insertMinHeap and  // deleteMinHeap functions  public static void main(String[] args)  {  List heap = новий ArrayList ();  int[] значення = { 13, 16, 31, 41, 51, 100 };  int n = values.length;  для (int i = 0; i< n; i++) {  insertMinHeap(heap, values[i]);  }  System.out.print('Initial heap: ');  for (int j = 0; j < heap.size(); j++) {  System.out.print(heap.get(j) + ' ');  }  System.out.println();  deleteMinHeap(heap, 13);  System.out.print('Heap after deleting 13: ');  for (int j = 0; j < heap.size(); j++) {  System.out.print(heap.get(j) + ' ');  }  System.out.println();  } }>
Python3
def insert_min_heap(heap, value): heap.append(value) index = len(heap) - 1 while index>0 і купа[(індекс - 1) // 2]> купа[індекс]: купа[індекс], купа[(індекс - 1) // 2] = купа[(індекс - 1) // 2], купа[ index] index = (index - 1) // 2 def delete_min_heap(heap, value): index = -1 for i in range(len(heap)): if heap[i] == value: index = i break if index == -1: повернути heap[index] = heap[-1] heap.pop() while True: left_child = 2 * index + 1 right_child = 2 * index + 2 smallest = index if left_child< len(heap) and heap[left_child] < heap[smallest]: smallest = left_child if right_child < len(heap) and heap[right_child] < heap[smallest]: smallest = right_child if smallest != index: heap[index], heap[smallest] = heap[smallest], heap[index] index = smallest else: break heap = [] values = [13, 16, 31, 41, 51, 100] for value in values: insert_min_heap(heap, value) print('Initial heap:', heap) delete_min_heap(heap, 13) print('Heap after deleting 13:', heap)>
C#
using System; using System.Collections.Generic; class MinHeap {  private List купа = новий список ();  public void Insert(int value) { heap.Add(value);  int index = heap.Count - 1;  while (index> 0 && heap[(index - 1) / 2]> heap[index]) { Swap(index, (index - 1) / 2);  індекс = (індекс - 1) / 2;  } } public void Delete(int value) { int index = heap.IndexOf(value);  if (index == -1) { return;  } heap[index] = heap[heap.Count - 1];  heap.RemoveAt(heap.Count - 1);  while (true) { int leftChild = 2 * index + 1;  int rightChild = 2 * індекс + 2;  int найменший = індекс;  якщо (ліворучДитина< heap.Count  && heap[leftChild] < heap[smallest]) {  smallest = leftChild;  }  if (rightChild < heap.Count  && heap[rightChild] < heap[smallest]) {  smallest = rightChild;  }  if (smallest != index) {  Swap(index, smallest);  index = smallest;  }  else {  break;  }  }  }  private void Swap(int i, int j)  {  int temp = heap[i];  heap[i] = heap[j];  heap[j] = temp;  }  public void Print()  {  for (int i = 0; i < heap.Count; i++) {  Console.Write(heap[i] + ' ');  }  Console.WriteLine();  } } class Program {  static void Main(string[] args)  {  MinHeap heap = new MinHeap();  int[] values = { 13, 16, 31, 41, 51, 100 };  for (int i = 0; i < values.Length; i++) {  heap.Insert(values[i]);  }  Console.Write('Initial heap: ');  heap.Print();  heap.Delete(13);  Console.Write('Heap after deleting 13: ');  heap.Print();  } }>
Javascript
function insertMinHeap(heap, value) {  // Add the new element to the end of the heap  heap.push(value);  // Get the index of the last element  let index = heap.length - 1;  // Compare the new element with its parent and swap if necessary  for (let flr = Math.floor((index - 1) / 2); index>0 && купа[flr]> купа[індекс]; flr = Math.floor((index - 1) / 2)) { [heap[index], heap[flr]] = [ heap[flr], heap[index], ];  // Переміщення вверх по дереву до батьківського елемента поточного елемента index = Math.floor((index - 1) / 2);  } } function deleteMinHeap(heap, value) { // Знайдіть індекс елемента, який потрібно видалити let index = -1;  для (нехай i = 0; i< heap.length; i++) {  if (heap[i] == value) {  index = i;  break;  }  }  // If the element is not found, return  if (index == -1) {  return;  }  // Replace the element to be deleted with the last element  heap[index] = heap[heap.length - 1];  // Remove the last element  heap.pop();  // Heapify the tree starting from the element at the deleted index  while (true) {  let left_child = 2 * index + 1;  let right_child = 2 * index + 2;  let smallest = index;  if (left_child < heap.length && heap[left_child] < heap[smallest]) {  smallest = left_child;  }  if (right_child < heap.length && heap[right_child] < heap[smallest]) {  smallest = right_child;  }  if (smallest != index) {  [heap[index], heap[smallest]] = [heap[smallest], heap[index]];  index = smallest;  } else {  break;  }  } } // Main function to test the insertMinHeap and deleteMinHeap functions let heap = []; let values = [13, 16, 31, 41, 51, 100]; for (let i = 0; i < values.length; i++) {  insertMinHeap(heap, values[i]); } console.log('Initial heap: ' + heap.join(' ')); deleteMinHeap(heap, 13); console.log('Heap after deleting 13: ' + heap.join(' '));>

Вихід
Initial heap: 13 16 31 41 51 100 Heap after deleting 13: 16 41 31 100 51>

Часова складність : O(log n), де n – кількість елементів у купі
Допоміжний простір: O(n)

3. Операція Peek на структурі даних Min-Heap:

Щоб отримати доступ до мінімального елемента (тобто кореня купи), повертається значення кореневого вузла. Часова складність перегляду в міні-купі становить O(1).

Мінімальна структура даних купи

Мінімальна структура даних купи

Реалізація операції Peek у Min-Heap:

C++
#include  #include  #include  using namespace std; int main() {  // Create a max heap with some elements using a  // priority_queue  priority_queue , більше > minHeap;  minHeap.push(9);  minHeap.push(8);  minHeap.push(7);  minHeap.push(6);  minHeap.push(5);  minHeap.push(4);  minHeap.push(3);  minHeap.push(2);  minHeap.push(1);  // Отримання пікового елемента (тобто найбільшого елемента) int peakElement = minHeap.top();  // Надрукувати піковий елемент cout<< 'Peak element: ' << peakElement << std::endl;  return 0; }>
Java
import java.util.PriorityQueue; public class GFG {  public static void main(String[] args)  {  // Create a max heap with some elements using a  // PriorityQueue  PriorityQueue minHeap = новий PriorityQueue();  minHeap.add(9);  minHeap.add(8);  minHeap.add(7);  minHeap.add(6);  minHeap.add(5);  minHeap.add(4);  minHeap.add(3);  minHeap.add(2);  minHeap.add(1);  // Отримання пікового елемента (тобто найбільшого елемента) int peakElement = minHeap.peek();  // Надрукувати піковий елемент System.out.println('Піковий елемент: ' + peakElement);  } }>
Python3
import heapq # Create a min heap with some elements using a list min_heap = [9, 8, 7, 6, 5, 4, 3, 2, 1] heapq.heapify(min_heap) # Get the peak element (i.e., the smallest element) peak_element = heapq.nsmallest(1, min_heap)[0] # Print the peak element print('Peak element:', peak_element)>
C#
using System; using System.Collections.Generic; public class GFG {  public static void Main()  {  // Create a min heap with some elements using a  // PriorityQueue  var minHeap = new PriorityQueue ();  minHeap.Enqueue(9);  minHeap.Enqueue(8);  minHeap.Enqueue(7);  minHeap.Enqueue(6);  minHeap.Enqueue(5);  minHeap.Enqueue(4);  minHeap.Enqueue(3);  minHeap.Enqueue(2);  minHeap.Enqueue(1);  // Отримання пікового елемента (тобто найменшого елемента) int peakElement = minHeap.Peek();  // Надрукувати піковий елемент Console.WriteLine('Піковий елемент: ' + peakElement);  } }>
Javascript
const PriorityQueue = require('fast-priority-queue'); // Create a min heap with some elements using a PriorityQueue const minHeap = new PriorityQueue((a, b) =>а - б); minHeap.add(9); minHeap.add(8); minHeap.add(7); minHeap.add(6); minHeap.add(5); minHeap.add(4); minHeap.add(3); minHeap.add(2); minHeap.add(1); // Отримання пікового елемента (тобто найменшого елемента) const peakElement = minHeap.peek(); // Надрукувати піковий елемент console.log(`Піковий елемент: ${peakElement}`);>

Вихід
Peak element: 1>

Часова складність : У мінімальній купі, реалізованій за допомогою масиву або списку, піковий елемент може бути доступний у постійний час, O(1), оскільки він завжди розташований у корені купи.
У міні-купі, реалізованій за допомогою бінарного дерева, піковий елемент також може бути доступний за час O(1), оскільки він завжди розташований у корені дерева.

Допоміжний простір: O(n)

4. Операція Heapify над структурою даних Min-Heap:

Операцію heapify можна використовувати для створення мінімальної купи з несортованого масиву. Це робиться, починаючи з останнього вузла, що не є листом, і багаторазово виконуючи операцію «спускання», поки всі вузли не задовольнять властивість купи.

Операція Heapify у Min Heap

Реалізація операції Heapify в Min-Heap:

C++
#include  #include  using namespace std; void minHeapify(vector &arr, int i, int n) { int найменший = i;  int l = 2*i + 1;  int r = 2*i + 2;  якщо (л< n && arr[l] < arr[smallest])  smallest = l;  if (r < n && arr[r] < arr[smallest])  smallest = r;  if (smallest != i) {  swap(arr[i], arr[smallest]);  minHeapify(arr, smallest, n);  } } int main() {  vector arr = {10, 5, 15, 2, 20, 30};  cout<< 'Original array: ';  for (int i = 0; i < arr.size(); i++)  cout << arr[i] << ' ';  // Perform heapify operation on min-heap  for (int i = arr.size()/2 - 1; i>= 0; i--) minHeapify(arr, i, arr.size());  cout<< '
Min-Heap after heapify operation: ';  for (int i = 0; i < arr.size(); i++)  cout << arr[i] << ' ';  return 0; }>
Java
// Java code of Heapify operation in Min-Heap import java.util.Arrays; import java.util.List; public class Main {  // Function to maintain the min-heap property of the heap rooted at index 'i'  public static void minHeapify(List arr, int i, int n) { // Припустимо, що корінь є найменшим елементом спочатку int smallest = i;  // Обчислення індексів лівого та правого дочірніх елементів поточного вузла int l = 2 * i + 1;  int r = 2 * i + 2;  // Порівнюємо ліву дочірню частину з поточною найменшою if (l< n && arr.get(l) < arr.get(smallest))  smallest = l;  // Compare the right child with the current smallest  if (r < n && arr.get(r) < arr.get(smallest))  smallest = r;  // If the current node is not the smallest, swap it with the smallest child  if (smallest != i) {  int temp = arr.get(i);  arr.set(i, arr.get(smallest));  arr.set(smallest, temp);  // Recursively heapify the subtree rooted at the smallest child  minHeapify(arr, smallest, n);  }  }  public static void main(String[] args) {  // Create a list representing the array  List arr = Arrays.asList(10, 5, 15, 2, 20, 30);  System.out.print('Оригінальний масив: ');  // Вивести вихідний масив для (int i = 0; i< arr.size(); i++)  System.out.print(arr.get(i) + ' ');  // Perform heapify operation on the min-heap  // Start from the last non-leaf node and go up to the root of the tree  for (int i = arr.size() / 2 - 1; i>= 0; i--) minHeapify(arr, i, arr.size());  System.out.print('
Мінальна купа після операції heapify: ');  // Надрукувати мінімальну купу після операції heapify для (int i = 0; i< arr.size(); i++)  System.out.print(arr.get(i) + ' ');  } }>
Python
def minHeapify(arr, i, n): smallest = i left = 2 * i + 1 right = 2 * i + 2 if left < n and arr[left] < arr[smallest]: smallest = left if right < n and arr[right] < arr[smallest]: smallest = right if smallest != i: arr[i], arr[smallest] = arr[smallest], arr[i] minHeapify(arr, smallest, n) if __name__ == '__main__': arr = [10, 5, 15, 2, 20, 30] print('Original array:', arr) # Perform heapify operation on a min-heap for i in range(len(arr) // 2 - 1, -1, -1): minHeapify(arr, i, len(arr)) print('Min-Heap after heapify operation:', arr)>
C#
using System; using System.Collections.Generic; class GFG {  // Function to perform the minHeapify operation on a min-heap.  static void MinHeapify(List arr, int i, int n) { int smallest = i;  int left = 2 * i + 1;  int right = 2 * i + 2;  // Порівнюємо лівий дочірній елемент із поточним найменшим вузлом.  якщо (ліворуч< n && arr[left] < arr[smallest])  smallest = left;  // Compare the right child with the current smallest node.  if (right < n && arr[right] < arr[smallest])  smallest = right;  // If the current node is not the smallest  // swap it with the smallest child.  if (smallest != i)  {  int temp = arr[i];  arr[i] = arr[smallest];  arr[smallest] = temp;  // Recursively call minHeapify on the affected subtree.  MinHeapify(arr, smallest, n);  }  }  static void Main(string[] args)  {  List arr = новий список { 10, 5, 15, 2, 20, 30 };  Console.Write('Оригінальний масив: ');  foreach (int num in arr) Console.Write(num + ' ');  // Виконати операцію heapify на міні-купі.  for (int i = arr.Count / 2 - 1; i>= 0; i--) MinHeapify(arr, i, arr.Count);  Console.Write('
Min-Heap після операції heapify: ');  foreach (int num in arr) Console.Write(num + ' ');  } }>
Javascript
// Define a function to perform min-heapify operation on an array function minHeapify(arr, i, n) {  let smallest = i;  let l = 2 * i + 1;  let r = 2 * i + 2;  // Check if left child is smaller than the current smallest element  if (l < n && arr[l] < arr[smallest])  smallest = l;  // Check if right child is smaller than the current smallest element  if (r < n && arr[r] < arr[smallest])  smallest = r;  // If the smallest element is not the current element, swap them  if (smallest !== i) {  [arr[i], arr[smallest]] = [arr[smallest], arr[i]];  minHeapify(arr, smallest, n);  } } // Main function function main() {  const arr = [10, 5, 15, 2, 20, 30];  // Print the original array  console.log('Original array: ' + arr.join(' '));  // Perform heapify operation on the min-heap  for (let i = Math.floor(arr.length / 2) - 1; i>= 0; i--) minHeapify(arr, i, arr.length);  // Надрукувати мінімальну купу після операції heapify console.log('Min-Heap після операції heapify: ' + arr.join(' ')); } // Виклик функції main для запуску процесу main();>

Вихід
Original array: 10 5 15 2 20 30 Min-Heap after heapify operation: 2 5 15 10 20 30>

Часова складність heapify у min-heap становить O(n).

5. Операція пошуку в структурі даних Min-Heap:

Щоб знайти елемент у мінімальній купі, можна виконати лінійний пошук по масиву, який представляє купу. Однак часова складність лінійного пошуку становить O(n), що не є ефективним. Тому пошук не є широко використовуваною операцією в мінімальній купі.

Ось приклад коду, який показує, як шукати елемент у мінімальній купі за допомогою std::find() :

C++
#include  using namespace std; int main() {  priority_queue , більше > min_heap;  // приклад максимальної купи min_heap.push(10);  min_heap.push(9);  min_heap.push(8);  min_heap.push(6);  min_heap.push(4);  int element = 6; // елемент для пошуку bool found = false;  // Скопіюйте мінімальну купу до тимчасової черги та знайдіть // елемент std::priority_queue , більше > temp = min_heap;  while (!temp.empty()) { if (temp.top() == element) { found = true;  перерва;  } temp.pop();  } якщо (знайдено) { std::cout<< 'Element found in the min heap.'  << std::endl;  }  else {  std::cout << 'Element not found in the min heap.'  << std::endl;  }  return 0; }>
Java
import java.util.PriorityQueue; public class GFG {  public static void main(String[] args)  {  PriorityQueue min_heap = новий PriorityQueue();  min_heap.add( 3); // вставити елементи в пріоритетну чергу min_heap.offer(1);  min_heap.offer(4);  min_heap.offer(1);  min_heap.offer(6);  int element = 6; // елемент для пошуку boolean found = false;  // Скопіюйте мініатюрну купу до тимчасової черги та знайдіть // елемент PriorityQueue temp = new PriorityQueue(min_heap);  while (!temp.isEmpty()) { if (temp.poll() == element) { found = true;  перерва;  } } if (знайдено) { System.out.println( 'Елемент знайдено в мінімальній купі.');  } else { System.out.println( 'Елемент не знайдено в мінімальній купі.');  } } }>
Python3
import heapq min_heap = [1, 2, 3, 5, 6, 7, 8, 10] # example min heap heapq.heapify(min_heap) element = 6 # element to search for found = False # Copy the min heap to a temporary list and search for the element temp = list(min_heap) while temp: if heapq.heappop(temp) == element: found = True break if found: print('Element found in the min heap.') else: print('Element not found in the min heap.')>
C#
using System; using System.Collections.Generic; public class GFG {  public static void Main()  {  var minHeap = new PriorityQueue ();  // приклад min heap minHeap.Enqueue(4);  minHeap.Enqueue(6);  minHeap.Enqueue(8);  minHeap.Enqueue(9);  minHeap.Enqueue(10);  int element = 6; // елемент для пошуку bool found = false;  // Скопіюйте мініатюрну купу до тимчасової черги та знайдіть // елемент var temp = new PriorityQueue (minHeap);  while (temp.Count> 0) { if (temp.Peek() == element) { found = true;  перерва;  } temp.Dequeue();  } if (знайдено) { Console.WriteLine( 'Елемент знайдено в мінімальній купі.');  } else { Console.WriteLine( 'Елемент не знайдено в мінімальній купі.');  } } }>
Javascript
// Example min heap let minHeap = new PriorityQueue(); minHeap.enqueue(4); minHeap.enqueue(6); minHeap.enqueue(8); minHeap.enqueue(9); minHeap.enqueue(10); let element = 6; // Element to search for let found = false; // Copy the min heap to a temporary queue and search for the element let temp = new PriorityQueue(minHeap); while (temp.size()>0) { якщо (temp.peek() == елемент) { знайдено = істина;  перерва;  } temp.dequeue(); } if (знайдено) { console.log('Елемент знайдено в мінімальній купі.'); } else { console.log('Елемент не знайдено в мінімальній купі.'); }>

Вихід
Element found in the min heap.>

Аналіз складності :

The часова складність цієї програми O(n log n) , де п кількість елементів у пріоритетній черзі.

Операція вставки має часову складність O(log n) у гіршому випадку, оскільки потрібно підтримувати властивість купи. Операція пошуку передбачає копіювання пріоритетної черги до тимчасової черги, а потім проходження тимчасової черги, що займає O(n log n) час у гіршому випадку, оскільки кожен елемент потрібно скопіювати та вилучити з черги, а пріоритетну чергу потрібно перебудувати для кожної операції.

The складність простору програми є O(n) тому що зберігає п елементів у пріоритетній черзі та створює тимчасову чергу з п елементів.

Застосування структури даних Min-Heap:

  • Сортування купи: Мінімальна купа використовується як ключовий компонент алгоритму сортування купи, який є ефективним алгоритмом сортування з часовою складністю O(nlogn).
  • Пріоритетна черга: Пріоритетну чергу можна реалізувати за допомогою мінімальної структури даних купи, де елемент із мінімальним значенням завжди знаходиться в корені.
  • Алгоритм Дейкстри: В алгоритмі Дейкстри мінімальна купа використовується для зберігання вершин графа на мінімальній відстані від початкової вершини. Вершина з мінімальною відстанню завжди знаходиться в корені купи.
  • Кодування Хаффмана: У кодуванні Хаффмана мінімальна купа використовується для реалізації черги пріоритетів для створення оптимального префіксного коду для заданого набору символів.
  • Об’єднати K відсортованих масивів: Маючи K відсортованих масивів, ми можемо ефективно об’єднати їх в один відсортований масив, використовуючи мінімальну структуру даних купи.

Переваги Min-heap Data Structure:

  • Ефективне вставлення та видалення : Мінімальна купа дозволяє швидко вставляти та видаляти елементи з часовою складністю O(log n), де n — кількість елементів у купі.
  • Ефективне отримання мінімального елемента: Мінімальний елемент у мінімальній купі завжди знаходиться в корені купи, який можна отримати за час O(1).
  • Економія простору: Мінімальна купа — це компактна структура даних, яка може бути реалізована за допомогою масиву або бінарного дерева, що робить її ефективним у просторі.
  • Сортування: Мінімальна купа може бути використана для реалізації ефективного алгоритму сортування, такого як сортування купи з часовою складністю O(n log n).
  • Пріоритетна черга: Мінімальна купа може бути використана для реалізації черги пріоритетів, де елемент із мінімальним пріоритетом може бути ефективно отриманий за час O(1).
  • Універсальність: Мінімальна купа має кілька застосувань в інформатиці, включаючи алгоритми графів, стиснення даних і системи баз даних.

Загалом мінімальна купа — це корисна та універсальна структура даних, яка пропонує ефективні операції, ефективність простору та має кілька застосувань у інформатиці.