Na życzenie oto struktura, którą znalazłem po sformułowaniu pytania:
Podstawową ideą jest użycie gwintowany drzewa kozioł ofiarny wraz ze wskaźnikiem do minimum (i na dokładkę, maksimum, jak również). Prostszą alternatywą dla wątków jest utrzymanie wskaźników poprzedzających i następczych w każdym węźle (co jest równoważne, prostsze, ale ma więcej narzutu). Przyszedłem nazwać to kupą kozła ofiarnego , żeby nadać mu jakąś nazwę.
Właśnie ta podstawowa struktura zapewnia następujące operacje:
- Szukaj: podany klucz zwraca wskaźnik do odpowiedniego węzła w czasie .O(logn)
- Wstaw: dany klucz wstawia klucz do struktury, zwracając wskaźnik do tego węzła w czasie .O(logn)
- Poprzednik / następca: dany wskaźnik zwraca następcę lub poprzednika w czasie .O(1)
- Get-Min / Max: przywraca wskaźnik do minimum lub maksimum.
W analizie drzewek kozłów ofiarnych obciążenie związane z usunięciem jest analizowane jako , ale analiza faktycznie daje obciążenie równoważące (co jest ignorowane w pracy ponieważ liczą także czas potrzebny na znalezienie węzła, który ma zostać usunięty). Jeśli więc mamy wskaźnik do węzła, możemy go usunąć w stałym czasie (możesz to zrobić w wątkowym drzewie wyszukiwania binarnego w czasie ) i w połączeniu z z równoważeniem, daje to czas usunięcia:O(logn)O(1)O(logn)O(1)O(1)O(1)
- Usuń: dany wskaźnik usuwa węzeł w czasie .O(1)
Łącząc to:
- Extract-Min / Max: usuwa minimalny / maksymalny węzeł w czasie .O(1)
Możesz zrobić trochę więcej ze wskaźnikami: na przykład nie jest trudno utrzymać wskaźnik do mediany lub innej statystyki porządku, więc możesz zachować stałą liczbę takich wskaźników, jeśli ich potrzebujesz.
Niektóre inne rzeczy:
- Konstruuj: biorąc pod uwagę kluczy w posortowanej kolejności, zbuduj stertę kozła ofiarnego w czasie.nO(n)
- Równowaga: zrównoważ drzewo tak, aby tworzyło idealnie zrównoważone drzewo wyszukiwania binarnego (redukuje narzut związany z wyszukiwaniem) w czasie (możesz to zrobić o stały współczynnik szybciej niż sugeruje papier, wykorzystując wskaźników poprzednika / następcy).O(n)
I wreszcie, jestem prawie pewien, że możesz wesprzeć te operacje, ale muszę się nad nimi zastanowić, zanim na pewno się o tym dowiesz:
- Insert-New-Min / Max: dany klucz, który jest mniejszy / większy niż jakikolwiek klucz już w strukturze, wstawia klucz do struktury, zwracając wskaźnik do tego węzła w czasie .O(1)