การใช้งานจริงของ Radix Sort


20

Radix จัดเรียงเป็นทฤษฎีอย่างรวดเร็วเมื่อคุณรู้ว่ากุญแจอยู่ในขอบเขต จำกัด บางอย่างบอกว่าค่าในช่วงตัวอย่างเช่น หากคุณเพิ่งแปลงค่าเป็นฐานซึ่งใช้เวลาเวลาให้ทำการจัดเรียงฐาน radix จากนั้นแปลงกลับเป็นฐานเดิมของคุณเพื่ออัลกอริทึมโดยรวมn[0...nk-1]k<LGnnΘ(n)nΘ(nk)

อย่างไรก็ตามฉันได้อ่านแล้วว่าโดยทั่วไปแล้วการเรียงลำดับของ Radix ในทางปฏิบัติจะช้ากว่าการทำ Quicksort แบบสุ่มมาก :

สำหรับอาร์เรย์ขนาดใหญ่การเรียงลำดับแบบ Radix มีจำนวนการเรียนการสอนต่ำที่สุด แต่เนื่องจากประสิทธิภาพแคชค่อนข้างต่ำประสิทธิภาพโดยรวมจึงแย่กว่ารุ่นที่ผสานหน่วยความจำและการรวมแบบรวดเร็ว

การจัดเรียงของ Radix เป็นเพียงแค่อัลกอริธึมทางทฤษฎีที่ดีหรือว่ามันมีประโยชน์ในทางปฏิบัติทั่วไปหรือไม่?

คำตอบ:


15

การเรียงลำดับของ Radix มักจะเป็นวิธีที่เร็วและมีประโยชน์มากที่สุดในเครื่องจักรแบบขนาน

ในแต่ละโหนดของมัลติโปรเซสเซอร์คุณอาจทำอะไรอย่าง Quicksort แต่การเรียง Radix ช่วยให้หลาย ๆ โหนดทำงานร่วมกันโดยมีการซิงโครไนซ์น้อยกว่าการเรียงซ้ำแบบต่างๆ

มีสถานการณ์อื่นด้วย หากคุณต้องการการจัดเรียงที่มีเสถียรภาพ (การเรียงที่เมื่อใดก็ตามที่มีสองปุ่มที่เท่ากันพวกเขายังคงอยู่ในลำดับเดียวกันแทนที่จะได้รับการจัดเรียงใหม่) จากนั้นฉันก็ไม่ทราบว่า Quicksort รุ่นใดที่จะใช้งาน การควบรวมกิจการก็มีเสถียรภาพเช่นกัน (หากใช้อย่างถูกต้อง) ลิงก์ของคุณเป็นครั้งแรกที่ฉันเคยได้ยินใครบอกว่าการผสานอาจทำให้พฤติกรรมแคชดีขึ้นกว่าการเรียงลำดับแบบ Radix


แพตเตอร์สันและเฮนเนสซี่ทำประเด็นเดียวกันกับกระดาษที่เชื่อมโยงข้างต้นโดยลามาร์ก้าในหนังสือองค์กรคอมพิวเตอร์และการออกแบบ
Robert S. Barnes

การกล่าวถึง Patterson ของคุณทำให้ฉันนึกถึงงานสำคัญที่ Andrea Arpaci-Dusseau ทำเกี่ยวกับการเรียงลำดับบนคลัสเตอร์เมื่อประมาณ 15 ปีที่แล้ว (Patterson เป็นผู้ร่วมเขียน) ในปี 1997 กระดาษพวกเขาตัดสินใจจริง ๆ ว่าการเรียงลำดับของสสารบางส่วนนั้นดีกว่าที่จะเรียงบนแต่ละโหนดเช่นกัน (ฉันเพิ่มการอ้างอิงไปยังคำตอบ)
หลงทางลอจิก

นั่นดูน่าสนใจ. ในปี 2009 ฉบับที่สี่ของ CompOrg พวกเขาอ้างอิงงานของ Lamarca ในการจัดเรียง Radix รุ่นก่อนหน้านี้ว่าไม่เป็นมิตร (หน้า 489) แต่จากนั้นในหน้า 490 ภายใต้กราฟเปรียบเทียบการจัดเรียง Quicksort และ Radix ที่พวกเขาพูดว่า "เนื่องจากผลลัพธ์ดังกล่าว การจัดเรียง Radix ได้รับการคิดค้นขึ้นโดยคำนึงถึงลำดับชั้นของหน่วยความจำเพื่อพิจารณาข้อดีของอัลกอริทึม " ฉันสงสัยว่า Radix Sort รุ่นใหม่เหล่านี้ทำงานอย่างไร
Robert S. Barnes

ความสงสัยของฉันคือ Lamarca ใช้การจัดเรียง Radix ที่โง่ (อันที่เก็บถังไว้เป็นรายการที่เชื่อมโยง) ไม่มีใครเคยทำเช่นนั้น คุณจะใช้ที่เก็บข้อมูลโดยใช้อาร์เรย์แบบไดนามิกที่ได้รับการปรับปรุงบางอย่าง(เช่น C ++ vector) แต่ฉันไม่รู้เพราะฉันไม่ได้อ่านเอกสารของลามาร์ก้า
หลงทางลอจิก

@WanderingLogic Radix เรียงลำดับใช้ที่เก็บข้อมูลอย่างไร คุณหมายถึง bucket ที่นี่ใช่ไหม
บาร์

3

@ Robert: ลิงก์ของคุณค่อนข้างน่าแปลกใจ (จริงๆแล้วฉันไม่พบประโยคที่ยกมา) ประสบการณ์ส่วนตัวของฉันสำหรับการป้อนข้อมูลแบบสุ่มการเรียงลำดับของ Radix นั้นเร็วกว่า STL std::sort()มากซึ่งใช้ตัวแปรของ Quicksort ฉันใช้เพื่อทำให้อัลกอริทึมเร็วขึ้น 50% โดยแทนที่std::sort()ด้วยการจัดเรียง radix ที่ไม่เสถียร ฉันไม่แน่ใจว่า "QuickSort เวอร์ชั่นที่ดีที่สุดของหน่วยความจำ" คืออะไร แต่ฉันสงสัยว่ามันจะเร็วเป็นสองเท่าของ STL

โพสต์บล็อกนี้ประเมินการจัดเรียง radix พร้อมกับอัลกอริทึมการเรียงลำดับอื่น ๆ โดยสังเขปในการประเมินนี้std::sort()ใช้เวลา 5.1 วินาทีในการจัดเรียงจำนวน 50 ล้านจำนวนเต็มในขณะที่การเรียงลำดับแบบแทนที่ / ไม่เสถียรใช้เวลา 2.0 วินาที การเรียงลำดับของ radix ที่เสถียรควรเร็วยิ่งขึ้น

การจัดเรียง Radix ยังใช้กันอย่างแพร่หลายสำหรับสตริงการเรียงลำดับเสถียร บางครั้งการจัดเรียงของ Radix จะเห็นได้จากการสร้างอาร์เรย์ต่อท้าย BWT เป็นต้น


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