Wiem, gdzie mam używać stosów, kolejek i drzew w aplikacjach, ale nigdy wcześniej nie korzystałem z Deque (Double Ended Queue). Gdzie zazwyczaj spotykam ich na wolności? Czy byłby w tych samych miejscach co Kolejka, ale z dodatkowymi łapami?
Wiem, gdzie mam używać stosów, kolejek i drzew w aplikacjach, ale nigdy wcześniej nie korzystałem z Deque (Double Ended Queue). Gdzie zazwyczaj spotykam ich na wolności? Czy byłby w tych samych miejscach co Kolejka, ale z dodatkowymi łapami?
Odpowiedzi:
Jednym ze sposobów użycia deque jest „starzenie się” przedmiotów. Zwykle jest używany jako funkcja cofania lub historii. Nowa akcja jest wstawiana do deque. Najstarsze przedmioty są z przodu. Ograniczenie wielkości deque zmusza elementy z przodu do usunięcia w pewnym momencie, gdy wstawiane są nowe elementy (starzenie najstarszych elementów). Następnie zapewnia szybki dostęp do obu końców konstrukcji, ponieważ natychmiast znasz najstarsze i najnowsze elementy, aby albo usunąć przód i wykonać najstarszą akcję w O (1), albo cofnąć w O (1).
Doskonałe pytanie. Nie pamiętam naszego kursu CS 102 wspominającego o pojedynczej aplikacji dla podwójnie zakończonej kolejki.
Do dziś jedyną aplikacją, którą znam, jest harmonogram kradzieży pracy wspomniany w artykule w Wikipedii .
Działa zasadniczo w następujący sposób:
W normalnym, jednowątkowym modelu proceduralnym każde wywołanie funkcji wypycha rekord aktywacji na tak zwany stos wywołań . Rekord aktywacji zawiera lokalne zmienne i parametry tego połączenia. Po zakończeniu wywołania metody („zwraca”) ostatni rekord aktywacyjny jest usuwany ze stosu wywołań.
Jest to szczególnie ważne, ponieważ w ten sposób realizowana jest rekurencja: struktura rekurencji jest reprezentowana w bieżącym stanie stosu wywołań.
Równoległy algorytm rekurencyjny możemy wykorzystać tę właściwość, zastępując stos wywołań kolejką wywołań. Każdy wątek w obliczeniach pobiera własną kolejkę wywołań i przesuwa i aktywuje rekordy aktywacji, jak w przypadku wykonywania sekwencyjnego.
Ale gdy wątek zakończy pracę (= kolejka wywołań jest pusta), kradnie pracę z innego wątku, usuwając rekord aktywacyjny z kolejki wywołań tego wątku, usuwając go z „niewłaściwego” końca.
Zasadniczo kolejka połączeń działa jak dwa stosy połączeń, które obsługują teraz dwa wątki.