ทำไมจาวาไม่ใช้เรเดียนซ์ในการค้นหาพื้นฐาน


12

java.util.Arrays.sort(/* int[], char[], short[], byte[], boolean[] */) ถูกนำมาใช้เป็น 'การปรับพอร์ตสั้น' แทนการเรียงลำดับแบบ Radix

ฉันทำการเปรียบเทียบความเร็วเมื่อไม่นานมานี้และด้วยสิ่งต่าง ๆ เช่น n> 10,000 การเรียงลำดับของกัมมันตภาพรังสีก็เร็วขึ้นเสมอ ทำไม?

คำตอบ:


17

ฉันจะคาดเดาว่า:

  • Array.sort ถูกนำมาใช้เป็น quicksort เนื่องจาก quicksort สามารถเรียงลำดับอะไรก็ได้ในเวลาที่เหมาะสมเมื่อเปรียบเทียบ
  • การเรียงลำดับรายการ 10,000 รายการนั้นไม่ธรรมดา การเข้าถึงโครงสร้างข้อมูลที่ 10,000 องค์ประกอบหรือมากกว่านั้นเป็นเรื่องปกติ หากคุณต้องการรักษาลำดับการค้นหาต้นไม้ที่สมดุลมักจะเป็นวิธีที่ดีกว่าไปกว่าการเรียงลำดับอาร์เรย์ทั้งหมดของคุณทุกครั้งที่คุณต้องการองค์ประกอบที่เล็กที่สุด
  • การเรียงลำดับแบบดั้งเดิมนั้นไม่ธรรมดาแม้ว่ามหาวิทยาลัยจะสอนอะไรก็ตาม

ประเด็นก็คือมันไม่ใช่กรณีการใช้งานทั่วไปที่ต้องมีการปรับให้เหมาะสมในไลบรารี่มาตรฐาน หากคุณเขียนแอปพลิเคชันซึ่งมีปัญหาด้านประสิทธิภาพที่คุณกำหนดผ่านการทำโปรไฟล์ที่เรียงลำดับอาร์เรย์ 10,000+ ints เป็นคอขวดจริง ๆ แล้วคุณอาจเขียนเรียงลำดับด้วยมือหรือพิจารณาโครงสร้างข้อมูลในตัวเลือกแรก สถานที่.


ไม่แน่ใจ 100% แต่ฉันคิดว่า TimSort ถูกใช้ในบางกรณีแล้ว
Martijn Verburg

1
แต่ไม่มีอะไรเป็น Array.sort มีหลาย Array.sorts และคำถามเกี่ยวกับเรื่องนี้โดยเฉพาะสำหรับประเภทตัวเลข
Danubian Sailor

6

Back2dos ได้กล่าวทั้งหมดฉันจะพยายามอธิบายจุดที่ฉันคิดว่าสำคัญที่สุด:

การจัดเรียง Radix สามารถเรียงลำดับค่าดั้งเดิมที่แท้จริงที่มีอยู่ภายในอาร์เรย์โดยยึดตามรูปแบบเลขฐานสอง ในสถานการณ์วิศวกรรมซอฟต์แวร์ที่เกิดขึ้นจริงในโลกนี้คดีนี้แทบจะไม่เคยเกิดขึ้นเลย สิ่งที่เรามักจะทำบ่อยกว่านั้นคือการเรียงลำดับของโครงสร้างข้อมูลที่ซับซ้อนมากขึ้น (ไม่ใช่แบบดั้งเดิม) และบางครั้งเราเรียงลำดับอาร์เรย์ของดัชนีไปยังเอนทิตีอื่น ๆ

ตอนนี้อาร์เรย์ของดัชนีไปยังเอนทิตีอื่น ๆ เป็นจริงแล้วอาร์เรย์ของ primitives แต่ลำดับการจัดเรียงนั้นจัดทำโดยอินเตอร์เฟสตัวเปรียบเทียบ (และ / หรือผู้รับมอบอำนาจใน C #) ซึ่งเปรียบเทียบดัชนีไม่ใช่ แต่เอนทิตีดัชนีโดยดัชนี ดังนั้นการเรียงลำดับจึงไม่มีความสัมพันธ์ใด ๆ กับลำดับของค่าดั้งเดิมและการเรียงลำดับแบบ Radix ไม่มีประโยชน์อย่างยิ่งสำหรับสถานการณ์นี้

ตัวอย่าง:

เรามีชุดของสตริง: [0] = "Mike", [1] = "Albert", [2] = "Zoro" จากนั้นเราจะประกาศอาร์เรย์ของดัชนีกับสตริงเหล่านั้น: [0] = 0, [1] = 1, [2] = 2 จากนั้นเราจัดเรียงแถวลำดับของดัชนีผ่านตัวเปรียบเทียบซึ่งไม่เปรียบเทียบดัชนีด้วยตนเอง แต่เป็นสตริงจริงที่อ้างอิงโดยดัชนีเหล่านี้ หลังจากเรียงลำดับแล้วอาร์เรย์ผลลัพธ์ของดัชนีจะมีลักษณะดังนี้: [0] = 1, [1] = 0, [2] = 2 อย่างที่คุณเห็นลำดับการจัดเรียงนี้ไม่เกี่ยวข้องกับรูปแบบไบนารีของค่าที่มีอยู่ในอาเรย์ แต่โดยการสำรวจอาเรย์ของดัชนีนี้และดึงแต่ละสตริงที่เกี่ยวข้องเราจะไปที่สตริงตามลำดับที่เรียง

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