Java และ. NET: เหตุใดอัลกอริธึมการเรียงลำดับแบบอื่นจึงถูกใช้โดยค่าเริ่มต้น


19

เพียงแค่สงสัยว่าทำไมJavaและ.NET Frameworkใช้อัลกอริทึมการเรียงลำดับที่แตกต่างกันตามค่าเริ่มต้น

ใน Java Array.Sort()ใช้อัลกอริทึมMerge Sortตามค่าเริ่มต้นและตามที่Wikipedia.comพูดว่า:

ใน Java เมธอด Arrays.sort () ใช้การเรียงแบบผสานหรือการปรับแบบเร็วขึ้นอยู่กับประเภทข้อมูลและสำหรับการสลับประสิทธิภาพการปรับใช้เพื่อเรียงลำดับการแทรกเมื่อเรียงลำดับองค์ประกอบอาร์เรย์น้อยกว่าเจ็ดรายการ

ใน. NET Framework Array.Sort/List.Sort()ใช้Quick Sortเป็นอัลกอริทึมการเรียงลำดับเริ่มต้น ( MSDN ):

List.Sort () ใช้ Array.Sort ซึ่งใช้อัลกอริทึม QuickSort การใช้งานนี้จัดเรียงไม่เสถียร นั่นคือถ้าสององค์ประกอบมีค่าเท่ากันลำดับของพวกเขาอาจไม่ถูกสงวนไว้ ในทางตรงกันข้ามการจัดเรียงที่มีเสถียรภาพจะรักษาลำดับขององค์ประกอบที่เท่ากัน

จากการดูตาราง"การเปรียบเทียบอัลกอริธึม"ที่ยอดเยี่ยมเราจะเห็นได้ว่าอัลกอริธึมทั้งสองนั้นมีพฤติกรรมที่แตกต่างจากมุมมองการใช้งานหน่วยความจำและกรณีแย่ที่สุด:

ป้อนคำอธิบายรูปภาพที่นี่

ทั้งสองJavaและ.NETเป็นกรอบการทำงานที่ยอดเยี่ยมสำหรับการพัฒนาโซลูชันองค์กรทั้งสองมีแพลตฟอร์มสำหรับการพัฒนาแบบฝัง เหตุใดพวกเขาจึงใช้อัลกอริธึมการเรียงลำดับที่แตกต่างกันตามค่าเริ่มต้นความคิดใด ๆ


1
สำหรับการอภิปรายเพิ่มเติมเกี่ยวกับการเปรียบเทียบระหว่างสองประเภทนี้ดูstackoverflow.com/q/680541/866022
yoozer8

คำตอบ:


10

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

ฉันเดาว่า. NET QuickSort นั้นอยู่เหนือสิ่งใดสิ่งหนึ่งใน MFCs หรือ Windows API และอาจสืบทอดมาจาก Windows รุ่นเก่ากว่าซึ่งข้อดีแบบมัลติเธรดของ MergeSort จะไม่ได้รับการพิจารณาสำหรับคอมพิวเตอร์ของ วัน. ( แก้ไข:ไม่ใช่แม้ว่านักพัฒนาของ Microsoft จะเป็นแฟนพันธุ์แท้ QuickSort มาเป็นเวลานานซึ่งเห็นได้จากตัวเลือกการเรียงลำดับการใช้งานตั้งแต่ MS-DOS)

Java ซึ่งไม่สามารถใช้การใช้งานเฉพาะแพลตฟอร์มใด ๆ ได้เนื่องจาก Java ได้รับการออกแบบตั้งแต่เริ่มต้นจนเป็นแพลตฟอร์มที่ไม่ขึ้นต่อกัน ใครจะรู้ว่าเหตุใด MergeSort จึงออกมาด้านบน การคาดเดาที่ฉับพลันของฉันคือการใช้งานชนะการแข่งขันประเภทหนึ่งเมื่อเทียบกับผู้พัฒนารายอื่น ๆ หรืออย่างอื่นที่ O (n) -space MergeSort ดูดีที่สุดบนกระดาษในแง่ของประสิทธิภาพที่ดีที่สุดและแย่ที่สุด (MergeSort ไม่มีจุดอ่อนของ Achilles เกี่ยวกับการเลือกองค์ประกอบเช่น QuickSort และตัวเลือกที่ดีที่สุดคือรายการที่อยู่ใกล้ในขณะที่มักจะแย่ที่สุดของ QuickSort) ฉันสงสัยว่ามีการพิจารณาถึงผลประโยชน์หลายเธรดในขั้นต้น แต่การดำเนินการในปัจจุบันอาจมีหลายเธรด


1
List<T>.Sortใน. NET ใช้วิธีเนทีฟที่ใช้ใน CLR (หากคุณไม่ได้ใช้เครื่องมือเปรียบเทียบแบบกำหนดเอง) แต่ไม่มีการพึ่งพาไลบรารี OS
Joey

1
@Keith -. NET ไม่ได้อยู่เหนือชั้นใด ๆ และได้รับการออกแบบให้เป็นแพลตฟอร์มที่เป็นอิสระ คุณสามารถดูการใช้งานได้ที่นี่: github.com/dotnet/coreclr/blob/master/src/mscorlib/src/System/…
Robert MacLean

@RobertMacLean - ". NET ไม่ได้อยู่เหนือสิ่งอื่นใด" ไม่ใช่คำสั่งที่แท้จริงแม้ว่าคุณจะได้แสดงให้เห็นแล้วว่าฟังก์ชั่นเรียงลำดับในคำถามนั้นเป็นรหัส "จัดการ" ทั้งหมด ส่วนใหญ่ของ. NET รวมถึงการสนับสนุนการเข้ารหัสไลบรารีเดสก์ท็อป GUI Windows, Windows API interop (รวมถึงกระบวนการและการควบคุมเธรด) ทั้งหมดขึ้นอยู่กับรหัสที่ไม่มีการจัดการที่มีอยู่ก่อนรวมถึง MFC พวกเขาเพียงแค่ต้องเป็น; Windows เองมีส่วนประกอบ. NET เพียงเล็กน้อยเท่านั้นของ codebase ส่วนที่เหลือไม่มีการจัดการ
KeithS

มันยังคงอยู่ที่ Microsoft devs ได้รับการพิสูจน์แล้วว่าเป็นแฟนบอยของ QuickSort เหนือการใช้งานอื่น ๆ เนื่องจาก QuickSort เป็นอัลกอริธึมที่เป็นทางเลือกตั้งแต่ MS-DOS และสิ่งนี้จะมีอิทธิพลต่อการตัดสินใจของพวกเขา
KeithS

คำตอบนี้ผิดมากฉันช็อคอย่างสุจริต
user9993

17

ทีมพัฒนาที่แตกต่างกันในสอง บริษัท ที่แตกต่างกันได้ข้อสรุปที่แตกต่างกันเกี่ยวกับกรณีการใช้งานตามปกติสำหรับเฟรมเวิร์กและส่วนประกอบของพวกเขาและได้ตัดสินใจใช้งานตามนั้น

โดยพื้นฐานแล้วแต่ละ บริษัท ทำการวิเคราะห์ของพวกเขาดูที่ฐานลูกค้าของพวกเขาและตัดสินใจแตกต่างกันตาม

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


5
หรือแม้แต่สมมติฐานเดียวกันและข้อมูลดิบ . .
ไวแอตต์บาร์เน็ตต์

ใช่มันอาจเป็นเพียงแค่นิสัย - ไมโครซอฟท์เคยใช้ quicksort (ไม่แน่นอน), java ต้องการไปกับชนิดที่มีเสถียรภาพ ... และการเรียงลำดับผสานเป็นคอกที่รู้จักเร็วที่สุด ...
rogerdpack

12

คำถามนี้ล้าสมัยเนื่องจาก Java ใช้Timsort (ตั้งแต่ Java 7)

ของอัลกอริทึมเฉพาะที่กล่าวถึง:

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

  • การควบรวมกิจการรับประกันประสิทธิภาพที่ดีที่สุดในกรณีที่ O (n log n) แต่มีค่าใช้จ่ายและความต้องการหน่วยความจำเพิ่มขึ้นอีกเล็กน้อย มันยังมีเสถียรภาพโดยอัตโนมัติ (เช่นรักษาองค์ประกอบที่เท่ากันในลำดับเดียวกัน)

โดยทั่วไปแล้วนักออกแบบ Java ดูเหมือนจะอนุรักษ์นิยมมากกว่า / เน้นไปที่ "สิ่งที่ถูกต้อง" ดังนั้นจึงไม่น่าแปลกใจที่พวกเขาเลือก Mergesort ออกจากสองเนื่องจากมันมีการรับประกันที่ดีกว่า

ไม่แน่ใจว่าทำไม Microsoft ถึงเลือก Quicksort บางทีพวกเขาอาจทำให้พวกเขาดูดีขึ้นในการวัดขนาดเล็กบางตัว?

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