Middle
Czym jest stos (w kontekście struktur danych)?
sobes.tech AI
Odpowiedź od AI
Kopiec (heap) to specjalistyczne drzewo, które jest używane jako struktura danych. Główna właściwość kopca to częściowa uporządkowanie: dla każdego wierzchołka warunek jest taki, że wartość wierzchołka rodzica jest większa lub równa wartości dowolnego z jego dzieci (max-heap) lub mniejsza lub równa (min-heap).
Kluczowe cechy:
- Drzewo binarne: Najczęściej implementowane jako drzewo binarne, gdzie każdy węzeł ma nie więcej niż dwóch potomków.
- Drzewo binarne pełne: Na wszystkich poziomach, oprócz być może ostatniego, drzewo jest w pełni wypełnione. Węzły na ostatnim poziomie są wypełniane od lewej do prawej. Pozwala to na efektywne przechowywanie kopca w formie tablicy.
- Właściwość kopca:
- Max-heap: Wartość każdego węzła jest większa lub równa wartościom jego potomków. Maksymalny element zawsze znajduje się na korzeniu.
- Min-heap: Wartość każdego węzła jest mniejsza lub równa wartościom jego potomków. Minimalny element zawsze znajduje się na korzeniu.
Podstawowe operacje na kopcu:
- Wstawianie elementu: Dodanie nowego elementu i utrzymanie właściwości kopca.
- Usuwanie elementu: Usunięcie elementu korzenia (maksymalnego lub minimalnego, w zależności od typu kopca) i utrzymanie właściwości kopca.
- Tworzenie kopca: Budowa kopca z tablicy elementów.
Zastosowania kopca:
- Sortowanie: Algorytm sortowania przez kopiec (Heapsort).
- Kolejki z priorytetem: Efektywna implementacja kolejek, w których elementy są przetwarzane w kolejności priorytetu.
- Algorytmy wyszukiwania: Na przykład, wyszukiwanie elementu k-tego według wartości.
- Algorytmy na grafach: Na przykład, algorytm Dijkstry.
Reprezentacja kopca w tablicy:
Ponieważ kopiec jest pełnym drzewem binarnym, można go efektywnie przechowywać w tablicy bez użycia wskaźników.
- Jeśli węzeł znajduje się pod indeksem
i, jego lewy potomek znajduje się pod indeksem2*i + 1. - Jego prawy potomek znajduje się pod indeksem
2*i + 2. - Jego rodzic znajduje się pod indeksem
(i - 1) / 2.
# Przykład reprezentacji min-kopca w formie tablicy
heap_array = [10, 15, 20, 17, 25, 30]
# Korzeń: heap_array[0] = 10
# Lewy potomek korzenia: heap_array[2*0 + 1] = heap_array[1] = 15
# Prawy potomek korzenia: heap_array[2*0 + 2] = heap_array[2] = 20
# Rodzic elementu na indeksie 3 (17): heap_array[(3-1)//2] = heap_array[1] = 15