เหตุใดการเรียงลำดับการเลือกจึงเร็วกว่าการจัดเรียงฟอง


28

มันเขียนไว้ใน Wikipediaว่า "... การเรียงลำดับการเลือกเกือบจะดีกว่าการเรียงลำดับฟองและเรียงลำดับคำพังเพย" ใครช่วยอธิบายหน่อยได้ไหมว่าทำไมการเรียงลำดับการเลือกจึงถือว่าเร็วกว่าการเรียงลำดับฟองแม้ว่าทั้งคู่จะมี:

  1. ความซับซ้อนของเวลากรณีที่แย่ที่สุด :O(n2)

  2. จำนวนการเปรียบเทียบ : O(n2)

  3. ความซับซ้อนของเวลากรณีที่ดีที่สุด :

    • การจัดเรียงฟอง:O(n)
    • ตัวเลือกการเรียง:O(n2)
  4. ความซับซ้อนของเวลากรณีโดยเฉลี่ย :

    • การจัดเรียงฟอง:O(n2)
    • ตัวเลือกการเรียง:O(n2)

คำตอบ:


32

ความซับซ้อนทั้งหมดที่คุณให้นั้นเป็นจริง แต่จะได้รับในรูปแบบBig Oดังนั้นค่าเพิ่มเติมและค่าคงที่ทั้งหมดจะถูกละเว้น

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

จำนวนการเปรียบเทียบโดยเฉลี่ย:

  • การจัดเรียงฟอง :12(N2NlnN(γ+ln21)N)+O(N)
  • การเรียงลำดับการแทรก :14(N2N)+NHN
  • ตัวเลือกการจัดเรียง :(N+1)HN2N

ตอนนี้ถ้าคุณพล็อตฟังก์ชั่นเหล่านั้นคุณจะได้รับดังนี้ พล็อต plot2

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

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

ฉันละเว้นการวิเคราะห์ความซับซ้อนของเวลาเนื่องจากมันขึ้นอยู่กับการนำไปใช้ แต่สามารถใช้วิธีการที่คล้ายกันได้


ฉันมีปัญหากับ "เราสามารถสับเปลี่ยนลำดับการป้อนข้อมูลแบบสุ่มเพื่อรับกรณีความไม่แน่ใจ" เหตุใดจึงสามารถทำได้เร็วกว่าเวลาที่ต้องเรียงลำดับ?
Sasho Nikolov

1
คุณสามารถเรียงลำดับหมายเลขใด ๆ ซึ่งจะใช้เวลาโดยที่คือความยาวของลำดับ เห็นได้ชัดว่าอัลกอริทึมการเรียงลำดับแบบเปรียบเทียบใด ๆ ต้องมีความซับซ้อนอย่างน้อยดังนั้นแม้ว่าคุณจะเพิ่มลงในความซับซ้อนของมันก็จะไม่เปลี่ยนแปลงมากนัก อย่างไรก็ตามเรากำลังพูดถึงการเปรียบเทียบไม่เกี่ยวกับเวลาความซับซ้อนของเวลาขึ้นอยู่กับการนำไปใช้งานและการใช้งานเครื่องตามที่ฉันได้กล่าวไว้ในคำตอบ N O ( N บันทึกN ) NNNO(NlogN)N
Bartosz Przybylski

ฉันเดาว่าฉันง่วงนอนคุณพูดถูกคุณสามารถเรียงลำดับในเวลาเชิงเส้นได้
Sasho Nikolov

เนื่องจากการเปรียบเทียบของคุณถูกผูกไว้กับการเรียงลำดับการเลือกหรือไม่ ดูเหมือนว่าคุณกำลังอ้างถึงว่าเป็นการเปรียบเทียบ O (n log n) โดยเฉลี่ย HN=Θ(logN)
templatetypedef

Gamma = 0.577216 เป็นค่าคงที่ของ Euler-Mascheroni บทที่เกี่ยวข้องคือ "ศิลปะแห่งการเขียนโปรแกรม" ตอนที่ 3 ส่วน 5.2.2 pg 109 และ 129. คุณพล็อตเรื่องการจัดเรียงฟองได้อย่างไรโดยเฉพาะอย่างยิ่งคำศัพท์ O (sqrt (N)) คุณละเลยมันเหรอ?
mxmlnkn

11

ค่าใช้จ่ายแบบซีมโทติคหรือหมายเหตุอธิบายพฤติกรรมการ จำกัด ของฟังก์ชันเมื่ออาร์กิวเมนต์มีแนวโน้มที่จะไม่มีที่สิ้นสุดนั่นคืออัตราการเติบโตของมันO

ฟังก์ชั่นนั้นเองเช่นจำนวนการเปรียบเทียบและ / หรือการแลกเปลี่ยนอาจแตกต่างกันสำหรับอัลกอริธึมสองตัวที่มีค่าใช้จ่ายแบบอะซิมโทติคเท่ากันหากพวกมันเติบโตด้วยอัตราเดียวกัน

โดยเฉพาะอย่างยิ่งการเรียงลำดับฟองต้องการโดยเฉลี่ยแลกเปลี่ยนต่อรายการ (แต่ละรายการจะถูกย้ายองค์ประกอบที่ชาญฉลาดจากตำแหน่งเริ่มต้นไปยังตำแหน่งสุดท้ายและการแลกเปลี่ยนแต่ละรายการมีสองรายการ) ในขณะที่การเรียงลำดับการเลือกต้องการเพียงครั้ง พบค่าต่ำสุด / สูงสุดจะถูกสลับหนึ่งครั้งไปยังจุดสิ้นสุดของอาร์เรย์)1n/41

ในแง่ของจำนวนการเปรียบเทียบการเรียงลำดับฟองต้องใช้การเปรียบเทียบโดยที่คือระยะทางสูงสุดระหว่างตำแหน่งเริ่มต้นของรายการและตำแหน่งสุดท้ายซึ่งมักจะมีขนาดใหญ่กว่าสำหรับค่าเริ่มต้นที่กระจายอย่างสม่ำเสมอ อย่างไรก็ตามการเรียงลำดับการเลือกต้องใช้การเปรียบเทียบเสมอk n / 2 ( n - 1 ) × ( n - 2 ) / 2k×nkn/2(n1)×(n2)/2

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


1
นี่เป็นคำตอบที่ดีมาก
Grijesh Chauhan

หนังสือเล่มไหนที่คุณชอบ
Grijesh Chauhan

@GrijeshChauhan: หนังสือเป็นเรื่องของรสนิยมดังนั้นใช้คำแนะนำใด ๆ กับเม็ดเกลือ ฉันชอบ Cormen, Leiserson และ Rivest ของ "Introduction to Algorithms" ซึ่งให้ภาพรวมที่ดีเกี่ยวกับหัวข้อต่างๆและชุด "The Art of Computer Programming" ของ Knuth ถ้าคุณต้องการรายละเอียดเพิ่มเติม / ทั้งหมดในหัวข้อเฉพาะใด ๆ คุณอาจต้องการตรวจสอบว่ามีการถามคำถามของหนังสือที่นี่มาก่อนหรือไม่หรือโพสต์คำถามนั้นถ้ายังไม่ได้
เปโดร

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

3

การเรียงลำดับฟองใช้เวลาสลับมากขึ้นในขณะที่การเรียงลำดับการเลือกหลีกเลี่ยงสิ่งนี้

เมื่อใช้การเลือกการเรียงลำดับจะสลับnเวลามากที่สุด แต่เมื่อใช้การจัดเรียงฟองมัน swaps n*(n-1)เกือบ และเวลาอ่านที่เห็นได้ชัดนั้นน้อยกว่าการเขียนแม้ในหน่วยความจำ เวลาเปรียบเทียบและเวลาทำงานอื่น ๆ สามารถละเว้นได้ ดังนั้นเวลาสวอปจึงเป็นจุดสำคัญของปัญหา


ฉันคิดว่าคำตอบอื่น ๆ ของ Bartek เหมาะสมกว่า แต่ฉันไม่สามารถลงคะแนนหรือแสดงความคิดเห็น ... BTW ฉันยังคงคิดว่าเวลาเขียนมีผลกระทบมากขึ้นและหวังว่าเขาจะสามารถนำสิ่งนี้มาพิจารณาหากเขาเห็นและเห็นด้วย
simonmysun

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

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