2009-10-20 10 views
23

Czy istnieje wydajny algorytm scalania 2 maks. Stert, które są przechowywane w postaci tablic?Algorytm łączenia dwóch maks. Stert?

+11

Tak. Czego spróbowałeś do tej pory? –

+0

Co masz na myśli przez wydajność? – PeterAllenWebb

+0

cóż, jeśli po prostu wstawię każdy element do nowej sterty w losowej kolejności, która byłaby średnia O (nlogn), myślę. więc szukam może dla O (log (n)^2) – ThP

Odpowiedz

15

To zależy od rodzaju sterty.

Jeśli jest to standardowy stos, w którym każdy węzeł ma maksymalnie dwoje dzieci, a który wypełnia się, że liście znajdują się w maksymalnie dwóch różnych rzędach, nie można uzyskać lepszego niż O (n) dla scalenia.

Po prostu połącz te dwie tablice i utwórz z nich nową stertę, która zajmuje O (n).

Aby uzyskać lepszą wydajność łączenia, można użyć innego wariantu sterty, takiego jak Fibonacci-Heap, który można scalić w O (1) zamortyzowany.

Update: Należy zauważyć, że nie jest gorsza wstawić wszystkie elementy pierwszego sterty od jednego do drugiego hałdy lub odwrotnie od insercji wykonuje O (log (n)). Wraz ze stanów komentarz, nie wydaje się wiedzieć, jak kupa jest optymalnie zbudowany na początku (znowu dla standardowego kopiec binarny)

  1. Utwórz tablicę i umieścić w elementach obu stosach w jakiś arbitralny zamówienie
  2. rozpoczyna się teraz od najniższego poziomu. Najniższy poziom zawiera trywialne maksymalne stosy wielkości 1, więc ten poziom jest wykonywany
  3. przesuń poziom wyżej. Gdy zostanie naruszony warunek sterty jednego z "stosów podrzędnych", zamień katalog główny "podobszaru" na większe dziecko. Następnie poziom 2 zostaje zakończony
  4. przejście do poziomu 3. Po naruszeniu warunków sterty, należy postępować jak poprzednio. Zamień go na większe dziecko i przetwarzaj rekurencyjnie, aż wszystko się zgadza aż do poziomu 3
  5. ...
  6. po osiągnięciu góry, utworzyłeś nową stertę w O (n).

Pomijam tutaj dowód, ale możesz to wyjaśnić, ponieważ wykonałeś większość sterty na najniższych poziomach, gdzie nie trzeba było wymieniać dużej ilości zawartości, aby przywrócić stan stosu. Operowałeś na znacznie mniejszych "sub stertach", co jest dużo lepsze niż to, co zrobiłbyś, gdybyś wstawił każdy element do jednego z stert => wtedy będziesz operował za każdym razem na całej kupie, która zajmuje O (n) za każdym razem .

Aktualizacja 2: Dwumianowa sterty umożliwia łączenie w O (log (n)) i będzie zgodne z wymaganiami O (log (n)^2).

1

myślę co szukasz w tym przypadku jest kopiec dwumianowy.

Dwumianowa sterty to kolekcja drzew dwumianowych, należąca do rodziny stert scalonych. Najgorszy czas działania unii (scalenia) na 2 + dwumianowych hałdach z n całkowitymi przedmiotami w hałdach wynosi O (lg n).

Aby uzyskać więcej informacji, zobacz stronę http://en.wikipedia.org/wiki/Binomial_heap.