อัลกอริธึมการสลับแบบ 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(nlgn)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(nlogn)

ตอนนี้สำหรับโซลูชันของ 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ที่ใหม่สตริงเป็นผู้นำวงจรa1akikik=di+r(a1ai11)da1arr=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)

โปรดทราบว่าคำตอบนั้นเกี่ยวข้องกับการเปลี่ยนแปลง J2Jพอควร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(logn) 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.