Kolejki priorytetowe w JavaScript

Kolejki priorytetowe w JavaScript
Kolejka priorytetowa jest rozszerzeniem prostej struktury danych kolejki z elementami zawierającymi wartość priorytetową, kolejka jest zbiorem elementów, w których pierwszym elementem wprowadzającym kolejkę jest pierwszy element, który wydostał się z kolejki. Ta technika wykonania jest znana jako FIFO (pierwszy w i pierwszym miejscu). Rozważ linię ludzi stojących przed bankomatem, osoba, która staną w pierwszej linii, będzie tą, która najpierw użyje bankomatu. Osoba, która dołącza późno w kolejce do bankomatu, będzie ostatnią, która użyje bankomatu.

Więc teraz wiemy, co to jest podstawowa kolejka, ale co z kolejką priorytetową? W kolejce priorytetowej każdy element wchodzący do kolejki ma dwie wartości, wartość priorytetu i dane. Elementy, które mają tę samą wartość priorytetu, zostaną wykonane na podstawie FIFO (pierwszy w i pierwszym miejscu) ale elementy o wyższym priorytecie niż inne zostaną wykonane jako pierwsze, bez względu na to, kiedy zostały dodane do kolejki.

Jest to zaawansowany temat struktury danych, więc zakładamy, że znasz działanie JavaScript i podstawowymi funkcjami JavaScript. Aby wdrożyć kolejkę priorytetową w JavaScript, musimy najpierw wiedzieć, jak wdrożyć prostą kolejkę w JavaScript.

Wdrożenie kolejki w JavaScript

Koncepcje struktury danych, takie jak kolejki, stosy, stosy lub kolejki priorytetowe, są wdrażane przy użyciu tablic w JavaScript.

Zdefiniujmy funkcję, która zdefiniuje naszą strukturę:

funkcja kolejka ()
// później kod zostanie umieszczony tutaj

Wiemy, że kolejki są zaimplementowane z tablicami, więc utworzymy tablicę o nazwie Kolekcje

Wewnątrz funkcji:

array = [];

Teraz, aby wdrożyć strukturę danych kolejki, musimy wdrożyć następujące funkcje:

  • Enqueue: Aby dodać nowy element na końcu listy
  • Dequeue: Aby usunąć pierwszy element z listy
  • ISEMPTY: Aby sprawdzić, czy kolejka jest pusta, czy nie
  • Rozmiar: Aby zwrócić długość kolejki
  • Front: Aby zwrócić wartość pierwszego elementu na liście
  • Drukuj: Aby wydrukować kolejkę

Wszystkie te funkcje są łatwo dodawane za pomocą następujących wierszy kodu:

functionqueue ()
array = [];
Ten.print = function ()
konsola.log (tablica);
;
Ten.enqueue = funkcja (newMem)
szyk.push (Newmem);
;
Ten.dequeue = function ()
ReturnArray.zmiana();
;
Ten.front = funkcja ()
return tablica [0];
;
Ten.size = funkcja ()
ReturnArray.długość;
;
Ten.isEmpty = function ()
powrót (tablica.długość === 0);
;

Teraz, że przygotowujemy naszą strukturę danych, musimy utworzyć obiekt zmapowany na tę strukturę, robimy to za pomocą linii:

var newqueue = nowa kolejka ();

Teraz potrzebujemy niektórych elementów, które można umieścić w kolejce, robimy to za pomocą następujących linii:

newqueue.enqueue („a”);
newqueue.enqueue („b”);
newqueue.enqueue („c”);

Aby spojrzeć na to, jak wygląda teraz nasza kolejka, możemy wywołać funkcję drukowania tak:

newqueue.wydrukować();

Otrzymujemy następujące dane wyjściowe na naszej konsoli:

Aby przetestować, jeśli implementacja pierwszego i pierwszego wyjścia działa poprawnie, zamierzamy odużyć element z listy i wydrukować najważniejszą wartość, a następnie wydrukować całą pozostałą kolejkę z następującymi wierszami:

newqueue.dequeue ();
konsola.Log (Newqueue.przód());
newqueue.wydrukować();

Pełny fragment kodu struktury kolejki to:

functionqueue ()
array = [];
Ten.print = function ()
konsola.log (tablica);
;
Ten.enqueue = funkcja (newMem)
szyk.push (Newmem);
;
Ten.dequeue = function ()
ReturnArray.zmiana();
;
Ten.front = funkcja ()
return tablica [0];
;
Ten.size = funkcja ()
ReturnArray.długość;
;
Ten.isEmpty = function ()
ReturnArray.długość === 0;
;

varnewqueue = nowa kolejka ();
newqueue.enqueue („a”);
newqueue.enqueue („b”);
newqueue.enqueue („c”);
newqueue.wydrukować();
newqueue.dequeue ();
konsola.Log (Newqueue.przód());
newqueue.wydrukować();

Po wykonaniu tego kodu możemy zaobserwować następujący wynik na konsoli:

Tak więc, kiedy nazywaliśmy funkcję dequeue, usunęła pierwszy element z listy. Następnie sprawdziliśmy najważniejszy element w kolejce, który był "B". Potem ponownie wydrukowaliśmy kolejkę i dało nam pozostałą kolejkę we właściwej kolejności. Oznacza to, że nasza implementacja kolejki działa idealnie:

Wdrożenie kolejki priorytetowej w JavaScript

Znamy różnicę między kolejką normalną a kolejką priorytetową, że elementy wewnątrz kolejki priorytetowej zawierają wartość priorytetu wraz z danymi. Oznacza to, że cała funkcjonalność kolejki priorytetowej jest taka sama jak normalna kolejka, z wyjątkiem Funkcja enqueue.

W kolejkach priorytetowych funkcja enqueue umieszcza element o wyższym priorytecie przed elementem niższym priorytetem. A jeśli dwa lub więcej elementów mają ten sam priorytet, nowo dodane elementy są umieszczane na późniejszym końcu kolejki, aby utrzymać metodę wyceny pierwszego i pierwszego wyjścia.

Mając to na uwadze, możemy napisać nową funkcję Enqueue dla kolejki priorytetowej z następującymi wierszami kodu:

Ten.enqueue = funkcja (newMem)
var array = [];
// później kod zostanie umieszczony tutaj
;

Pierwszą rzeczą, którą robimy w funkcji Enqueue, jest to, że jeśli kolekcja jest pusta, po prostu popychamy element na kolejkę:

Jeśli to.jest pusty())
szyk.push (Newmem);

Jeśli kolejka nie jest pusta:

  • Następnie sprawdzimy priorytet nowego elementu z priorytetem każdego elementu w kolejce
  • Jeśli priorytet nowego elementu jest niższy niż element kolekcji.Dodamy nowy element przed elementem tej kolekcji
  • To dlatego, że 1 oznacza priorytetowy mając na uwadze, że 2 oznacza drugi priorytet
  • Jeśli priorytet nowego elementu większej wartości (niższy w rzeczywistym priorytecie), to przejdziemy do końca kolejki i dodamy tam element
w przeciwnym razie
var dodany = false;
dla (vari = 0; iif (Newmem [1] < array[i][1])
szyk.splice (i, 0, Newmem);
dodane = true;
przerwa;


Jeśli (!dodany)
szyk.push (Newmem);

Całość enqueue Funkcja będzie wyglądać tak:

Ten.enqueue = funkcja (newMem)
Jeśli to.jest pusty())
szyk.push (Newmem);
w przeciwnym razie
var dodany = false;
dla (vari = 0; iif (Newmem [1] < array[i][1])
szyk.splice (i, 0, Newmem);
dodane = true;
przerwa;


Jeśli (!dodany)
szyk.push (Newmem);


;

Reszta funkcji kolejki priorytetowej jest prawie taka sama jak normalna kolejka, z niewielką zmianą funkcji dequeue, aby wyświetlać tylko nazwę, a nie wartość elementu. Cały fragment kodu kolejki priorytetowej jest:

funkcjaPriorityqueue ()
vararray = [];
Ten.printCollection = function ()
konsola.log (tablica);
;
Ten.enqueue = funkcja (newMem)
Jeśli to.jest pusty())
szyk.push (Newmem);
w przeciwnym razie
var dodany = false;
dla (vari = 0; iif (Newmem [1] szyk.splice (i, 0, Newmem);
dodane = true;
przerwa;


Jeśli (!dodany)
szyk.push (Newmem);


;
Ten.dequeue = function ()
var wartość = tablica.zmiana();
Wartość zwracana [0];
;
Ten.front = funkcja ()
ReturnArray [0];
;
Ten.size = funkcja ()
ReturnArray.długość;
;
Ten.isEmpty = function ()
ReturnArray.długość === 0;
;

Czas na umieszczenie elementów w kolejce przy użyciu następujących wierszy kodu:

var pq = nowy priorytetQueue ();
PQ.enqueue ([„Google”, 2]);
PQ.enqueue ([„bing”, 3]);
PQ.enqueue ([„Microsoft”, 1]);
PQ.enqueue ([„Apple”, 2]);
PQ.printCollection ();

Jak widać, pierwszym priorytetem jest „Microsoft” element o wartości 1. Musi być na początku kolejki, nawet jeśli został dodany na 3. miejscu.

Teraz, jeśli wywołamy funkcję dequeue, a następnie funkcję drukowania, pierwszy element należy usunąć z listy:

PQ.dequeue ();
PQ.printCollection ();

Proszę bardzo, nasza kolejka priorytetowa działa idealnie.

Wniosek

Kolejki to koncepcje struktury danych, które pracują nad metodą wyceny pierwszego i pierwszego miejsca. Podobnie kolejki priorytetowe działają na wycenę pierwszego i pierwszego wyjścia, ale z dodatkową wartością „priorytetu” element o najwyższym priorytecie zostanie wykonany jako pierwszy, bez względu na to, kiedy zostały dodane do kolejki. W tym poście nauczyliśmy się, jak wdrożyć prostą kolejkę w JavaScript i jak wykorzystać tę strukturę danych do wdrożenia działania kolejki priorytetowej.