สแต็กสามชุดสามารถนำไปใช้ในอาร์เรย์เดียวได้หรือไม่ด้วย O (1) เวลาพุช / ป๊อป


9

สแต็คสองชุดสามารถดำเนินการได้อย่างมีประสิทธิภาพโดยใช้อาร์เรย์ขนาดคงที่หนึ่งรายการ: สแต็ก # 1 เริ่มจากปลายด้านซ้ายและขยายไปทางขวาและสแต็ก # 2 เริ่มจากปลายด้านขวาและขยายไปทางซ้าย เหมือนกันเป็นไปได้สำหรับสามกอง?

โดยเฉพาะอย่างยิ่งมันเป็นไปได้ที่จะใช้สามกองที่มีเงื่อนไขดังต่อไปนี้:

  1. คุณมีอาร์เรย์ขนาดคงที่ที่สามารถเก็บวัตถุ N ได้
  2. ตราบใดที่ผลรวมของขนาดสแต็คทั้งสามคือ <N ดัน () ไม่ควรล้มเหลว
  3. การดำเนินการทั้ง push () และ pop () ควรใช้เวลา O (1)
  4. นอกจากอาร์เรย์แล้วคุณสามารถใช้พื้นที่เพิ่มเติม O (1) เท่านั้น

นี่คือตัวอย่างของโซลูชันที่ไม่เป็นไปตามข้อกำหนดเหล่านี้:

  • แบ่งอาร์เรย์ออกเป็น 3 ส่วนคงที่และใช้แต่ละส่วนสำหรับสแต็ก (ละเมิด 2)
  • คล้ายกับด้านบน แต่มีขอบเขตที่สามารถเคลื่อนย้ายได้ระหว่างสแต็ก (ละเมิด 3)
  • การใช้งานตามรายการที่เชื่อมโยงอย่างง่าย (ละเมิด 4)

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


1
ฉันไม่ทราบว่าคุณคิดว่านี่เป็นการละเมิดข้อกำหนด 4 หรือไม่ แต่หาก "วัตถุ" แต่ละรายการในอาร์เรย์วัตถุ N ของคุณสามารถรวมเขตข้อมูลเพิ่มเติมเช่นดัชนีจำนวนเต็มคุณสามารถใช้ "รายการที่ลิงก์" ภายในอาร์เรย์ของคุณได้ . คุณสามารถเก็บดัชนีของด้านบนของแต่ละ 3 กองโดยใช้ตัวแปรภายนอก 3 ตัวและ "วัตถุ" แต่ละตัวสามารถชี้ไปที่องค์ประกอบก่อนหน้านี้ว่าเป็นสแต็กของมัน
Avi Tal

โดย "objects" ฉันหมายถึงสิ่งที่ push () ยอมรับและ pop () กลับมา จากมุมมองของการใช้งานสแต็กพวกเขาเป็นเพียง blobs ทึบแสงของข้อมูล (ตัวอย่างเช่นวัตถุอาจเป็นจำนวนเต็ม 32 บิต) การใช้งานสแต็กไม่ควรแก้ไขวัตถุเหล่านี้ในทางใดทางหนึ่ง
user1020406

1
พิจารณาว่าคุณทำลำดับของ ยังไม่มีข้อความผลักดันการดำเนินการจากนั้นทำเฉพาะการดำเนินงานป๊อป มีปัญหาเกี่ยวกับรุ่นนี้หรือไม่?
Dmitri Urbanowicz

หากว่า O(ยังไม่มีข้อความ)ของพื้นที่เพิ่มเติมตอบสนองคุณ?
Dmitri Urbanowicz

Re: "N พุชและ N ป็อบแล้ว" เวอร์ชัน: ฉันไม่รู้ แต่การระบุว่านี่เป็นปัญหาย่อยที่น่าสนใจก็มีประโยชน์เพราะถึงแม้จะยังไม่มีความชัดเจนว่าโซลูชัน O (1) เป็นไปได้หรือไม่ ดูคำตอบของ @ Alexei และหัวข้อความคิดเห็นสำหรับขอบเขตสูงสุด ในฐานะที่เป็นO(ยังไม่มีข้อความ)ทางออกใช่ฉันจะยอมรับ ฉันใหม่ในการโพสต์คำถามใน stackexchange ดังนั้นฉันไม่แน่ใจว่าจะจัดการกับกรณีที่สามารถให้บริการโซลูชั่นที่ดีขึ้นและดีขึ้นเมื่อเวลาผ่านไป วิธีการหนึ่งที่ฉันเห็นคือรอหนึ่งวันก่อนรับคำตอบในกรณีที่มีสิ่งที่ดีกว่าถูกโพสต์ดังนั้นฉันจะทำเช่นนั้น
user1020406

คำตอบ:


6

Fredman และช่างทองได้แสดงไว้ใน "Three Stacks" (Journal of Algorithms, 1994) ว่า Θ(nε)บิตของพื้นที่ที่สูญเปล่าสามารถทำได้ นอกจากนี้ยังเป็นขั้นต่ำที่จำเป็นสำหรับอาร์เรย์ที่มีขนาดอย่างน้อย 16 quattuordecillion yottabytes ฉันอธิบายอัลกอริทึมเสียง่ายΘ(n) คำของช่องว่างในStackOverflow ของฉันตอบคำถามนี้ ดังที่ @ dmitri-urbanowicz พูดถึงในความคิดเห็นนี่เป็นเพียงแค่การรักษาอาร์เรย์เป็นn บล็อกของขนาด nซึ่งแต่ละบล็อกจะใช้สำหรับสแต็กเดียวเท่านั้นและมีตัวชี้เดียวกับบล็อกถัดไปในสแต็กนั้น


0

ให้ N เป็นความยาวของอาเรย์พื้นฐาน ฉันสามารถนึกภาพกองเป็นรายการที่เชื่อมโยงของชิ้นใหญ่ดังนั้นจำนวนชิ้นโดยรวมไม่เกิน O (log2 (N)) วางสแต็กที่สามระหว่างสองครั้งแรกที่ดัชนีของ N / 2 เรามีพื้นที่ว่าง 3 แห่งและฟรี 2 แห่ง เมื่อสแต็กไม่สามารถยอมรับองค์ประกอบถัดไปได้หมายความว่าพื้นที่ว่างหนึ่งอันหมดไป ถ้าอื่น ๆ หมดเช่นกันแล้วหน่วยความจำทั้งหมดจะหมด มิฉะนั้นจะมีพื้นที่ว่างอื่นที่มีขนาดไม่เกิน N / 2 ดำเนินการต่อสแต็กที่โอเวอร์โฟลว์ไปยังพื้นที่ว่าง เพื่อให้การกำหนดค่าทั้งหมดคล้ายกับเค้าโครงเริ่มต้นของสแต็ค เนื่องจากหน่วยความจำที่ว่างในตอนนี้ไม่เกินครึ่งแรกของการเริ่มต้นจะมีไม่เกิน log2 (N) ของการดำเนินการเชื่อมโยงดังกล่าว การดำเนินการเชื่อมโยงแต่ละครั้งต้องใช้หน่วยความจำคงที่เพื่อบันทึกสถานะก่อนหน้าของสแต็ก ดังนั้น,


1
คุณรีไซเคิลหน่วยความจำที่ได้รับโดยการดึงสิ่งต่าง ๆ จากหนึ่งในก้อนใหญ่ได้อย่างไร
Emil Jeřábek

คำถามที่ดี. คำตอบอย่างรวดเร็วคือก้อนที่กลายเป็นอิสระจะส่งคืนหน่วยความจำของมันไปยังพื้นที่ว่างที่ถูกนำมาจากก่อนหน้านี้ แต่ถ้าพื้นที่ว่างลดลงตั้งแต่เวลาของหน่วยความจำการจัดสรรสำหรับก้อนนั้นและตอนนี้ก้อนไม่ติดกับมัน สิ่งนี้นำไปสู่การกระจายตัวของหน่วยความจำฟรีอาจมีพื้นที่ว่างมากกว่า 2 แห่งซึ่งทำลายสิ่งก่อสร้างทั้งหมดของฉัน
Alexei Kaigorodov

การขุดเป็นปัญหาที่นี่ แต่การก่อสร้างของ Alexei ให้ขอบเขตที่ดีสำหรับรุ่นของปัญหาที่ Dmitri ถามในความคิดเห็น: ถ้าเราต้องการให้ทุกอย่างเกิดขึ้นก่อนที่จะปรากฏ ฉันสงสัยว่ามีอะไรดีไปกว่า O (log N) ในกรณีนี้หรือไม่
user1020406
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.