เหตุใด introsort จึงใช้ heapsort แทนที่จะรวมกัน


9

เป็นส่วนหนึ่งของการบ้านที่ครอบคลุมการใช้งานIntrosortฉันถูกถามว่าทำไมใช้ heapsort มากกว่าการรวม (หรืออื่น ๆO(nเข้าสู่ระบบ(n)) อัลกอริทึมสำหรับเรื่องนั้น)

Introsort เป็นอัลกอริธึมการเรียงลำดับแบบไฮบริดที่ให้ทั้งประสิทธิภาพเฉลี่ยที่รวดเร็วและ (asymptotically) ประสิทธิภาพที่ดีที่สุดสำหรับกรณีที่เลวร้ายที่สุด มันเริ่มต้นด้วย quicksort และสลับไปที่ heapsort เมื่อความลึกของการเรียกซ้ำเกินกว่าระดับตาม (ลอการิทึมของ) จำนวนองค์ประกอบที่เรียงลำดับ ( Wikipedia , ดึงข้อมูล 2014 - May-06)

เหตุผลเดียวที่ฉันคิดได้ก็คือฮีปพอร์ตคือ "ในที่" ... แต่ฉันไม่เข้าใจจริงๆว่าทำไมเรื่องนี้ถึงมีความสำคัญ


3
หากการรวบรวมข้อมูลเป็นส่วนหนึ่งของคำถามคุณจะต้องแจ้งให้เราทราบก่อนที่จะพูดอะไรก็ได้
หลุยส์

1
ยินดีต้อนรับสู่วิทยาการคอมพิวเตอร์ ! โปรดทราบว่าคุณสามารถใช้ LaTeX ที่นี่เพื่อเรียงพิมพ์คณิตศาสตร์ในวิธีที่อ่านได้มากขึ้น ดูที่นี่สำหรับการแนะนำสั้น ๆ
FrankW

เราถูกขอให้สร้างรหัสหลอกสำหรับการแนะนำภายในและหลังจากนั้นเราถูกถามว่าทำไมมันถึงใช้ heapsort มากกว่าการรวมกัน
user672009

@ user672009 ในกรณีนั้นให้จดโค๊ดเพื่อดูว่าคุณเจออะไร เหตุผลอาจหรืออาจไม่เกี่ยวข้องกับประสิทธิภาพ
Raphael

2
ฉันได้ข้อสรุปว่าเนื่องจากการเรียงลำดับอย่างรวดเร็วในสถานที่เราจำเป็นต้องใช้อัลกอริทึมการเรียงลำดับแบบแทนที่ อย่างไรก็ตามฉันเปิดรับอินพุต
user672009

คำตอบ:


9

ข้อเสียของ Quicksort 2 ข้อคือมันต้องการ O(เข้าสู่ระบบn) พื้นที่พิเศษ (เพื่อรักษาช่วงเวลาที่ไม่ได้เรียงลำดับ) และการเลือกเดือยที่ไม่ดี (หรือลำดับที่ออกแบบมาเพื่อให้คุณเลือกเดือยที่ไม่ดี) อาจทำให้มันเป็น O(n2) เวลาและ O(n) อัลกอริทึมพื้นที่พิเศษ

เปลี่ยนเป็น heapsort เมื่อความลึกของการเรียกซ้ำมีขนาดใหญ่เกินไป (ที่ประมาณ เข้าสู่ระบบn) หมายถึงเรามีการรับประกันส่วนบนที่เป็น O(nเข้าสู่ระบบn) เวลาและ O(เข้าสู่ระบบn) พื้นที่เพิ่มเติม

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

เหตุผลที่ heapsort ไม่ได้ใช้สำหรับการจัดเรียงแบบเต็มนั้นเป็นเพราะช้ากว่า quicksort (เนื่องจากส่วนหนึ่งของค่าคงที่ซ่อนอยู่ในนิพจน์ O ใหญ่และส่วนหนึ่งของพฤติกรรมแคช)


แต่ใช้ heapsort ... และฉันสงสัยว่าเป็นเพราะมันอยู่ในสถานที่เช่น quicksort
user672009

ฉันสงสัยว่า @ user672009 สับสนกับประโยคสุดท้ายของคุณ ฉันขอแนะนำให้ชี้แจงว่า introsort ไม่ได้เริ่มต้นด้วย heapsort เพราะช้ากว่า
หลงทางตรรกะ

@ user672009, O(1)พื้นที่หมายถึง "ในสถานที่" และ quicksort ไม่ได้อยู่ในสถานที่ค่อนข้างเพราะมันต้องการO(LGn)พื้นที่เพิ่มเติม
หลงทางตรรกะ

นอกจากนี้ heapsort ยังมีแคชที่หายไปมากกว่า introsort
noɥʇʎԀʎzɐɹƆ

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