อัลกอริธึมการสลับแบบ riffle แบบเชิงเวลา


15

มีเวลาเชิงเส้นในสถานที่อัลกอริทึมสับเปลี่ยน riffle หรือไม่? นี่คืออัลกอริธึมที่บางคนมีมือที่คล่องแคล่วโดยเฉพาะอย่างยิ่งมีความสามารถในการดำเนินการ: แบ่งเท่า ๆ กันอาร์เรย์อินพุตขนาดที่เท่ากันแล้ว interleaving องค์ประกอบของทั้งสองแบ่งเท่า ๆ กัน

Mathworld มีหน้าสั้น ๆ เกี่ยวกับการสับเปลี่ยนระลอกคลื่นน้อย โดยเฉพาะอย่างยิ่งผมสนใจในความหลากหลายออกสับเปลี่ยนที่แปลงการป้อนข้อมูลอาร์เรย์ 1 2 3 4 5 6 ลง 1 4 2 3 5 6 ทราบว่าในความหมายของพวกเขา, ความยาวใส่เป็น2n n

มันตรงไปตรงมาที่จะแสดงในเวลาเชิงเส้นถ้าเรามีขนาดที่สองเป็นอาร์เรย์nหรือมีประโยชน์มากกว่า ก่อนอื่นให้คัดลอกองค์ประกอบสุดท้ายnไปยังอาร์เรย์ แล้วสมมติว่าการจัดทำดัชนี 0-based คัดลอกแรกnองค์ประกอบจากดัชนี[0,1,2,...,n-1]เพื่อ[0,2,4,...,2n-2] ] จากนั้นคัดลอกnองค์ประกอบจากอาร์เรย์หลังที่สองไปยังอาร์เรย์ป้อนข้อมูลดัชนีการทำแผนที่[0,1,2,...,n-1]ไป[1,3,5,...,2n-1] ] (เราสามารถทำงานได้น้อยกว่านั้นเล็กน้อยเพราะองค์ประกอบแรกและองค์ประกอบสุดท้ายในอินพุตไม่ย้าย)

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

σ=(012345024135)=(0)(5)(1243).

ตามที่คาดไว้องค์ประกอบแรกและสุดท้ายเป็นคะแนนคงที่และถ้าเราอนุญาตองค์ประกอบกลาง 4 เราได้รับผลลัพธ์ที่คาดหวัง

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

แหล่งข้อมูลที่ดีเกี่ยวกับคณิตศาสตร์ที่เกี่ยวข้องมีค่าเท่ากับอัลกอริทึม ขอบคุณ!


มีวิธีแก้ไขปัญหาเวลา (ด้วยพื้นที่เพิ่มเติมO ( 1 ) ) ฉันไม่รู้จักวิธีแก้ปัญหาแบบเชิงเส้นใด ๆ O(nlg⁡n)O(1)
— Radu GRIGore

4
เหมาะสมกว่าสำหรับ cs.stackexchange ในโมเดลที่ไม่เหมือนกันสามารถใช้ครั้งได้เสมอ ในกรณีนี้ควรเป็นไปได้อย่างสม่ำเสมอ O(n)
— Yuval Filmus

1
@Radu คล้ายกับคำถามนี้ปัญหานี้อาจจะไม่ได้มีการแก้ปัญหาโดยใช้เพียงพื้นที่พิเศษ แต่O ( บันทึกn )พื้นที่พิเศษ O(1)O(เข้าสู่ระบบ⁡n)
— Tyson Williams

2
ฉันใช้ความคิดเห็นของฉัน (และลงคะแนนเพื่อปิด) กลับมาแล้ว! (แม้ว่าคำถามจะได้รับคำตอบในวรรณคดี)
— Yuval Filmus

1
ฉันได้ยินคำถามนี้จากนักเรียน CS เมื่อสัปดาห์ที่แล้วที่ได้ยินในการสัมภาษณ์งาน
— Jeffε

คำตอบ:


12

ปัญหาไม่น่าแปลกใจเลย นี่คือทางออกที่ดีโดย Ellis และ Markov, In-Situ, Stable Merging โดย Perfect Shuffle (ตอนที่ 7) Ellis, Krahn และ Fan, การคำนวณรอบในการสลับสับเปลี่ยนที่สมบูรณ์แบบประสบความสำเร็จในการเลือก "ผู้นำวง" โดยเสียค่าใช้จ่ายของหน่วยความจำมากขึ้น ที่เกี่ยวข้องยังเป็นกระดาษที่ดีโดย Fich, Munro และ Poblete, Permuting In Placeซึ่งให้อัลกอริทึมเวลาสำหรับแบบจำลอง oracle หากมีเพียง oracle สำหรับการเปลี่ยนแปลงเท่านั้นขั้นตอนวิธีนั้นต้องการพื้นที่ลอการิทึม ถ้าเรามี oracle สำหรับค่าผกผันมันก็ต้องการพื้นที่คงที่O(nlog⁡n)

ตอนนี้สำหรับโซลูชันของ Ellis และ Markov ครั้งแรกคิดว่า y ที่ จากนั้นคำนวณการสลับคำสั่งที่สมบูรณ์แบบnลดการคำนวณการสลับคำสั่งที่สมบูรณ์แบบxและyด้วยการหมุนก่อนหน้าพวกเขา นี่คือข้อพิสูจน์โดยตัวอย่าง ( n = 5 , x = 3 , y = 2 ): 012 345 67 89 012 567 34 89 051627 3849n=x+ynxyn=5x=3y=2

012345678901256734890516273849

Ellis และ Markov พบวิธีที่ง่ายในการคำนวณการสลับที่สมบูรณ์แบบเมื่อโดยใช้พื้นที่คงที่และเวลาเชิงเส้น ใช้นี้เราได้รับอัลกอริทึมสำหรับการคำนวณที่สมบูรณ์แบบสำหรับการสับเปลี่ยนพลn ก่อนเขียนn = 2 k 0 + ⋯ + 2 k Wโดยใช้การเข้ารหัสแบบไบนารีของnและให้n ฉัน = 2 k ฉัน + ⋯ + 2 k W หมุนตรงกลางnบิต0 , สับเปลี่ยนมือขวา2 kn=2knn=2k0+⋯+2kwnni=2ki+⋯+2kwn0บิต ให้ข้ามไปทางขวา2 k 0บิตหมุนตรงกลางn1บิตแล้วสุ่มทางขวา2 k 1บิต และอื่น ๆ โปรดทราบว่าการหมุนนั้นง่ายเนื่องจากองค์ประกอบสองสามตัวแรกที่หมุนหน้าที่เป็นผู้นำวง ความซับซ้อนของการหมุนรวมเป็นO(n0+⋯+nW)=O(n)ตั้งแต่n T + 1 <nT/2 ความซับซ้อนทั้งหมดของสับภายในคือO(2k02k0n12k1O(n0+⋯+nw)=O(n)nt+1<nt/2 )O(2k0+⋯+2kw)=O(n)

มันยังคงแสดงให้เห็นว่าการคำนวณสับเปลี่ยนที่สมบูรณ์แบบเมื่อ k ในความเป็นจริงเราจะสามารถระบุผู้นำวง, ติดตามงานคลาสสิกบนสร้อยคอ (Fredricksen และ Maiorana, สร้อยคอของลูกปัดในkสีและลำดับk -ary de Bruijn Fredricksen และ Kessler, อัลกอริทึมสำหรับการสร้างสร้อยคอลูกปัดในสองสี )n=2kkk

การเชื่อมต่อคืออะไร? ฉันอ้างว่าการสับเปลี่ยนสับเปลี่ยนเป็นไปตามการเลื่อนที่ถูกต้องของการเป็นตัวแทนไบนารี นี่คือตัวอย่างที่พิสูจน์ได้สำหรับ : 000 001 010 011 100 101 110 111 000 100 001 101 010 110 011 111 ดังนั้นเพื่อหาผู้นำวงเราต้องหาตัวแทนหนึ่งคนจากแต่ละชั้นเทียบเท่าของการหมุนของ สตริงไบนารีของความยาวk เอกสารดังกล่าวข้างต้นให้อัลกอริทึมต่อไปนี้สำหรับการสร้างผู้นำวงจรทั้งหมด เริ่มต้นด้วย0 kn=8

000001010011100101110111000100001101010110011111
k0k. ในแต่ละขั้นตอนเราอยู่ในบางจุด1 ... k ค้นหาดัชนีสูงสุดฉันของศูนย์บิตแบ่งkโดยที่ฉันจะได้รับk = d ⋅ ฉัน+ Rและให้จุดต่อไปนี้เป็น( 1 ... ฉัน- 1 1 ) วันที่1 ... R เมื่อใดก็ตามที่R = 0ที่ใหม่สตริงเป็นผู้นำวงจรa1…akikik=d⋅i+r(a1…ai−11)da1…arr=0

ตัวอย่างเช่นเมื่อนี้สร้างลำดับที่ 0000 , 0001 , 0010 , 0011 , 0101 , 0110 , 0111 , 1111n=16

0000,0001,0010,0011,0101,0110,0111,1111.

ผู้นำวงจรจะถูกเน้น


3
2323k30,…,3k

แม้ว่าฉันจะคิดว่ากระดาษของ Jain ตรงไปตรงมามากกว่า แต่ฉันชอบกระดาษก่อนหน้ามากกว่าบทความก่อนหน้าที่มีคะแนนโหวตมากที่สุด
— Johny

6

นี่เป็นคำถามเริ่มต้นที่ cs.stackexchange.com และคำตอบอยู่ที่นี่: /cs/332/in-place-algorithm-for-interleaving-an-array/400#400

มันคือคำอธิบายของกระดาษ: http://arxiv.org/abs/0805.1598

อัลกอริทึมดังกล่าวข้างต้นทั่วไปสำหรับทุกคน k2k32k=2)

โปรดทราบว่าคำตอบนั้นเกี่ยวข้องกับการเปลี่ยนแปลง J→2Jพอควร2n+1(เช่น Inshuffle) และการมีที่ทำให้ง่ายต่อการแก้ไขปัญหานี้ (Outshuffle) ด้วย


ฮา! ฉันลืมคำถามนั้นอย่างสมบูรณ์แม้ว่าฉันจะเข้าร่วมการสนทนาก็ตาม นี่หมายความว่าฉันไม่เข้าใจจริงๆว่ามันทำงานอย่างไรในเวลานั้น
— Radu GRIGore

2

จะเกิดอะไรขึ้นถ้าคุณจด riffle shuffle เป็นฟังก์ชัน? ถ้าม. คือความยาวของอาเรย์ทั้งหมดที่อนุญาต n=ม.-2เป็นความยาวของอาร์เรย์หลังจากลบองค์ประกอบแรกและองค์ประกอบสุดท้าย จากนั้นดัชนีสับของดัชนีผม คือ ฉ(ผม)=2⋅ผม ถ้า ผม≤n/2 และ f(i)=2⋅(imodn/2)−1 if i>n/2. Then you can just "pointer jump" through the array, swapping by re-applying the function.

Assuming random access, this would be linear time while requiring O(1) extra words (for storing the value of the array at any given index), and so O(log⁡n) extra space.


Ah, wait. This assumes that all of the values in the riffle permutation lie on the same cycle. This strategy would have to be modified a bit, depending on how many disjoint cycles there are.
— Robert Robere
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.