Kolejka priorytetowa z operacjami zmniejszania i zwiększania

11

Fibonnaci Heap obsługuje następujące operacje:

  • insert(key, data) : dodaje nowy element do struktury danych
  • find-min() : zwraca wskaźnik do elementu z minimalnym kluczem
  • delete-min() : usuwa element z minimalnym kluczem
  • delete(node) : usuwa element wskazany przez node
  • decrease-key(node) : zmniejsza klucz wskazanego elementu node

Wszystkie operacje niezwiązane z usuwaniem mają czas (amortyzowany), a operacje usuwania to czas amortyzowany.O(1)O(logn)

Czy istnieją implementacje priorytetową kolejce które również wsparcie increase-key(node)w (zamortyzowanego) czas?O(1)

Joe
źródło
@ Rafael, jeśli zwiększysz klucz minimalnego elementu, aby stał się on teraz największym kluczem, nie jest od razu oczywiste (przynajmniej dla mnie), że nie musisz wykonywać super-stałej ilości ponownego równoważenia.
Joe

Odpowiedzi:

10

Zakładam, że masz kolejkę priorytetową który ma , oraz . Poniżej znajduje się algorytm sortowania, który zajmuje czas:O ( n )O(1) find-minincrease-keyinsertO(n)

vector<T>
fast_sort(const vector<T> & in) {
  vector<T> ans;
  pq<T> out;
  for (auto x : in) {
    out.insert(x);
  }
  for(auto x : in) {
    ans.push_back(*out.find_min());
    out.increase_key(out.find_min(), infinity);
  }
  return ans;
}
jbapple
źródło
1
Zakładałem, że (de|in)crease-keytylko jeden plus lub minus jeden.
Raphael
I czy istnieje DS, który pozwala na działanie klawiszem zwiększania w stałym czasie, ale zmniejszeniem logarytmicznym (lub więcej)? (Dla min-sterty)
Gonzalo Solera
2
@ GonzaloSolera: dowód niemożliwości w tej odpowiedzi nie przejmuje się zmniejszeniem; O (1) find-min, klawisz zwiększania i wstawianie stanowią już problem razem (a zależność dowodu od wstawiania nie jest tak naprawdę konieczna; O (n) heapify wystarcza, lub prawdopodobnie możemy ponownie użyć tej samej sterty na wielu sortuje, aby udowodnić, że narusza granice sortowania porównania, niezależnie od kosztu heapify lub wstawienia).
user2357112 obsługuje Monikę
Ok przepraszam, tęskniłem za przeczytaniem tego. Dzięki za komentarz!
Gonzalo Solera