Zawsze myślałem, że stosy i kolejki priorytetowe były synonimami - streszczenie struktura danych, która wspiera insert
, findMin
i deleteMin
operacje.
Wygląda na to, że część literatury jest ze mną zgodna - na przykład struktury danych funkcjonalne Chrisa Okasakiego (rozdział 3).
Z drugiej strony strona sterty Wikipedii definiuje ją jako strukturę danych opartą na drzewach i stwierdza, że sterty są konkretną implementacją kolejek priorytetowych.
Trudno mi to pogodzić z faktem, że mogę wymyślić więcej niż jedną implementację stosu - stosy lewicowe, stosy dwumianowe, stosy rozrzucone ...
Czy prosty fakt, że stertę można wdrożyć przy użyciu różnych struktur danych, nie oznacza z definicji, że jest to abstrakcyjna struktura danych? A jeśli tak, to czy rzeczywiście istnieje różnica w stosunku do kolejek priorytetowych?
źródło
Odpowiedzi:
Kolejka priorytetowa może mieć dowolną implementację, na przykład tablicę, która jest przeszukiwana liniowo podczas otwierania. Wszystko to oznacza, że kiedy pop wyskakuje, dostajesz wartość z minimum lub maksimum w zależności.
Klasyczna sterta, jak się zwykle nazywa, to zwykle sterta minimalna. Implementacja, która charakteryzuje się dużą złożonością czasu (
O(log n)
w trybie push i pop) i nie ma narzutu pamięci.źródło
findMin
,deleteMin
,insert
), hałdy są gwarantowane „dobre”, gdzie złożoność dla nich kolejek priorytetowych nie?O(log(n))
, przypuszczam , że nie będzie możliwości push i pop.Ta strona internetowa zawiera naprawdę jasne wyjaśnienie. http://pages.cs.wisc.edu/~vernon/cs367/notes/11.PRIORITY-Q.html
Krótko mówiąc, kolejka priorytetowa może zostać zaimplementowana przy użyciu wielu struktur danych, które już zbadaliśmy (tablica, lista połączona lub drzewo wyszukiwania binarnego). Jednak te struktury danych nie zapewniają najbardziej wydajnych operacji. Aby wszystkie operacje były bardzo wydajne, zastosujemy nową strukturę danych zwaną stertą.
źródło
Myślę, że to, co napisałeś o konkretach kontra abstrakcjach, jest poprawne. Kiedy mówisz, że stosy rozrzucone, stosy dwumianowe są różnymi implementacjami stosów, myślę, że bardziej słuszne jest stwierdzenie, że są to różne typy stosów. Sterta uważam za kategorię implementacji, która ogólnie gwarantuje nie tylko ten sam interfejs, ale także takie same czasy dostępu.
Widzisz to w mapach asocjacyjnych, tabelach skrótów i drzewach wyszukiwania binarnego. Tabele skrótów i tabele skrótów są konkretnymi strukturami danych, które zapewniają interfejs abstrakcyjny mapy asocjacyjnej. Czerwone czarne drzewa i drzewa avl to zrównoważone bst, z tymi samymi dużymi gwarancjami O i tym samym dodatkowym interfejsem (w celu przejścia). Są to różne rodzaje drzew, powiedziałbym więcej niż różne implementacje drzew. Są to różne, ale ściśle powiązane implementacje map asocjacyjnych.
źródło