แทรกลงในรายการอย่างมีประสิทธิภาพทำให้จำนวนผู้ลงโฆษณาน้อยที่สุด


15

สมมติว่ามีรายการที่เปรียบเทียบได้สองรายการ: u และ s ให้ INV (u) เป็นจำนวนผู้รุกรานใน u

ฉันกำลังมองหาอัลกอริทึมที่มีประสิทธิภาพเพื่อแทรกรายการของ s ลงใน u ด้วยการเพิ่มขึ้นเล็กน้อยของ INV (u)

โดยทั่วไปฉันต้องการแทรกวัตถุลงในรายการในขณะที่รักษา "เรียงเป็นที่สุด" ในขณะที่รักษาลำดับของรายการแรก

ตัวอย่าง:

u = [4,6,2,9,7]
INV(u) = 3 ((4, 2), (6, 2) and (9, 7)

s = [8,3,10]

one optimal solution u' = [3, 4, 6, 2, 8, 9, 7, 10]
INV(u') = 5 ((4, 2), (7, 2) and (9, 7) + (3,2), (8,7))

different optimal solution u' = [3, 4, 6, 2, 9, 7, 8, 10]
INV(u') = 5 ((4, 2), (7, 2) and (9, 7) + (3,2), (9,8))

อย่างที่คุณเห็นว่าไม่มีทางออกที่ดีที่สุดที่ไม่เหมือนใคร

ฉันยินดีที่จะมีแนวคิดหรือทิศทางใด ๆ ที่จะพิจารณา


อาหารสำหรับความคิด: แนวทางไร้เดียงสาคือ: นำองค์ประกอบหนึ่งจาก s เปรียบเทียบกับแต่ละองค์ประกอบใน u จากซ้ายไปขวาเพิ่มขึ้นหากเป็นการกลับกันและมีจำนวนที่คำนวณไว้ก่อนหน้านี้ จากนั้นสำรวจรายการจากขวาไปซ้ายด้วยองค์ประกอบเดียวกันเพิ่มจำนวนสำหรับแต่ละตำแหน่ง สิ่งนี้จะทำงานใน O (| s | * | u |) พร้อมช่องว่าง = O (| u |)
trevore

1
การตรวจสอบส่วนประกอบที่เพิ่มขึ้นสูงสุดทั้งหมดอาจนำไปสู่ที่ไหนสักแห่ง
Raphael

คำตอบ:


2

นี่คือรายละเอียดเกี่ยวกับคำตอบของ Trevore มันยาวเกินไปที่จะใส่ความคิดเห็นและมีหลักฐานการแก้ปัญหาของเขา (หรืออย่างน้อยฉันก็เข้าใจ)

คุณสามารถแสดงให้เห็นว่าในการแก้ปัญหาที่ดีที่สุดองค์ประกอบของจะปรากฏขึ้นสั่ง sหากไม่มีให้ถือว่าและปรากฏในลำดับย้อนกลับในวิธีที่เหมาะสมที่สุด ให้σ 1เป็นจำนวนองค์ประกอบระหว่างs 1 σ 2s1<s2σ1s1และที่น้อยกว่าs 1และβ 1เป็นจำนวนของผู้ที่มีขนาดใหญ่กว่าs 1 กำหนดσ 2และเบต้า2ในทำนองเดียวกันสำหรับs 2 โปรดทราบว่าσ 1s2s1β1s1σ2β2s2σ1σ2และ 1 การสลับs 1และs 2จะเปลี่ยนจำนวนผู้รุกรานด้วย- β 1 + β 2 - σ 2 + σ 1 - 1ซึ่งมากที่สุด -1β2β1s1s2-β1+β2-σ2+σ1-1

ไม่ยากที่จะเห็นว่าองค์ประกอบของสามารถแทรกได้อย่างอิสระ sเมื่อปรากฏคำสั่งองค์ประกอบของจะไม่ "รู้สึก" ต่อหน้ากันและกัน นั่นคือคู่ขององค์ประกอบจากsไม่ได้มีส่วนช่วยในการนับถอยหลัง ในการทำเช่นนั้นให้แทรกค่ามัธยฐานของsอย่างเหมาะสมในเวลาเชิงเส้น จากนั้นซ้ำองค์ประกอบแทรกsน้อยกว่าค่ามัธยฐานไปทางซ้ายของค่ามัธยฐานและองค์ประกอบที่มีขนาดใหญ่กว่าค่ามัธยฐานไปทางขวาของมันssss

ปล่อยให้ค่ามัธยฐานถูกแทรกในตำแหน่ง , ไทม์ของสมการนี้, T ( | s | , | u | ) = T ( | s | / 2 , |ปัจจัยคือการหาค่ามัธยฐานและสับองค์ประกอบของsมันคือ ง่ายต่อการแสดงโดยอุปนัยที่T ( | sk, การเชิงเส้น | s |T(|s|,|ยู|)=T(|s|/2,|ยู|-k)+T(|s|/2,k)+|ยู|+|s||s|sT(|s|,|ยู|)=O(|s|เข้าสู่ระบบ|s|+|ยู|เข้าสู่ระบบ|s|)

|s|ยูs|ยู|sยู


ขอบคุณที่ให้รายละเอียด นั่นคือทางออกที่ฉันหมายถึงอย่างแน่นอน
คืน

1

ตกลงนี่คือทางออกของฉัน:

ข้อสังเกต (ซึ่งฉันพิสูจน์แล้วมากหรือน้อย) คือคำตอบที่ดีที่สุดจะเป็นคำตอบที่เรียงลำดับจากน้อยไปมากเสมอ สิ่งนี้ก่อให้เกิดอัลกอริทึม O ((| u | + | s |) * อัลกอริทึม (| s |))

ในการหาคำตอบที่ดีที่สุดสำหรับองค์ประกอบเดียวให้ทำตามที่ฉันพูดในความคิดเห็นของฉัน: นำองค์ประกอบหนึ่งจาก s เปรียบเทียบกับแต่ละองค์ประกอบใน u จากซ้ายไปขวาการเพิ่มตัวนับเป็นตัวผกผันและนำจำนวนที่คำนวณมาก่อนหน้า จากนั้นสำรวจรายการจากขวาไปซ้ายด้วยองค์ประกอบเดียวกันเพิ่มจำนวนสำหรับแต่ละตำแหน่ง

นี่คือ O (| u |)

จัดเรียง

สำหรับองค์ประกอบกลางของ s ที่ตำแหน่ง m: ค้นหาตำแหน่ง b ที่ดีที่สุดใน u (ใช้วิธีการจากด้านบน)

แยก s ที่ m และ u ที่ b แล้วโทรซ้ำด้วยส่วนซ้ายและขวาซ้ำกันเชื่อมผลลัพธ์กับ m ในลำดับที่ถูกต้อง

หยุดทันทีที่คุณว่างเปล่า


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

ใช่ แต่ในทางออกที่ดีที่สุดองค์ประกอบของ s จะจบลงด้วยการเรียงลำดับจากน้อยไปมากในอาร์เรย์ใหม่ สังเกตขั้นตอน "เรียง s" ดูตัวอย่างด้านบน สิ่งที่ฉันพิสูจน์แล้วก็คือ: สำหรับ a, b ใน s, a <b หาก a ถูกวางไว้อย่างเหมาะสมที่สุดใน u แล้วสถานที่ที่ดีที่สุดสำหรับ b คือด้านขวาของ a
เพิ่ม
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.