ความซับซ้อนของการใช้การเรียงสับเปลี่ยนในสถานที่


27

ด้วยความประหลาดใจของฉันฉันไม่สามารถหาเอกสารเกี่ยวกับเรื่องนี้ - อาจค้นหาคำหลักที่ผิด

ดังนั้นเรามีอะไรหลายอย่างและฟังก์ชั่นในดัชนีของมัน fคือการเรียงสับเปลี่ยนff

เราจะจัดลำดับอาร์เรย์ใหม่ตามด้วยหน่วยความจำและ runtime ใกล้เคียงกับO ( 1 )และO ( n )มากที่สุดเท่าที่เป็นไปได้หรือไม่fO(1)O(n)

มีเงื่อนไขเพิ่มเติมหรือไม่เมื่องานนี้ง่ายขึ้น? เช่นเมื่อเรารู้อย่างชัดเจนว่าฟังก์ชันเป็นค่าผกผันของf ?gf

ฉันรู้ว่าอัลกอริทึมที่ติดตามวัฏจักรและลัดวงจรสำหรับแต่ละดัชนีเพื่อตรวจสอบว่ามันน้อยที่สุดในวัฏจักรของมันหรือไม่ แต่อีกครั้งมันมีช่วงเวลาที่เลวร้ายที่สุดแม้ว่าโดยเฉลี่ยดูเหมือนว่าจะทำงานได้ดีขึ้น ..O(n2)


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

23
Fich และคณะ 1995 : เวลาO ( บันทึกn )พื้นที่ นอกจากนี้ยังกล่าวถึงกรณีพิเศษบางอย่าง O(nเข้าสู่ระบบn)O(เข้าสู่ระบบn)
Jukka Suomela

ใช่ฉันกำลังสมมติว่าเรามีคำพยากรณ์
jkff

3
@JukkaSuomela คุณควรทำมันให้เป็นคำตอบ นอกจากนี้เมื่อพิจารณาว่าเป็นการเปลี่ยนรูปแบบโดยพลการอาร์กิวเมนต์เอนโทรปีอย่างง่ายจะให้พื้นที่O ( n log n )และ / หรือเวลาดังนั้นฉันจะแปลกใจถ้าคุณสามารถทำได้ดีกว่าO ( n log n )ในเวลาและสถานที่ O(nเข้าสู่ระบบn)O(nเข้าสู่ระบบn)
user834

คำตอบ:


4

ตัวเลือกที่ 0: อนุญาตให้ใช้งานในสถานที่ (1995) โดย Faith E. Fich, J. Ian Munro, Patricio V. Poblete เวลาO ( log 2 n )พื้นที่O(nlogn)O(log2n)

ตัวเลือกที่ 1: โกงโดยการบีบอัดการเปลี่ยนแปลงของคุณไปยังโครงสร้างข้อมูลรวบรัดดูมันโร http://www.itu.dk/people/ssrao/icalp03-a.pdf

ตัวเลือกที่ 2: ใช้การสลายตัวแบบไพรม์รอบเพื่อเก็บใบอนุญาตอย่างรัดกุมและใช้พื้นที่พิเศษนั้นเพื่อโกงhttp://oeis.org/A186202

ตัวเลือก 3: ติดตามดัชนีที่ใหญ่ที่สุดของแต่ละรอบที่จัดการ สำหรับการวนซ้ำแต่ละครั้งให้ใช้ดัชนีที่มองไม่เห็นที่ใหญ่ที่สุดเพื่อย้ายทุกอย่างในวัฏจักรของมันทีละหนึ่ง ถ้ามันกระทบกับดัชนีที่เห็นจะยกเลิกการทำงานทั้งหมดเพราะวงจรได้รับการจัดการแล้ว เวลาO ( # รอบ* บันทึกn )พื้นที่O(n2)O(#cycleslogn)

ตัวเลือก 4: ติดตามดัชนีที่ใหญ่ที่สุดของแต่ละรอบที่มีการจัดการ แต่จะทำเฉพาะในกลุ่มของความยาวรอบที่แตกต่างกัน สำหรับการวนซ้ำแต่ละครั้งให้ใช้ดัชนีที่มองไม่เห็นที่ใหญ่ที่สุดเพื่อย้ายทุกอย่างในรอบนั้นทีละรายการ หากมันกระทบกับดัชนีที่เห็นว่ายกเลิกการทำงานทั้งหมดเพราะวงจรนั้นได้รับการจัดการแล้ว เวลาO ( ( # รอบ_ กับ_ เดียวกัน_ ขนาด) * บันทึกn )พื้นที่O(n2distinct_cycle_lengths)O((#cycles_with_same_size)logn)

ตัวเลือกที่ 5: จากกระดาษเดียวกันโดยมันโรเป็นตัวเลือกที่ 0, สำหรับหมุนรอบของp ( i )ถ้าiเป็นดัชนีที่ใหญ่ที่สุดในรอบนั้น O ( n 2 )เวลาและO ( บันทึกn )พื้นที่i=1..np(i)iO(n2)O(logn)


nเข้าสู่ระบบn

# 5 ใช้พื้นที่น้อยกว่า # 0 โดยปัจจัยบันทึก (n)
ชาด Brewbaker

1

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


2
jkff บอกว่าเขารู้อัลกอริธึมที่ติดตามวัฏจักรดังนั้นเขาจึงต้องการให้การเปลี่ยนแปลงนั้นเป็นกล่องดำ (ใกล้) ในขณะที่เขาชี้ให้เห็นในคำถามการแปลงจากกล่องดำ (เกือบ) เป็นวงจรแทนอาจใช้เวลา O (n ^ 2)
Joshua Grochow

กล่องดำ p (i) ใช้ได้ คุณไปวนรอบจนกว่าคุณจะกลับมาที่ i ปัญหาคือหนึ่งในความซับซ้อนของ Kolomogorov ในการจัดเก็บรายการที่ได้รับการอัปเดตดังนั้นคุณจึงไม่วนรอบหลาย ๆ ครั้ง มันโรมีขอบเขตอยู่บนนั้น itu.dk/people/ssrao/icalp03-a.pdf
Chad Brewbaker

-2

การเปลี่ยนรูปของ N รายการใด ๆ สามารถเปลี่ยนเป็นการเปลี่ยนรูปแบบอื่น ๆ โดยใช้ N-1 หรือแลกเปลี่ยนน้อยกว่า กรณีที่แย่ที่สุดสำหรับวิธีนี้อาจต้องใช้การโทร O (n ^ 2) ไปที่ oracle ของคุณ, F () เริ่มจากตำแหน่งที่น้อยที่สุด ให้ x เป็นตำแหน่งที่เราแลกเปลี่ยนอยู่ในขณะนี้

ถ้า F (x)> = x ให้สลับตำแหน่ง x และ F (x) อื่นเราต้องค้นหาว่ารายการที่อยู่ในตำแหน่ง F (x) อยู่ในรายการในขณะนี้ เราสามารถทำได้ด้วยการทำซ้ำต่อไปนี้ ให้ y = F (x) ทำจนกระทั่ง y> = x: y = F (y): End Do ตอนนี้แลกเปลี่ยนตำแหน่ง x และ y


3
O(n2)

ขอโทษ ฉันยังใหม่กับกลุ่มนี้ ฉันชอบวิธีนี้เพราะความเรียบง่าย บางครั้งฉันพบความเรียบง่ายเร็วกว่าประสิทธิภาพ ฉันรู้วิธีอื่นที่ต้องใช้ขั้นตอน O (n) แต่มีพื้นที่ O (nlogn)
รัสเซลอีสเตอร์

1
รัสเซลแม้กระทั่งการจัดสรรและเป็นศูนย์พื้นที่ O (n log n) ก็มีอยู่แล้ว O (n log n) คุณหมายถึงในทิศทางอื่นหรือไม่?
jkff

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

1
แต่ทำไมคุณถึงบอกว่ามันต้องใช้พื้นที่ O (n log n)?
jkff

-2

วิธีนี้ใช้ค่าผกผันของ F และต้องการหน่วยเก็บข้อมูล n บิต หาก x คือตำแหน่งของรายการในอาร์เรย์เดิมให้ G (x) เป็นตำแหน่งของรายการในอาร์เรย์ที่เรียงลำดับ ให้ B เป็นอาร์เรย์ n บิต ตั้งค่าบิตทั้งหมดของ B เป็น 0

สำหรับ x = 1 ถึง n-1: ถ้า B (x) == 0 แล้ว: y = G (x): ทำจนกระทั่ง x == y: สลับตำแหน่ง x และ y: B (y) = 1: y = G ( y): LOOP: ENDIF: NEXT X

วิธีนี้จะทำการแลกเปลี่ยนไอเท็มในตำแหน่ง x ไปยังตำแหน่งสุดท้ายของไอเท็ม ลูปด้านในจะสิ้นสุดลงเมื่อรายการที่ถูกต้องถูกเปลี่ยนเป็นตำแหน่ง x เนื่องจากการสลับแต่ละครั้งย้ายอย่างน้อยหนึ่งไอเท็มไปยังตำแหน่งสุดท้ายของไอเท็มวนรอบ Do Do จะไม่สามารถ excute มากกว่า n-1 ครั้งในระหว่างการรัน ฉันคิดว่าวิธีนี้เป็นเวลา O (n) และพื้นที่


2
คุณดูกระดาษไหม? อัลกอริธึมสองรายการที่คุณระบุไว้ที่นี่เป็นสองรายการที่ "ชัดเจน" กระดาษมีความชัดเจนน้อยกว่าซึ่งมีการแลกเปลี่ยนเวลาในพื้นที่ต่างกันโดยเฉพาะในพื้นที่ที่น้อยกว่ามาก
Yuval Filmus
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.