Antrian prioritas dengan operasi penurunan dan peningkatan

11

Sebuah Fibonnaci Heap mendukung operasi berikut:

  • insert(key, data) : menambahkan elemen baru ke struktur data
  • find-min() : mengembalikan pointer ke elemen dengan kunci minimum
  • delete-min() : menghapus elemen dengan kunci minimum
  • delete(node) : menghapus elemen yang ditunjuk oleh node
  • decrease-key(node) : mengurangi kunci elemen yang ditunjuk oleh node

Semua operasi non-delete adalah (diamortisasi) waktu, dan operasi hapus adalah O ( log n ) waktu diamortisasi.HAI(1)HAI(catatann)

Apakah ada implementasi antrian prioritas yang juga mendukung increase-key(node)dalam waktu (diamortisasi)?HAI(1)

Joe
sumber
@Raphael jika Anda meningkatkan kunci elemen minimum sehingga sekarang menjadi kunci terbesar, itu tidak segera jelas (setidaknya bagi saya) bahwa Anda tidak perlu melakukan penyeimbangan ulang dengan jumlah yang sangat konstan.
Joe

Jawaban:

10

HAI(1) find-minincrease-keyinsertHAI(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
sumber
1
Saya berasumsi bahwa (de|in)crease-keyhanya melakukan plus atau minus satu.
Raphael
Dan apakah ada DS yang memungkinkan operasi peningkatan kunci dalam waktu konstan tetapi penurunan logaritmik (atau lebih)? (Untuk sedikit penumpukan)
Gonzalo Solera
2
@GonzaloSolera: Bukti ketidakmungkinan dalam jawaban ini tidak peduli dengan kunci penurunan; O (1) find-min, peningkatan-key, dan insert sudah menjadi masalah bersama (dan ketergantungan bukti pada insert tidak benar-benar diperlukan; O (n) heapify sudah cukup, atau kita mungkin dapat menggunakan kembali tumpukan yang sama pada banyak macam untuk membuktikan itu melanggar batas jenis perbandingan terlepas dari biaya heapify atau masukkan).
user2357112 mendukung Monica
Oke maaf, saya rindu membacanya. Terima kasih atas komentar Anda!
Gonzalo Solera