Właściwość sterta
Ta właściwość można uznać za ograniczenie definiowania drzewa, pewną strukturę, którą należy przestrzegać podczas konstruowania drzewa. Sterta określa związek między węzłami macierzystymi a jego węzłami dziecięcymi, istnieją dwa rodzaje sterty, a zatem istnieją dwa rodzaje relacji, które mogą istnieć między węzłem nadrzędnym a węzłem dziecięcym:
Reprezentacja Min-Heap to:
(Image by Wikipedia)
Jak widać, w drzewie, że węzły macierzysty mają niższe wartości niż ich węzły dziecięce
Reprezentacja AR Max-heap to:
(Image by Wikipedia)
Widać, że węzły macierzyste mają wartości większe niż ich węzły dziecięce.
Reprezentacja tablicy
Płyty w języku programowania są reprezentowane w postaci tablicy, przykładem tablicy sterty skonstruowanej z powyższego drzewa maksymalnego heap jest:
var max-heap = [100,19,36,17,3,25,1,2,7];Reprezentując stertę binarną w postaci tablicy, używasz następującego wyrażenia, aby wydedukować następujące czynności:
Gdzie "I" oznacza indeks tablicy. Mówiąc o indeksach, kiedy wdrażamy struktury sterty za pomocą tablicy, umieszczamy "zero" W pierwszym indeksie, którym jest indeks 0.
Wizualna reprezentacja pracy sterty
Aby uzyskać wirtualną reprezentację pracy min-heap i w jaki sposób wartości wkładane są do sterty, możemy udać się do wizualizatora sterty przez University of San Francisco, klikając tutaj
Włóż wartości do sterty, a zauważysz, w jaki sposób nowy element jest wstawiany do sterty z powodu animacji:
Działanie sterty
Sterta binarna ma dwie główne funkcje:
Dodanie nowego elementu w stercie
Nowy element jest zawsze dodawany na końcu tablicy, a następnie jest sprawdzany przeciwko jego rodzicielowi, a jeśli jest on sprzeczny z właściwością sterty, jest wymieniany ze swoim rodzicem. Element jest sprawdzany, aż zostanie porównany z węzłem głównym sterty (węzeł główny jest pierwszym węzłem sterty).
Usuwanie elementu z sterty
Ilekroć chcesz usunąć lub pobrać wartość z sterty, zawsze pobierasz wartość węzła głównego. Dlatego ta wartość jest najmniejszą wartością, jeśli jest to minima i największa wartość, jeśli jest to maksymalnie. Gdy węzeł główny jest usuwany z sterty, ostatni węzeł tablicy zajmuje jego miejsce, wówczas jest porównywany z węzłami dziecięcymi, aby pasować do stanu sterty. Jeśli nie pasuje do tego warunku, jest zastępowany węzłem dziecięcym, a następnie sprawdzany za pomocą dalszych węzłów dziecięcych. O wiele lepszym sposobem na wyjaśnienie tego jest użycie przeglądarki Live Heap, jak pokazano poniżej:
Możesz zaobserwować proces usuwania, obserwując powyższy GIF.
Wdrażanie sterty binarnej w JavaScript
Będziemy wdrażać minim po kroku min, rozpoczynamy proces, tworząc nową funkcję z następującymi wierszami kodu:
niech minHeap = funkcja ()Pierwszym krokiem jest utworzenie tablicy i ustawienie wartości na indeksie 0 Jak zero:
Niech heap = [null];
Wtedy stworzymy Wstaw funkcję Korzystanie z następujących wierszy kodu:
Ten.insert = funkcja (num)
sterta.push (num);
if (sterta.długość> 2)
letidx = sterta.Długość - 1;
while (sterta [idx] = 1)
[sterta [matematyka.podłoga (idx / 2)], sterta [idx]] = [
sterta [idx],
sterta [matematyka.podłoga (IDX / 2)],
];
if (matematyka.podłoga (idx / 2)> 1)
idx = matematyka.podłoga (IDX / 2);
w przeciwnym razie
przerwa;
;
W tym fragmencie kodu dzieją się następujące rzeczy:
Następnym krokiem jest wdrożenie Usuń funkcję Z następującymi wierszami kodu:
Ten.remove = function ()Następujące kroki odbywają się w powyższym fragmencie kodu:
Następnym krokiem jest utworzenie funkcji, która wyświetli nam tablicę sterty do konsoli, robimy to za pomocą następujących wierszy kodu:
Ten.show = function ()Pełny fragment kodu wdrażania struktury danych min-heap jest:
letMinHeap = function ()Musimy teraz utworzyć nową minętową funkcję MinHeap, którą właśnie stworzyliśmy. Aby to zrobić, tworzymy nową zmienną i mapujemy ją na minheap za pomocą następujących wierszy kodu:
var newMinHeap = new MinHeap ();Następnie dodajmy wartości do sterty za pomocą następujących wierszy kodu:
Newminheap.wstaw (34);Teraz nazywamy pokazywać funkcja wyświetlania tablicy sterty na konsoli:
Newminheap.pokazywać();Otrzymujemy następujący wynik na naszej konsoli:
Jak widać, pierwszym elementem tablicy jest zero. Reszta węzłów nie jest większa niż ich węzły dziecięce. Na przykład, jeśli weźmiemy węzeł z wartością 35. Lewe i prawe dziecko są jak:
Możesz wyraźnie zobaczyć, rodzic (35) jest mniejsze niż lewe dziecko (82) i prawe dziecko (61). Podobnie każdy węzeł nadrzędny jest mniejszy niż jego węzeł dziecięcy, dlatego możemy wywnioskować, że nasz kod działa idealnie
Podobnie, po prostu zmieniając warunek porównywania, ponieważ bycie węzłem nadrzędnym jest mniejszy niż dziecko z węzłem nadrzędnym, który jest większy niż węzeł dziecięcy, możemy zaimplementować Max-heap Korzystanie z następujących wierszy kodu:
letmaxHeap = function ()To wszystko, z powodzeniem wdrożyłeś habetki binarne w JavaScript
Wniosek
Sterty binarne są wdrożeniem ciemieniowym drzewa binarnego o stanie posiadania najbardziej dwa węzły dziecięce dla każdego węzła nadrzędnego i pełna struktura drzewa binarnego. Co oznacza, że poziomy drzewa zostaną wypełnione od lewej lub lewej dziecka, a następnie prawego dziecka.
Sterty binarne są częścią zaawansowanych struktur danych i istnieją dwa rodzaje drzewa binarnego: jeden z nich nazywa się Min Kabel, podczas gdy drugi nazywa się maksymalną stertą. W minimalnej grupie węzły macierzysty mają mniejsze wartości niż ich węzły dziecięce, a wartości węzłów rodzeństwa nie mają znaczenia.
Podobnie, w maksymalnym heapie wartości węzła nadrzędnego są zawsze większe niż ich węzeł dziecięcy, a wartości węzłów rodzeństwa nie mają znaczenia. W tym poście dowiedzieliśmy się o heaps i ich wdrożeniu w waniliowym JavaScript, a na koniec przetestowaliśmy naszą implementację.