คิวลำดับความสำคัญที่มีทั้งการลดคีย์และการเพิ่มคีย์


11

Fibonnaci กองสนับสนุนการดำเนินการดังต่อไปนี้:

  • insert(key, data) : เพิ่มองค์ประกอบใหม่ให้กับโครงสร้างข้อมูล
  • find-min() : ส่งกลับตัวชี้ไปยังองค์ประกอบด้วยปุ่มต่ำสุด
  • delete-min() : ลบองค์ประกอบที่มีคีย์ขั้นต่ำ
  • delete(node) : ลบองค์ประกอบที่ชี้ไปตาม node
  • decrease-key(node) : ลดคีย์ขององค์ประกอบที่ชี้ไป node

การดำเนินการที่ไม่ลบทั้งหมดคือเวลา (ตัดจำหน่าย) และการดำเนินการลบเป็นเวลาตัดจำหน่ายO(1)O(เข้าสู่ระบบn)

มีการใช้งานของคิวลำดับความสำคัญซึ่งสนับสนุนincrease-key(node)ในเวลา (ตัดจำหน่าย) หรือไม่O(1)


@ ราฟาเอลถ้าคุณเพิ่มกุญแจขององค์ประกอบขั้นต่ำเพื่อให้มันเป็นกุญแจที่ใหญ่ที่สุดตอนนี้มันไม่ชัดเจนในทันที (อย่างน้อยก็สำหรับฉัน) ว่าคุณไม่จำเป็นต้องทำการปรับยอดเงินใหม่อย่างคงที่
Joe

คำตอบ:


10

สมมติคุณมีคิวลำดับความสำคัญที่มี , และ จากนั้นต่อไปนี้เป็นอัลกอริทึมการเรียงลำดับที่ใช้เวลา :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
ฉันสันนิษฐานว่า(de|in)crease-keyทำแค่บวกหรือลบเท่านั้น
กราฟิลส์

และมี DS ที่ช่วยให้เพิ่มการทำงานของคีย์ในเวลาคงที่ แต่ลดลงในลอการิทึม (หรือมากกว่า) หรือไม่? (สำหรับกองเล็ก ๆ )
กอนซาโล่โซเลร่า

2
@GonzaloSolera: หลักฐานที่เป็นไปไม่ได้ในคำตอบนี้ไม่สนใจเกี่ยวกับการลดคีย์ O (1) find-min, เพิ่ม -key และ insert มีปัญหาอยู่แล้วด้วยกัน (และการพึ่งพาการพิสูจน์ของ insert ไม่จำเป็นจริงๆ O (n) heapify ก็เพียงพอแล้วหรือเราอาจใช้ heap เดียวกันซ้ำหลาย ๆ ตัว เรียงลำดับเพื่อพิสูจน์ว่าเป็นการละเมิดขอบเขตการเรียงลำดับการเปรียบเทียบโดยไม่คำนึงถึงค่าใช้จ่ายในการเพิ่มหรือแทรก)
user2357112 รองรับ Monica

โอเคฉันไม่ได้อ่าน ขอบคุณสำหรับความคิดเห็นของคุณ!
กอนซาโล่โซเลร่า
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.