Kolejka priorytetowa w Javie

Kolejka priorytetowa w Javie
Załóżmy, że oferujesz usługę trzem różnym osobom stojącym przed tobą. Trzecia osoba jest twoim przyjacielem. Usługa ma być obsługiwana pierwsza. Z obsługą pierwszego kina, pierwsza osoba ma największy priorytet; Druga osoba ma większy priorytet; trzecia osoba, mniejszy priorytet i tak dalej. Nie zostaniesz ukarany, jeśli nie obserwujesz pierwszego poziomu. Postanowiłeś najpierw służyć znajomemu, a potem pierwszej osobie, a następnie drugiej osoby. Oznacza to, że dałeś swojemu przyjacielowi największy priorytet. Patrząc na scenariusz z punktu widzenia robota, trzecia pozycja miała największy priorytet.

Następnego dnia przybyły te same trzy osoby. Tym razem twój przyjaciel jest w środku. Postanowiłeś mu służyć najpierw, wyprzedzając osobę, która była pierwsza, potem trzecia osoba, a wreszcie pierwsza osoba. Tak więc, według robota, pozycja 2 ma największy priorytet, a następnie pozycja 3.

Trzeciego dnia twój przyjaciel jest pierwszy i wykonujesz pierwszą obsługę. Wniosek kogokolwiek i robota polega na tym, że priorytet zależy od tego, kto jest zainteresowany i od pozycji każdej osoby. Uwaga: W prawdziwym życiu priorytet nie zawsze zależy od pierwszego shome_first obsługiwanego.

W programowaniu kolejką binarną priorytetową jest miejsce, w którym pierwszy element ma największy priorytet. Trzeci pozycja może mieć większy priorytet, a drugi pozycja, trzeci priorytet. Kolejki priorytetowe mają charakter binarny. Uwaga: Pierwszy element jest zawsze największym priorytetem w kolejce priorytetowej. Może się również zdarzyć, że drugi element ma większy priorytet, a trzecia pozycja ma trzeci priorytet. W definicji kolejki priorytetowej priorytety drugiego i trzeciego elementu mogą nie być w kolejności. Różnica ta trwa w kolejce do ostatniego elementu, co może nie być pozycją najkroczniejszą. Będzie to jednak wśród najniższych priorytetów. Ten częściowy sort jest również znany jako częściowe zamówienie. Tak więc kolejką priorytetową jest kolejka częściowego uporządkowania, w której priorytet nie jest obsługiwany po raz pierwszy, choć taka jest ogólna zasada.

W radzeniu sobie z tablicą, obserwacja pierwszego klimatu jest pierwsza in_first-out, napisana jako FIFO. W obliczeniach kolejka jest FIFO, podczas gdy kolejka priorytetowa jest częściową FIFO, ponieważ w miarę upadku kolejki niektóre elementy mają priorytety większe niż ich bliscy poprzednicy. Wraz ze wzrostem kolejki priorytetowej, odległość między takimi poprzednikami i wyższymi priorytetami wzrasta.

Kolejka priorytetowa jest zaimplementowana jako struktura danych sterty. Następne pytanie brzmi: co to za stos? Istnieje maksymalna sterta i minimalna stos, które zostaną szczegółowo omówione poniżej.

Treść artykułu

  • Struktura danych sterty
  • Priorytetowa kolejka w Java właściwa
  • Budowa Java kolejki priorytetowej
  • Metody Java kolejki priorytetowej
  • Wniosek

Struktura danych sterty

Jest maksymalnie i jest minime-heap. Z Max-heap pierwsza pozycja jest największą wartością. W miarę opadania kolejki wartości nadal zmniejszają się, rosną i ogólnie zmniejszają. W przypadku min-heap pierwsza pozycja ma najmniejszą wartość. W miarę upływu kolejki wartości nadal rosną i zmniejszają się i ogólnie rosną. Wartości sterty można przechowywać w tablicy.

Sterta binarna jest miejscem, w którym węzeł (przedmiot) ma dwoje dzieci. Pierwszym dzieckiem jest lewe dziecko, a drugie dziecko jest właściwym dzieckiem. Wartość dowolnego węzła nazywa się kluczem.

Max-heap

Poniższa lista to maksymalny heap, który jest już częściowo uporządkowany i nie wymaga dalszego zamówienia:

89, 85, 87, 84, 82, 79, 73, 80, 81 ,, 65, 69

89 to pierwsza wartość przy indeksie 0. Jest to węzeł główny (główny nadrzędny). Jest to największa wartość spośród wszystkich wartości. Jego pierwsze dziecko (85) jest w indeksie 1, którego indeks jest równy 2 (0) + 1, gdzie 0 jest wskaźnikiem rodzica. Jego drugie dziecko (87) znajduje się w indeksie 2, który jest równy 2 (0) + 2, gdzie 0 jest wskaźnikiem rodzica.

85 jest w indeksie 1. To rodzic. Jego pierwsze dziecko (84) znajduje się w indeksie 3, który jest równy 2 (1) + 1, gdzie 1 jest wskaźnikiem rodzica. Jego drugie dziecko (82) znajduje się w indeksie 4, który jest równy 2 (1) + 2, gdzie 1 jest wskaźnikiem rodzica.

87 znajduje się w indeksie 2. To rodzic. Jego pierwsze dziecko (79) znajduje się w indeksie 5, który jest równy 2 (2) + 1, gdzie 2 jest wskaźnikiem rodzica. Jego drugie dziecko (73) znajduje się w indeksie 6, który jest równy 2 (2) + 2, gdzie 2 jest wskaźnikiem rodzica.

Zasadniczo, gdy zliczanie indeksu zaczyna się od 0, niech reprezentuję wskaźnik rodzica tablicy; I tak, lewe (pierwsze) dziecko rodzica przy indeksie I znajduje się w indeksie 2i + 1; a jego prawe (drugie) dziecko jest w indeksie 2i + 2. Niektóre komórki pod koniec macierzy mogą być puste; Nie mogą mieć wartości.

Poprzednia lista jest dobrym przykładem treści kolejki priorytetowej po zakończeniu wszystkich elementów. Jeśli pierwszy element zostanie usunięty, reszta zostanie poddana konfiguracji wartości, tworząc nową kolejkę priorytetową. W ten sposób usunięcie wszystkich elementów z góry wyglądałoby tak, jakby wszystkie elementy zostały poprawnie posortowane. Elementy można nadal uzyskać tak, jak są, w częściowej kolejności, bez usuwania żadnego elementu.

Min-heap

Min-heap to odwrotność maksymalnej.

Priorytetowa kolejka w Java właściwa

Java ma klasę o nazwie priorytetQueue, dla priorytetu-Queue. Ma wiele konstruktorów i metod. Tylko trzy konstruktory i bardziej odpowiednie metody są wyjaśnione poniżej:

Budowa Java kolejki priorytetowej

Publiczne priorytetowo -eue ()

To tworzy kolejkę priorytetową bez żadnego elementu. Klasa, priorytetowo -suie, jest w Javie.Util.* Pakiet, który należy zaimportować. Poniższy segment kodu tworzy puste priorytet, a następnie dodaje wartości nieporozumienia (nawet częściowo posortowane) do kolejki:

Kolejka priorytetowa pq = nowy priorytetqueue();
PQ.Dodaj (69); PQ.Dodaj (65); PQ.Dodaj (87); PQ.Dodaj (79);
PQ.Dodaj (73); PQ.Dodaj (84); PQ.Dodaj (89); PQ.Dodaj (80);
PQ.Dodaj (81); PQ.Dodaj (82); PQ.Dodaj (85);

Te liczby są liczbami całkowitymi. Pochodzą z częściowo posortowanej listy podanej powyżej, ale obecnie są całkowicie nieporządkowane, gdy są wprowadzane. Elementy w PQ są teraz częściowo sortowane zgodnie z definicją kolejki priorytetowej w Javie.

Priorityqueue public (priorytetowe C)

Stwarza to priorytetowo z innej priorytetu. Poniższy segment kodu to ilustruje:

Kolejka priorytetowa pq = nowy priorytetqueue();
PQ.Dodaj (69); PQ.Dodaj (65); PQ.Dodaj (87); PQ.Dodaj (79);
PQ.Dodaj (73); PQ.Dodaj (84); PQ.Dodaj (89); PQ.Dodaj (80);
PQ.Dodaj (81); PQ.Dodaj (82); PQ.Dodaj (85);
Kolejka priorytetowa pq1 = nowy priorytetQueue(PQ);

PQ1 został utworzony z PQ. Obecnie ma to samo częściowe zamówienie i PQ.

Trzecia metoda konstruktora jest zilustrowana poniżej.

Metody Java kolejki priorytetowej

Public int size ()

Zwraca to rozmiar listy i nie zawiera pustych komórek, jak pokazano w następującym kodzie:

Kolejka priorytetowa pq = nowy priorytetqueue();
PQ.Dodaj (69); PQ.Dodaj (65); PQ.Dodaj (87); PQ.Dodaj (79);
PQ.Dodaj (73); PQ.Dodaj (84); PQ.Dodaj (89); PQ.Dodaj (80);
PQ.Dodaj (81); PQ.Dodaj (82); PQ.Dodaj (85);
int sz = pq.rozmiar();
System.na zewnątrz.println (SZ);

Wyjście to 11.

Public Void Foreach (działanie konsumenckie)

Ta metoda musi być używana w specjalny sposób do kopiowania wszystkich wartości w kolejce priorytetowej w częściowo posortowanej formie. Poniższy program ilustruje to:

Kolejka priorytetowa pq = nowy priorytetqueue();
PQ.Dodaj (69); PQ.Dodaj (65); PQ.Dodaj (87); PQ.Dodaj (79);
PQ.Dodaj (73); PQ.Dodaj (84); PQ.Dodaj (89); PQ.Dodaj (80);
PQ.Dodaj (81); PQ.Dodaj (82); PQ.Dodaj (85);
PQ.Foreach (pozycja -> System.na zewnątrz.print (item + ""));
System.na zewnątrz.println ();

Zwróć uwagę na sposób, w jaki kod w nawiasach został wykonany. Pozycja jest zmienną fikcyjną, która reprezentuje każdy element w kolejce. Zwróć uwagę na użycie operatora strzałek. Wyjście to:

65 69 84 79 73 87 89 80 81 82 85

Wyjście jest prawidłowe w częściowej kolejności, ale w kolejności rosnącej. Niekoniecznie jest to odwrotna kolejność podana powyżej ze względu na sposób, w jaki wartości zostały zawarte na liście. Oznacza to, że metoda foreach zwraca listę jako minister. Aby zwrócić listę w kolejności malejącej, użyj następującego konstruktora:

Public PriorityQueue (komparatorka komparatora)

To jest konstruktor. Poniższy kod pokazuje, jak go używać:

Kolejka priorytetowa pq = nowy priorytetqueue((x, y) -> liczba całkowita.Porównaj (y, x));
PQ.Dodaj (69); PQ.Dodaj (65); PQ.Dodaj (87); PQ.Dodaj (79);
PQ.Dodaj (73); PQ.Dodaj (84); PQ.Dodaj (89); PQ.Dodaj (80);
PQ.Dodaj (81); PQ.Dodaj (82); PQ.Dodaj (85);
PQ.Foreach (pozycja -> System.na zewnątrz.print (item + ""));

X, y są zmiennymi fiknymi reprezentującymi mniejsze i mniej wartości. Zauważ, że w pierwszych nawiasach dla x i y, x pojawia się przed y. W drugim nawiasach Y pojawia się przed x. Wyjście to:

89 85 87 80 82 69 84 65 79 73 81

Public Boolean Add (e e)

Liczbę elementów w kolejce priorytetowej można zwiększyć jeden po drugim. Ta metoda powraca, jeśli nastąpiła zmiana; i w przeciwnym razie fałsz. Poniższy kod dodaje dwunastą wartość praktyczną do kolejki:

Kolejka priorytetowa pq = nowy priorytetqueue((x, y) -> liczba całkowita.Porównaj (y, x));
PQ.Dodaj (69); PQ.Dodaj (65); PQ.Dodaj (87); PQ.Dodaj (79);
PQ.Dodaj (73); PQ.Dodaj (84); PQ.Dodaj (89); PQ.Dodaj (80);
PQ.Dodaj (81); PQ.Dodaj (82); PQ.Dodaj (85); PQ.Dodaj (70);
PQ.Foreach (pozycja -> System.na zewnątrz.print (item + ""));

Wartość dodana wzrośnie w górę kolejki, aby pasować do jej odpowiedniej pozycji, co prowadzi do pewnej reakcji pozycji elementów. Wyjście to:

89 85 87 80 82 70 84 65 79 73 81 69

Publiczne ankiety ()

Ta metoda pobiera i usuwa głowę kolejki; lub zwraca null, jeśli ta kolejka jest pusta. Za każdym razem, gdy głowa jest usuwana, kolejka priorytetowa dostosowuje się do nowej prawowitej głowy. Jeśli głowa będzie nadal usuwana, zwrócone wartości będą w pełnej sortowanej kolejności. Poniższy kod to ilustruje:

Kolejka priorytetowa pq = nowy priorytetqueue((x, y) -> liczba całkowita.Porównaj (y, x));
PQ.Dodaj (69); PQ.Dodaj (65); PQ.Dodaj (87); PQ.Dodaj (79);
PQ.Dodaj (73); PQ.Dodaj (84); PQ.Dodaj (89); PQ.Dodaj (80);
PQ.Dodaj (81); PQ.Dodaj (82); PQ.Dodaj (85); PQ.Dodaj (70);
PQ.Foreach (pozycja -> System.na zewnątrz.Drukuj (PQ.ankieta () + ""));

Dane wyjściowe z komputera autora to:

89 87 85 84 82 81 80 79 73 70 69 65 Wyjątek w wątku „Main” Java.Util.ConcurrentModificationException
w Javie.baza/java.Util.Kolejka priorytetowa.Foreach (priorytetowo.Java: 984)
na thlass.Główny (thass.Java: 11)

Należy zauważyć, że wyjście jest z pełnej sortowanej kolejności. Ten konkretny kod nie mógł złapać wrzucenia wyjątku. Ten problem pozostaje jako ćwiczenie badawcze dla czytelnika.

Wniosek

Kolejka priorytetowa w Javie to kolejka, w której elementy mają priorytet niż FIFO. Kolejką priorytetową jest zazwyczaj stos, który może być maksymalny lub minimalny. Wartości muszą być tego samego typu. Są przechowywane w kolejce w formacie sterty (częściowe zamówienie). Mamy nadzieję, że ten artykuł jest pomocny. Sprawdź inne artykuły do ​​nośników Linuksa, aby uzyskać wskazówki i samouczki.