การวัดความผิดปกติแบบใดที่จะใช้เมื่อวิเคราะห์ Quicksort


9

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

เหตุผลที่ฉันสงสัยว่าลำดับแบบสุ่มของฉันมี "คำสั่งซื้อ" มากมายสำหรับพวกเขานั่นก็คือการใช้การสุ่ม pivot ช่วยแก้ปัญหาประสิทธิภาพการทำงาน แต่ในทางทฤษฎีแล้วก็ไม่ควรมีปัญหาเรื่องประสิทธิภาพใด ๆ กับลำดับการป้อนข้อมูลแบบ "สุ่ม" ที่ควรจะเป็น


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

ฉันควรจะทราบว่าผมเป็นปริญญาตรี ... ผมกำลังมองหาบางสิ่งบางอย่างมากขึ้นอีกนิดตรงไปตรงมาเช่นอาจจะเป็นหนึ่งในมาตรการที่ในบทความนี้ (ผมก็ไม่ทราบว่าเป็นที่หนึ่ง): citeseerx.ist.psu edu / viewdoc / summary? doi = 10.1.1.45.8017
Robert S. Barnes

คำถามที่เกี่ยวข้อง
ราฟาเอล

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

@YvesDaoust ฉันไม่คิดว่ามันสำคัญจริงๆจำนวนของ "non-monotonicity" นั้นเป็นเพียงความซับซ้อนของ Kolmogorov กับความยาวของสตริง logn!ที่เข้ารหัสการเรียงลำดับขององค์ประกอบในลำดับ แน่นอนว่ามันไม่สามารถคำนวณได้และคุณต้องคิดถึงข้อ จำกัด ลึก ๆ เช่น pseudorandom แต่มีประโยชน์ในแง่ที่ว่าการวัดความผิดปกติทุกครั้งนั้นเป็นการประมาณความซับซ้อนของ Kolmogorov และคุณไม่จำเป็นต้องคำนวณเพื่อพิสูจน์สิ่งต่าง ๆ ด้วย มีการแสดงผลลัพธ์ที่ซับซ้อนจำนวนมากด้วยวิธีการบีบอัดข้อมูล
ปีเตอร์

คำตอบ:


1


พาร์ติชัน Lomuto กับ Hoare Lomuto จะทนทุกข์เมื่อเรียงลำดับคีย์เท่ากันในขณะที่พาร์ติชัน Hoare ไม่ทำ
แผนการแบ่งพาร์ติชันทั้งสองประสบอย่างเท่าเทียมกันเมื่อใช้ pivot ที่ห่างจากค่ามัธยฐาน

การวัดความผิดปกติ
การวัดความผิดปกติที่จะเลือกใช้เพื่อจุดประสงค์ของ quicksort นั้นง่ายมาก
ตอบ: เดือยที่อยู่ห่างจากค่ามัธยฐานไกลเท่าไหร่เมื่อเทียบกับข้อมูลสุ่ม?
หากคุณยืนยันในการใช้พาร์ติชัน Lomuto และหากคุณอนุญาตให้ใช้ค่าซ้ำคุณต้องเพิ่มการทดสอบแบบสุ่มต่อไปนี้:
B: มีองค์ประกอบที่ซ้ำกันจำนวนเท่าใดเมื่อเปรียบเทียบกับการสุ่ม

แน่นอนว่ามันค่อนข้างโง่ที่คิดว่าอนุญาตให้ใช้ค่าซ้ำกันในชุดข้อมูลของคุณและยังประเมินพาร์ติชัน Lomuto ได้ดังนั้นคุณควรกำจัดรายการที่ซ้ำกันล่วงหน้าหรือเปลี่ยนไปใช้พาร์ติชัน Hoare หรือสมมติว่าซ้ำกันได้ยาก

มาตรการทั้งสองมีความสำคัญในการวัดปริมาณโดยใช้สถิติ

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

ห้ามใช้ pivot แบบคงที่ใด ๆ ในรหัสจริง
โปรดทราบว่าหากคุณเขียนรหัสจริงด้วย pivot แบบตายตัว*) (สิ่งใดก็ตามที่อาจเป็นสาระสำคัญ) คุณกำลังเปิดตัวเองจนปฏิเสธการโจมตีบริการเนื่องจากผู้โจมตีสามารถแทรก ค่าทางพยาธิวิทยา ณ จุดนั้นดังนั้นคุณควรเลือกองค์ประกอบแบบสุ่มเป็นเดือย

*) หรือหลาย pivots หากคุณเลือกที่ดีที่สุดของ x pivots

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