ด่วนและไม่ต้องกังวล


9

โดยเฉพาะอย่างยิ่งเมื่อเขียนแอปพลิเคชัน 'มาตรฐาน' (ไม่ใช่ HPC) คุณพิจารณาว่าอัลกอริทึมการเรียงลำดับที่จะเลือกหรือเพียงแค่ชำระด้วย quicksort (ซึ่งเป็นไลบรารีส่วนใหญ่ที่เรียกการเรียงลำดับ)? อาจมีผลกำไรในบางสถานการณ์ แต่ในทางกลับกันการเพิ่มประสิทธิภาพที่เหมาะสมต้องใช้เวลาในการวิเคราะห์ปัญหาและสร้างมาตรฐาน

คำตอบ:


12

โดยทั่วไปการใช้วิธีการเริ่มต้นเว้นแต่มีความต้องการเฉพาะในการทำสิ่งที่แปลกใหม่มากขึ้นทำให้ทุกอย่างอ่าน / เข้าใจได้ง่ายขึ้นตามถนน IMHO

หากคุณพบ (หรือในบางกรณีสงสัยอย่างยิ่ง) ว่าคุณมีปัญหาด้านประสิทธิภาพซึ่งเป็นเวลาที่จะเพิ่มความซับซ้อน

ในทางกลับกันถ้าคุณใช้ภาษาต่ำพอที่ไม่มีการเรียงลำดับในตัวสำหรับวัตถุชนิดที่คุณต้องเรียงลำดับลองเลือกหนึ่งหรือสองที่ครอบคลุมฐานทั้งหมดของคุณและใช้สิ่งเหล่านั้น


6

เรียกรูทีนไลบรารีที่จัดให้เสมอยกเว้นว่าคุณมีเหตุผลที่ดีมาก ๆ ที่จะไม่ทำเช่นนั้น (และคุณต้องจัดทำเอกสารว่าเหตุใดจึงเป็นเช่นนั้น)

เนื่องจากขั้นตอนวิธีการเรียงลำดับนั้นยากที่จะทำให้ถูกต้องอย่างแน่นอน มีข้อผิดพลาดใน Java quicksort ที่มีชุดข้อมูลขนาดใหญ่มากซึ่งถูกระบุแก้ไขและส่งมอบให้กับลูกค้าโดย Sun ดังนั้นคุณไม่จำเป็นต้องทำ

นอกจากนี้การเรียงลำดับเริ่มต้นใน Java 7 ยังได้รับการอัปเกรดเป็นรุ่นใหม่ที่ดีกว่า ยังฟรีอีกด้วย

เว้นแต่จะได้เริ่มต้นการจัดเรียงเป็นสรรพสิ่งไม่ดีพอสำหรับคุณติดกับมัน


3

ในการประชุมครั้งหนึ่งฉันได้ยินเรื่องราวที่ดีเกี่ยวกับเรื่องนี้

ที่ Microsoft มีคนกำลังเขียนแอป VB (c. VB 3) และส่งคนจำนวนมากทางไปรษณีย์ว่าเขามีค่ามากมายและเขาต้องการให้พวกเขาปรากฏในคอมโบบ็อกซ์ตามลำดับเขาควรจะทำยังไงต่อ

ทุกคนพุ่งเข้าหาหนังสือตำราวิทยาศาสตร์คอมพิวเตอร์เก่า ๆ ของพวกเขาค้นหาขั้นตอนที่มีประสิทธิภาพสูงและนำพวกเขาไปยัง Visual Basic และส่งจดหมายให้เขา ผู้ชายคนหนึ่งเพิ่งส่งจดหมายกลับมาว่า

"ประมาณ 50" คำตอบมา

"เพียงตั้งค่าคุณสมบัติที่เรียงเป็น TRUE"

ใน 99.9999% ของอินสแตนซ์การเรียงลำดับทำได้ดีที่สุดโดยใช้ไลบรารีการควบคุมหรือในการเลือก SQL เนื่องจากความแตกต่างของประสิทธิภาพระหว่างรูทีนไลบรารีและสิ่งที่คุณเขียนจะน้อยมากและค่าใช้จ่ายในการบำรุงรักษาและความพยายาม


1

นี่คือเวลาที่จะดึงคำพูดคลาสสิกเกี่ยวกับการเพิ่มประสิทธิภาพก่อนวัย ในกรณีส่วนใหญ่มันไม่สำคัญ Heck ด้วยความเร็วของซีพียูในปัจจุบันคุณอาจจะสามารถจัดเรียงชุดข้อมูลส่วนใหญ่และไม่สังเกตเห็นมากนัก แต่เมื่อคุณเรียงลำดับชุดข้อมูลที่มีขนาดใหญ่มากและประสิทธิภาพการเรียงลำดับเริ่มเป็นปัญหาคุณควรดูตัวเลือกอื่น ๆ อย่างแน่นอน


เรียงลำดับฟอง? ประสิทธิภาพการทำงานนั้นแย่ที่สุดสำหรับกรณีทั่วไปและแย่ที่สุดและเท่ากับการเรียงลำดับการแทรกสำหรับกรณีที่ดีที่สุด ไม่มีเหตุผลที่ควรใช้
Hippo

1
@ ฮิปโป: ฉันไม่ได้เรียกร้องให้ใช้การเรียงลำดับของฟอง ฉันหมายถึงคอมพิวเตอร์สมัยใหม่นั้นเร็วพอที่ในกรณีส่วนใหญ่มันไม่สำคัญว่าอัลกอริทึมของคุณจะช้าแค่ไหนเพราะผู้ใช้จะไม่สังเกตเห็น
Mason Wheeler

วิธีการเกี่ยวกับBogosort ?
dsimcha

0

แม้ว่าจะเห็นได้ชัดว่ามันไม่สำคัญกับบิตและไทม์ ฉันพบว่าการเรียงลำดับผสานนั้นง่ายต่อการเขียนและทำความเข้าใจมากกว่า quicksort ดังนั้นถ้าฉันจะเขียนอัลกอริทึมการเรียงลำดับของตัวเองฉันจะใช้มัน


การรวม Viva! และเป็นคำศัพท์ที่ดีขึ้นเล็กน้อยและไม่มีกรณีที่แย่ที่สุด
Frank Shearar

0

อย่างน้อยในห้องสมุดที่เขียนได้อย่างดีฉันคาดว่า built-in นั้นsortจะถูกนำไปใช้งานเป็นIntrosortไม่ใช่แค่ Quicksort ความแตกต่างไม่ค่อยมีความสำคัญมากนัก แต่ Introsort กำจัดประสิทธิภาพของกรณีที่แย่ที่สุดของ Quicksort โดยมีผลกระทบน้อยที่สุดในกรณีทั่วไป

อย่างไรก็ตามในการตอบคำถามของคุณ: ใช่ - นั่นคือสิ่งที่คุณควรเริ่มต้นด้วยตัวเองและจนถึง / จนกว่าคุณจะมีผลลัพธ์ของ profiler ที่บ่งบอกว่าเป็นปัญหานั่นคือสิ่งที่ควรจะอยู่

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