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(log⁡n)

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


@ 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;
}

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.