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)


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

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.