ความซับซ้อนของอัลกอริทึมแบบสุ่มสลับ Fisher-Yates


15

คำถามนี้เกี่ยวข้องกับอัลกอริทึม Fisher-Yates สำหรับส่งกลับการสุ่มแบบสุ่มของอาร์เรย์ที่กำหนด หน้าวิกิพีเดียบอกว่าความซับซ้อนของมันคือ O (n) แต่ผมคิดว่ามันเป็น O (n log n)

ในการวนซ้ำแต่ละครั้งฉันเลือกจำนวนเต็มแบบสุ่มระหว่าง 1 ถึง i เพียงแค่เขียนจำนวนเต็มในหน่วยความจำคือ O (log i) และเนื่องจากมีการวนซ้ำแล้วจึงรวมเป็น

O (บันทึก 1) + O (บันทึก 2) + ... + O (บันทึก n) = O (n บันทึก n)

ซึ่งไม่ดีกว่าอัลกอริทึมไร้เดียงสา ฉันทำอะไรบางอย่างหายไปหรือเปล่า

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

คำตอบ:


24

ฉันสงสัยว่าที่นี่เช่นเดียวกับในขั้นตอนวิธีการทำงานส่วนใหญ่ค่าใช้จ่ายในการอ่านและเขียนตัวเลขจะถือว่าเป็นค่าคงที่ มันเป็นบาปเล็ก ๆ น้อย ๆ ตราบใดที่คุณไม่ได้รับการดำเนินการไปและยุบ P และ PSPACE โดยอุบัติเหตุO(เข้าสู่ระบบn)


4
ในขณะที่นั่นเป็น "บาปเล็กน้อย" ฉันคิดว่ามันเป็นบาปหลักของการสอน TCS ที่ไม่เคยพูดถึงอย่างชัดเจน! นักเรียน CS ทุกคนค้นพบสิ่งนี้ด้วยตนเองและคิดว่าสิ่งสำคัญคือผิดจนกว่าพวกเขาจะถูกบอกว่าทุกคนรู้เรื่องนี้ แต่ไม่มีใครพูดถึงมัน นอกจากนี้ยังไม่มี brouhaha สองสามปีที่ผ่านมาเมื่อมีคนใช้แบบจำลอง O (log n) เพื่อให้อัลกอริทึม sub-cubic time สำหรับปัญหาที่มีชื่อเสียงบางอย่างที่คาดว่าจะเป็นโอเมก้า (n ^ 3)? นั่นเคยได้รับการแก้ไขไหม?
randomwalker

2
ฉันไม่ทราบ brouhaha ที่คุณอ้างถึง สำหรับการไม่พูดถึงมันคุณพูดถูก หลังจากที่ฉันได้อ่านโพสต์ของ Jeff Erickson เป็นครั้งแรกตอนนี้ฉันได้พิสูจน์แล้วว่าเป็น P = PSPACE ในชั้นเรียนเรขาคณิตของฉันสำหรับการเตะ :)
Suresh Venkat

1
ขอบคุณสำหรับคำตอบ. ฉันไม่เคยรู้ว่ามันเป็นเรื่องใหญ่ ลิงค์ให้อ่านที่ดี
Tomer Vromen

1
บรรทัดล่าง: ทำให้แบบจำลองของคุณชัดเจนเสมอ
Jukka Suomela

2
ฉันคิดว่าเหตุผลหลักที่เราให้ bit ops เป็นเวลาคงที่คือ (ในเวลา polynomial) คุณสามารถตั้งโปรแกรมตารางการค้นหาการเข้าถึงแบบคงที่เวลาสำหรับตัวถูกดำเนินการบิต สำหรับโมเดลการคำนวณ "ทันสมัย" ส่วนใหญ่ ไม่มีอะไร "บาป" เกี่ยวกับที่ ... สำหรับฉันฉันเห็นคุณสมบัตินี้เป็นหนึ่งที่สามารถสันนิษฐานได้โดยไม่สูญเสียทั่วไป O(เข้าสู่ระบบn)O(เข้าสู่ระบบn)
Ryan Williams

17

รูปแบบมาตรฐานของการคำนวณถือว่าการดำเนินการทางคณิตศาสตร์ในจำนวนเต็ม O (log n) - บิตสามารถดำเนินการในเวลาคงที่เนื่องจากการดำเนินการเหล่านั้นมักจะมอบฮาร์ดแวร์ ดังนั้นในอัลกอริทึม Fisher-Yates "การเขียนจำนวนเต็ม i ในหน่วยความจำ" ใช้เวลา O (1) เท่านั้น

แน่นอนว่ามันมีความหมายอย่างสมบูรณ์ในการวิเคราะห์อัลกอริธึมในแง่ของการทำงานของบิต แต่ตัวแบบบิตต้นทุนมีการทำนายพฤติกรรมที่แท้จริงน้อยกว่า แม้แต่ลูปแบบง่ายก็for i = 1 to n: print(i)ต้องใช้การดำเนินการบิต O (n log n)


จุดดีกับวง ไม่เคยสังเกตว่า ...
Tomer Vromen

8

นี่คือคำตอบของ "[อัลกอริทึม Fisher-Yates] ไม่ได้ดีไปกว่าอัลกอริทึมไร้เดียงสาฉันจะทำบางสิ่งที่นี่หายไปหรือไม่" ซึ่งคุณถามคำถาม

ในอัลกอริทึม "ไร้เดียงสา" ซึ่งใช้จำนวนจริง: คุณใช้ความแม่นยำกี่บิต? หากคุณนับความซับซ้อนของบิต (ตามที่คุณทำกับ Fisher-Yates) และอัลกอริทึมใช้ k บิตสุ่มสำหรับจำนวนจริงดังนั้นเวลาทำงานของมันจะเป็นΩ (kn log n) เนื่องจากการเปรียบเทียบสอง k- ตัวเลขจริงบิตต้องใช้เวลาΩ (k) แต่ k ความต้องการที่จะเป็นที่Ωน้อย (log n) เพื่อป้องกันไม่ให้สององค์ประกอบที่ถูกแมปไปจำนวนจริงเดียวกันซึ่งหมายความว่าขั้นตอนวิธีการใช้เวลาΩ (n log 2 n) เวลาซึ่งจะช้ากว่าสับเปลี่ยน Fisher-Yates โดย ปัจจัยของ log n

หากคุณเพียงแค่นับจำนวนการคำนวณและการเปรียบเทียบและเพิกเฉยต่อความซับซ้อนบิต Fisher-Yates ก็คือΘ (n) และอัลกอริทึมของคุณคือΘ (n log n) ยังคงเป็นส่วนหนึ่งของ log n


ฉันสงสัยว่าอัลกอริทึม "ไร้เดียงสา" มีความหมายที่ k ...
Tomer Vromen

1
อัลกอริทึม "ไร้เดียงสา" สามารถใช้งานได้อย่างหมดจดในเวลาเชิงเส้นดังนี้ กำหนดจำนวนเต็มแบบสุ่มแต่ละองค์ประกอบระหว่าง 1 ถึง n ^ 3 จากนั้นเรียงลำดับตัวเลขในเวลา O (n) ผ่านการเรียงลำดับ radix (ด้วยความน่าจะเป็นสูงไม่มีสององค์ประกอบจะได้รับจำนวนสุ่มแบบเดียวกันหากมีซ้ำกันสับพวกเขาซ้ำ..)
Jeffε

@JeffE: ขอบคุณ! นั่นสะอาดมากและมีความซับซ้อนเช่นเดียวกับ Fisher-Yates หลังจากโพสต์สิ่งนี้ฉันรู้สึกว่าอัลกอริทึม“ ไร้เดียงสา” ไม่ควรแย่กว่านี้ ... ฉันพลาดข้อเท็จจริงที่ว่าตัวเลข n k-bit สามารถเรียงลำดับใน O (nk) ไม่จำเป็นต้องใช้ O (nklog n) แต่ฉันคิดว่า Knuth-Fisher-Yates ยังคงดีกว่าในค่าคงที่: มันต้องใช้บิตสุ่ม (log n!) - จำนวนเต็มแบบสุ่มจาก 1 ถึง n จากนั้น 1 ถึง n-1 ฯลฯ - ซึ่งดีที่สุด (แทนที่จะเป็น 3n log n) และสามารถทำได้ในสถานที่พร้อมหน่วยความจำเสริมคงที่เพียงอย่างเดียว
ShreevatsaR

6

ไม่มีอะไรพิเศษเกี่ยวกับจำนวนเต็มสำหรับปัญหานี้

ตัวอย่างเช่นตารางแฮช (การจัดเก็บค่าใด ๆ ) ไม่ใช่เวลา O (1) ในการเข้าถึงหากฟังก์ชันแฮชต้องอ่านค่าทั้งหมดเพื่อคำนวณแฮช องค์ประกอบที่ไม่ซ้ำกันต้องใช้ log n bits โดยเฉลี่ยในการเป็นตัวแทนไม่ว่าตัวแทนของคุณจะฉลาดแค่ไหนและฟังก์ชันแฮชใด ๆ ที่อ่านอินพุตทั้งหมดจะต้องใช้เวลาในการคำนวณอย่างน้อยที่สุด ในทางปฏิบัติพวกมันเร็วกว่าต้นไม้สีแดงดำ แต่ไม่มีอาการ

brouhaha อ้างอิงโดย randomwalker เป็นเรื่องเกี่ยวกับกระดาษ POPL 2008 ( http://portal.acm.org/citation.cfm?doid=1328438.1328460 ) ซึ่งมีการกล่าวถึงที่นี่: http://blog.computationalcomplexity.org/2009/05/shaving- บันทึกที่มีหน่วย cost.html

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


ฉันไม่ได้รับผู้เขียนโพสต์บล็อก เขาบ่นว่าการเรียงลำดับเป็นจริง O (n บันทึก ^ 2 n) แต่แล้วบอกว่ากระดาษแข็งหรือไม่
Tomer Vromen

กระดาษแข็ง (กล่าวคือไม่ใช่เท็จ) ว่ามีรูปแบบที่การดำเนินการทางคณิตศาสตร์ใช้เวลาหน่วยและในอัลกอริทึมของกระดาษนั้นเป็นครั้งแรกที่จะบรรลุการดำเนินงาน o (n ^ 3)
Dave Doty

ฉันไม่ได้รับการคัดค้าน O (n log ^ 2 n) เพราะในแง่ของบิตอินพุตเองมีขนาด O (n log n) Btw เป็นที่ทราบด้านระดับคุณภาพของความคิดเห็นในบล็อกซับซ้อนได้มากสูงขึ้นแล้ว ....
Arnab

4

หน้า Wikipedia บอกว่าความซับซ้อนของมันคือ O (n) แต่ฉันคิดว่ามันเป็น O (n log n)

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

1-εO(ε)


3

ใน TCS เราจะพิจารณา - หากไม่ได้ระบุไว้เป็นอย่างอื่น - ความซับซ้อนบนเครื่องทัวริง ในขณะที่สิ่งนี้ดีสำหรับวัตถุประสงค์ทางทฤษฎีผลลัพธ์ไม่เป็นประโยชน์มากในทางปฏิบัติเนื่องจากเราใช้โมเดลเครื่องที่แตกต่างกัน (นั่นคือการประมาณแบบ จำกัด ) ในฮาร์ดแวร์ ดังนั้นจึงเป็นคำถามที่เป็นไปได้ที่จะถามถึงความซับซ้อนของโมเดลเหล่านั้น ตัวอย่างเช่นเรามักจะสมมติว่าเครื่องลงทะเบียน (คล้ายกับ CPU จริง) สามารถดำเนินการปรมาณูในการลงทะเบียนสองครั้งในเวลาคงที่ - นี่คือสิ่งที่อาจมีการใช้งานที่นี่

กล่าวโดยย่อ: คุณคิดในแง่ของ TM ผู้เขียนบทความในรูปของ RM คุณทั้งคู่ถูกต้องแล้ว

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