การแลกเปลี่ยนพื้นที่เวลาสำหรับปัญหาองค์ประกอบที่ขาดหายไป


14

นี่เป็นปัญหาที่รู้จักกันดี

รับอาร์เรย์A[1n]ของจำนวนเต็มบวกเอาท์พุทจำนวนเต็มบวกที่เล็กที่สุดที่ไม่ได้อยู่ในอาร์เรย์

ปัญหาสามารถแก้ไขได้ในพื้นที่และเวลาO(n) : อ่านอาร์เรย์ติดตามในพื้นที่ไม่ว่าจะเป็นเกิดขึ้นสแกนหาองค์ประกอบที่เล็กที่สุดO(n)1,2,,n+1

ฉันสังเกตเห็นว่าคุณสามารถแลกเปลี่ยนพื้นที่เวลา ถ้าคุณมีหน่วยความจำเท่านั้นคุณสามารถทำมันได้ในรอบและได้รับเวลา(kn) ในกรณีพิเศษมีอัลกอริทึมกำลังสอง - เวลาคงที่แน่นอนO(nk)kO(kn)

คำถามของฉันคือ:

สิ่งนี้เป็นการแลกเปลี่ยนที่ดีที่สุดหรือไม่คือ ? โดยทั่วไปแล้วเราจะพิสูจน์ขอบเขตดังกล่าวได้อย่างไรtimespace=Ω(n2)

สมมติว่ารุ่น RAM พร้อมเลขคณิตที่ จำกัด และการเข้าถึงอาร์เรย์ใน O (1) แบบสุ่ม

แรงบันดาลใจสำหรับปัญหานี้: แลกเปลี่ยนพื้นที่เวลาสำหรับ palindromes ในรูปแบบเทปเดียว (ดูตัวอย่างที่นี่ )


2
ไม่คุณสามารถจัดเรียงอาร์เรย์ของคุณในจากนั้นหาหมายเลขที่หายไป (หมายเลขแรกควรเป็น 1, ที่สองควรเป็น 2, ... มิฉะนั้นคุณจะพบมัน) ใน O (n) การเรียงลำดับนี้สามารถทำได้ กับ inplace mergesort หมายถึงO ( 1 )พื้นที่พิเศษดังนั้นเวลาพื้นที่เป็นO ( n log n ) ฉันไม่รู้ว่าฉันมีปัญหาของคุณอย่างแน่นอนหรือไม่ (ด้วยเหตุนี้ฉันไม่ตอบมันฉันก็ไม่รู้เหมือนกันว่ามีข้อผูกมัดที่ดีกว่า) O(nlogn)O(1)O(nlogn)

ฉันถือว่าอินพุตเป็นแบบอ่านอย่างเดียว (หากไม่ใช่ปัญหาสามารถแก้ไขได้อย่างเหมาะสมในพื้นที่เวลา / O ( 1 ) : ป้อนข้อมูลทวีคูณด้วย 2 และใช้พาริตีเพื่อจำลองอัลกอริทึมO ( n ) / O ( n ) )O(n)O(1)O(n)/O(n)
sdcvvc

อัลกอริทึมพื้นที่คงที่คืออะไร ดูเหมือนว่าคุณจะต้องพื้นที่สำหรับn 2รุ่นที่ "ชัดเจน" ให้ฉันlognn2
Xodarap

ในรูปแบบนี้จำนวนเต็มขนาดคำใช้ ; หากสะดวกยิ่งขึ้นคุณสามารถตอบคำถามต่าง ๆ ได้ด้วยtime space = Ω ( n 2O(1)สำหรับบางคงk timespace=Ω(n2logkn)k
sdcvvc

@sdcvvc ฉันไม่เข้าใจอัลกอริทึมคุณคุณจะอธิบายเพิ่มเติมอีกเล็กน้อยหรือไม่ (เพิ่งทราบว่าการอ่านเป็นบิตจะใช้O ( log n ) ) O(n)/O(1)O(logn)

คำตอบ:


2

สิ่งนี้สามารถทำได้ในO(nlogn)การทำงานของ word และO(1)คำของหน่วยความจำ (ตามลำดับO(nlog2n)เวลา)และO(logn)หน่วยความจำในรูปแบบ RAM ระดับบิต อันที่จริงการแก้ปัญหาจะขึ้นอยู่กับการสังเกตต่อไปนี้

พูดว่ามีเลขคี่n0และn1ตัวเลขคี่อยู่ในช่วง[1,n+1] (ดังนั้นn0n1และn0+n1=n+1 ) จากนั้นก็มีb{0,1}ซึ่งมีค่าสูงสุดnb1มี parity bในอินพุต แน่นอนมิฉะนั้นจะมีอย่างน้อยn0แม้และอย่างน้อยn1ค่าคี่ในอินพุตหมายความว่ามีอย่างน้อยn0+n1=n+1ค่าในอินพุตความขัดแย้ง (มีเพียงnของพวกเขา) หมายความว่าเราสามารถค้นหาหมายเลขที่หายไปได้เฉพาะในเลขคี่หรือเลขคู่เท่านั้น อัลกอริทึมเดียวกันสามารถนำไปใช้กับบิตที่สูงขึ้นของสัญกรณ์ไบนารีเช่นกัน

ดังนั้นอัลกอริทึมของเราจะเป็นดังนี้:

  1. สมมติว่าตอนนี้เรามีค่าxเท่านั้นในอินพุตที่มีโมดูโลเหลือ2bเท่ากับr[0,2b)แต่มีอย่างน้อยx+1หมายเลขในช่วง[1,n+1]ที่มี เศษเหลือr modulo 2b (ตอนเริ่มเรารู้ว่าแน่นอนสำหรับb=0,r=0 )

  2. สมมติว่ามีค่าx0ในอินพุตพร้อมเศษเหลือr modulo 2b+1และx1ค่าในอินพุตพร้อมเศษเหลือr+2b modulo 2b+1 (เราสามารถหาตัวเลขเหล่านี้ในการส่งผ่านครั้งเดียวผ่านอินพุต) เห็นได้ชัดว่าx0+x1=x x ยิ่งกว่านั้นเนื่องจากมีอย่างน้อยx+1ตัวเลขในอินพุตพร้อมเศษเหลือr modulo 2bอย่างน้อยหนึ่งคู่(r,b+1),(r+2b,b+1)ตอบสนองความต้องการของขั้นตอนที่ 11

  3. เราพบจำนวนที่หายไปเมื่อ2bn+1 : มีเพียงหมายเลขเดียวในช่วง[1,n+1]ที่อาจมีเศษเหลือr modulo 2b ( rถ้าอยู่ในช่วง) ดังนั้นจึงมี ค่าศูนย์ส่วนใหญ่ในอินพุตที่มีเศษเหลือ ดังนั้นrแน่นอนที่ขาดหายไป

เห็นได้ชัดว่าอัลกอริทึมหยุดในขั้นตอนO(logn)แต่ละอันนั้นต้องการเวลาO(n) (การส่งผ่านครั้งเดียวผ่านอาร์เรย์อินพุต) ยิ่งไปกว่านั้นต้องใช้หน่วยความจำO(1)คำเท่านั้น


ฉันยินดีที่จะเห็นคำถามที่ตอบหลังจากนั้น :)
sdcvvc

1

ถ้าฉันเข้าใจคำจำกัดความของคุณสิ่งนี้สามารถทำได้ในเวลาเชิงเส้นด้วยพื้นที่คงที่ เห็นได้ชัดว่านี่คือขอบเขตที่ต่ำที่สุดเนื่องจากเราต้องอ่านอินพุตทั้งหมดอย่างน้อย

คำตอบที่ให้ในคำถามนี้ตอบสนอง

เป็นไปไม่ได้ที่จะเรียกใช้งานโดยใช้เวลาหรือพื้นที่น้อยลงและการเพิ่มเวลาหรือพื้นที่เพิ่มเติมนั้นไร้ประโยชน์ดังนั้นจึงไม่มีการแลกเปลี่ยนเวลาว่างที่นี่ (สังเกตว่าดังนั้นการแลกเปลี่ยนที่คุณสังเกตเห็นจะไม่ถือ asymptotically ไม่ว่าในกรณีใด ๆ )n=O(n/k)

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

สมมติว่าภาษาบางภาษาสามารถถอดรหัสได้ในเวลา (ใช้พื้นที่จำนวนหนึ่ง) และพื้นที่s (ใช้เวลาสักครู่) เราสามารถหาf , gซึ่งLสามารถถอดรหัสได้โดยMซึ่งทำงานในเวลาf ( t , s )และพื้นที่g ( t , s ) ?tsf,gLMf(t,s)g(t,s)

ไม่เป็นที่รู้จักและคำตอบที่ดีจะแก้ปัญหาเปิดมากมาย (โดยเฉพาะอย่างยิ่งเกี่ยวกับเซาท์แคโรไลนา) ซึ่งหมายความว่าไม่มีวิธีแก้ปัญหาที่ง่าย


แก้ไข: ตกลงด้วยการทำซ้ำ (แต่ฉันยังคงสมมติว่าด้วยการป้อนขนาดจำนวนที่เป็นไปได้สูงสุดคือn + 1 )nn+1

สังเกตว่าอัลกอริทึมของเราจะต้องสามารถแยกความแตกต่างระหว่างคำตอบที่เป็นไปได้อย่างน้อยสมมติว่าในแต่ละผ่านข้อมูลที่เราจะได้รับมากที่สุดkชิ้นส่วนของข้อมูล จากนั้นเราจะต้องผ่านn / kเพื่อแยกคำตอบทั้งหมด สมมติว่าk = n / sจากนั้นเราก็วิ่งในnnkn/kk=n/sเวลา ดังนั้นฉันคิดว่านี่พิสูจน์สิ่งที่คุณต้องการnn/sn=sn

ความยากลำบากในการแสดงให้เห็นว่าในแต่ละครั้งที่เราได้รับเพียงบิต หากคุณคิดว่าการดำเนินการทางกฎหมายเพียงอย่างเดียวของเราคือ = แสดงว่าเราดี อย่างไรก็ตามหากคุณอนุญาตการดำเนินการที่ซับซ้อนมากขึ้นคุณจะสามารถรับข้อมูลเพิ่มเติมได้k


3
คำถามที่คุณเชื่อมโยงถือว่าแต่ละหมายเลขปรากฏมากที่สุดหนึ่งครั้ง ฉันไม่ได้ตั้งสมมติฐานนี้ดังนั้นจึงไม่มีวิธีแก้ปัญหา ขอบคุณสำหรับลิงค์ที่สอง
sdcvvc

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

5
ฉันไม่ซื้ออาร์กิวเมนต์ของคุณหลังจาก "แก้ไข" แม้ว่าคุณจะสามารถรวบรวมบิตได้ในการส่งครั้งเดียวก็เพียงพอแล้วในหลักการที่จะแยกเอาท์พุทที่เป็นไปได้2 k ดังนั้นเรื่องนี้เท่านั้นที่สามารถบ่งบอกถึงขีด จำกัด ล่างของn / 2 kผ่านไม่n / k k 2kn/2kn/k
JeffE
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.