418341 ภาคต้น 2552/โจทย์ปัญหาอัลกอริทึมแบบแบ่งแยกแล้วเอาชนะ
ข้อ 1
[ดัีดแปลงจาก Dasgupta, Papadimitriou, Vazirani 2.16] คุณได้รับอะเรย์ ซึ่งมีจำนวนช่องเท่ากับจำนวนของจำนวนเต็มทั้งหมด (สมาชิกของอะเรย์นี้คือ ) อะเรย์นี้มีคุณสมบัติว่าสมาชิก ตัวแรกของมันจะมีค่าเท่ากับ 0 (กล่าวคือ ) โดยที่ เป็นจำนวนเต็มหนึ่งตัว และสมาชิกที่เหลือมีค่าเท่ากับ 1 (กล่าวคือ )
คุณไม่ทราบค่า จงหาอัลกอริทึมที่หาค่า ได้ในเวลา
ข้อ 2
[Dasgupta, Papadimitriou, Vazirani 2.17] กำหนดอะเรย์ ที่มีขนาด ช่องที่เรียงจากน้อยไปหามาก นอกจากนี้เลขในอะเรย์ทุกตัวจะมีค่าไม่เท่ากัน คุณอยากจะทราบว่ามีจำนวนเต็ม ที่ทำให้ หรือไม่ จงหาอัลกอริทึมที่สามารถหาค่า ดังกล่าวมาหนึ่งค่าหรือตอบว่าไม่มีค่า ดังกล่าวเลยได้ในเวลา
ข้อ 3
[Dasgupta, Papadimitriou, Vazirani 2.19] สมมติว่าคุณมีอะเรย์ที่เรียงแล้วอยู่ อะเรย์ แต่ละอะเรย์มีสมาชิกอยู่ ตัว คุณต้องการรวมอะเรย์ทั้งหมดเป็นอะเรย์ที่เรียงแล้วขนาด ช่อง
- นี่เป็นวิธีการหนึ่งที่คุณสามารถจะทำได้ ใช้อัลกอริทีม
merge
ที่เรียนไปในชั้นเรียนทำการรวมอะเรย์สองอะเรย์แรก เสร็จแล้วเอาผลลัพธ์ไปรวมกับอะเรย์ที่สาม เสร็จแล้วเอาผลลัพธ์ไปรวมกับอะเรย์ที่สี่ เช่นนี้ไปเรื่อยๆ วิธีการนี้มีเวลาการทำงานเป็นเท่าใดในรูปของ และ ? - จงออกอัลกอริทึมที่มีประสิทธิภาพกว่านี้โดยใช้เทคนิค divide and conquer
ข้อ 4
[Dasgupta, Papadimitriou, Vazirani 2.22] กำหนดอะเรย์ ที่เรียงแล้วขนาด ช่อง และกำหนดอะเรย์ ที่เรียงแล้วขนาด ช่อง โดยที่ไม่มีจำนวนสองตัวใดๆ ในอะเรย์ทั้งสองตัวที่ซ้ำกัน จงออกแบบอัลกอริทึีมเพื่อหาสมาชิกตัวที่น้อยที่สุดเป็นอันดับที่ ของเซตของตัวเลขที่เกิดจากการนำเอาตัวเลขในอะเรย์ทั้งสองตัวมารวมกัน อัลกอริทึีมของคุณควรจะทำงานได้ในเวลา
ข้อ 5
ใำห้ และ เป็นจำนวนเต็มที่ไม่เป็นลบ จงออกแบบอัลกอริทึมเพื่อทำการคำนวณ ซึ่งทำงานได้ในเวลา โดยสมมติว่าเราสามารถคูณเลขสองตัวได้ในเวลา
ข้อ 6
เลขฟิโนนักชีมีนิยามดังต่อไปนี้
- จงพิสูจน์ว่า สำหรับจำนวนเต็มบวก ทุกจำนวน
- จงออกแบบอัลกอริืทึมเพื่อหาค่า ที่มีเวลาการทำงาน
ข้อ 7
พิจารณาปัญหาการหาลำดับย่อยที่มีผลบวกสูงสุด (ซึ่งเราเคยเรียนกันในชั้นเรียนแล้ว) ดังต่อไปนี้
กำหนดอะเรย์ ขนาด ช่อง แต่ละช่องมีจำนวนเต็มบรรจุอยู่หนึ่งตัว เราต้องการหาลำดับย่อย โดยที่ ที่ทำให้ มีค่ามากที่สุด
จงออกแบบอัลกอริทึีมเพื่อแก้ปัญหานี้ซึ่งทำงานในเวลา
ข้อ 8
[Kleinberg & Tardos 5.2] กำหนดอะเรย์ ขนาด ช่อง นิยามอินเวอร์ชันสำััคัญว่าเป็นคู่ลำดับ ที่ และ
จงออกแบบอัลกอริทึมเพื่อนับอินเวอร์ชันสำคัญในอะเรย์ อัลกอริทึมนี้ควรทำงานได้ในเวลา
ข้อ 9
[Kleinberg & Tardos 5.3] คุณให้คำปรึกษาธนาคารแห่งหนึ่งเกี่ยวกับการตรวจสอบการฉ้อโกง ขณะนี้ธนาคารมีปัญหาดังต่อไปนี้
ธนาคารได้ยึดบัตร ATM จำนวน ใบมา บัตร ATM แต่ละใบจะมีหมายเลขบัญชีธนาคารฝังอยู่ในไมโครชิป โดยบัตรหลายๆ ใบอาจมีหมายเลขบัญชีธนาคารเดียวกันก็ได้ เรากล่าวว่าบัตร ATM สองใบใดๆ จะสมมูลกันมันตรงกับบัญชีธนาคารเดียวกัน
การอ่านเลขบัญชีออกมาจากบัตร ATM เป็นเรื่องที่ทำยาก (สมมตินะครับ) แต่ธนาคารมีเครื่อง "ตรวจสอบความสมมูล" ที่คุณสามารถเอาบัตร ATM สองใบไปเสียบ แล้วมันจะบอกว่าบัตรสองใบนี้สมมูลกันหรือไม่
ธนาคารต้องการตอบคำถามต่อไปนี้: ในบัตร ใบนี้ั มีกลุ่มของบัตรที่มีจำนวนมากกว่า สักกลุ่มหรือไม่ที่บัตรทุกใบในกลุ่มนี้สมมูลกันทั้งหมด?
สมมติว่าสิ่งที่คุณทำได้คือการเลือกบัตรสองใบไปเช็คกับเครื่องตรวจสอบความสมมูลเท่านั้น จงแสดงว่าคุณสามารถตอบคำถามข้างบนของธนาคารได้ด้วยการใช้เครื่องตรวจสอบความสมมูลเพียง ครั้งเท่านั้น