Byłem niedawno poproszony zbudować strukturę danych, który obsługuje cztery operacje, a mianowicieJak mogę dalej optymalizować tę strukturę danych?
- przycisku: Dodaj element do DS.
- Pop: Usuń ostatni pchnięty element.
- Find_max: Znajdź maksymalny element spośród aktualnie przechowywanych elementów.
- Pop_max: Usuń maksymalny element z DS.
Elementy są liczbami całkowitymi.
Oto rozwiązanie zasugerowałem:
- Weź stos.
- Przechowywać parę elementów w nim. Para powinna być (element, max_so_far), gdzie element jest elementem tego indeksu, a max_so_far jest jak dotąd najwyższym wartościowanym elementem.
- Przytrzymując element w stosie, sprawdź wartość maksymalnego elementu stosu max_so_far. Jeśli bieżąca liczba jest większa niż ta, ustaw wartość bieżącej pary jako wartość bieżącego elementu, a następnie zapisz poprzednią wartość: max_so_far . Oznacza to, że pchanie będzie po prostu operacją
O(1)
. - Dla
pop
po prostu wyskocz element ze stosu. Ponownie, ta operacja toO(1)
. - Dla
Find_max
, zwróć wartość max_so_far najwyższego elementu stosu. Ponownie,O(1)
. - Popping the max element wymaga przechodzenia przez stos i jawnego usuwania elementu max i odpychania elementów na nim, po przydzieleniu nowych wartości max_so_far. Byłoby to liniowe.
Zostałem poproszony o poprawę, ale nie mogłem.
Jeśli chodzi o złożoność czasową, całkowity czas można poprawić, jeśli wszystkie operacje przebiegają w O(logn)
, jak sądzę. Jak to zrobić, jest czymś, czego nie jestem w stanie uzyskać.
Napisałeś jakiś kod? –
Kodowanie to jest bardzo trywialne. Problem nie dotyczy kodu, ale algorytmu. – Ranveer
Kiedy dostaniesz implementację zakodowaną i działającą, pomyśl o umieszczeniu jej na [Recenzja kodu] (http://codereview.stackexchange.com) :) Będą mieć wskaźniki dotyczące * kodu *, a także algorytmu. –