ฉันต้องการเริ่มด้วยการบอกว่านี่ไม่ใช่คำถามทำการบ้าน ฉันกำลังอ่านรู้เบื้องต้นเกี่ยวกับอัลกอริทึม - ข้อความ CLRS ที่มีชื่อเสียงที่จะกลายเป็นโปรแกรมเมอร์ที่ดีขึ้น ฉันพยายามที่จะแก้ปัญหาและการออกกำลังกายที่ได้รับในหนังสือด้วยตัวเอง
ฉันพยายามที่จะแก้ปัญหาการออกกำลังกาย 10.1-2จากบทที่ 10 โครงสร้างข้อมูลพื้นฐานจาก CLRS Second Edition นี่คือสิ่งที่รัฐ:
อธิบายวิธีการใช้สองกองในหนึ่งอาร์เรย์[1..n]ในลักษณะที่ไม่สแต็คล้นเว้นแต่จำนวนรวมขององค์ประกอบทั้งในกองด้วยกันคือn การผลักดันการดำเนินงานและ POP ควรทำงานในO (1)เวลา
ทางออกที่ฉันเกิดขึ้นจนถึงตอนนี้คือ:
ให้อาร์เรย์[1..n]ใช้สองกอง: S1 [1..i]และS2 [i..n]
สำหรับการดำเนินการPUSH-S1และPUSH-S2หากสแต็ค 'เต็ม' จากนั้นเริ่มต้นการผลักองค์ประกอบเข้าสู่สแต็กอื่น ๆ (เช่นถ้าสแต็คS1เต็มเมื่อองค์ประกอบใหม่พยายามที่จะผลักดันเข้าไปแล้วผลักองค์ประกอบนั้นเข้าไป stack S2และในทางกลับกัน)
ปัญหาของวิธีนี้คือฉันจะไม่สามารถใช้POP-S1หรือPOP-S2ได้อย่างน่าเชื่อถือเนื่องจากไม่มีวิธีการ 'จดจำ' องค์ประกอบใดที่เป็นของสแต็กใด หากองค์ประกอบของสแต็กเป็นคู่(คีย์, ค่า)คีย์คือหมายเลขสแต็กจากนั้นจึงปรากฏองค์ประกอบที่ฉันจะต้องค้นหาในกรณีที่เลวร้ายที่สุดฉันหรือ (ni) ครั้ง - ซึ่งจะเป็นO (n ) (รู้สึกอิสระที่จะถูกต้องฉันหากฉันผิดที่นี่) ซึ่งจะไม่เป็นO (1)
ฉันต่อสู้กับคำถามมาระยะหนึ่งแล้ว ฉันกำลังติดตามใช่ไหม? ใครสามารถให้คำแนะนำที่เป็นไปได้สำหรับการแก้ไขปัญหานี้ได้บ้าง
โดยทั่วไปแล้วฉันควร 'คิด' เกี่ยวกับปัญหาเหล่านี้อย่างไร หรือคนที่ฉลาดจริงๆเท่านั้นที่สามารถแก้ปัญหาประเภทนี้ได้? การแก้ปัญหา / การแก้ปัญหาเช่นนี้ (เช่นได้รับประสบการณ์) จะช่วยให้ฉันดีขึ้นในเรื่องนี้หรือไม่?
ฉันรอการตรัสรู้