วิธีการเพิ่ม


9

ฉันเห็นปัญหาอัลกอริทึมมากมายที่มักจะลดสิ่งต่อไปนี้เป็นแนวยาว:

คุณมีอาร์เรย์จำนวนเต็มh[1..n]0คุณต้องไปหา i,j อย่างนั้น (h[j]h[i])(ji) ใน O(n) เวลา.

เห็นได้ชัดว่า O(n2) การแก้ปัญหาเวลาคือการพิจารณาทุกคู่อย่างไรก็ตามมีวิธีที่เราสามารถเพิ่มการแสดงออก O(n) โดยไม่ทราบอย่างอื่นเกี่ยวกับคุณสมบัติของ h?

หนึ่งความคิดที่ฉันคิดคือการแก้ไข jจากนั้นเราต้องค้นหา i จาก 1 ถึง j1 นั่นเท่ากับ argmaxi{(h[j]h[i])(ji)} หรือ argmaxi{h[j]jh[j]ih[i]j+h[i]i} และตั้งแต่ j ได้รับการแก้ไขแล้วเราต้องการ argmaxi{h[j]ijh[i]+ih[i]}.

อย่างไรก็ตามฉันไม่เห็นวิธีที่จะกำจัด jเงื่อนไขที่ขึ้นอยู่กับภายใน ความช่วยเหลือใด ๆ


จะ O(nlogn)วิธีแก้ปัญหาจะเป็นประโยชน์?
xskxzr

@xskxzr แน่ใจว่าคุณมี
AspiringMat

คำตอบ:


5

นี่คือ O(nlogn)สารละลาย. O(n)ทางออกที่ชี้ให้เห็นโดย Willard Zhanต่อท้ายคำตอบสุดท้ายนี้


O(nlogn) สารละลาย

เพื่อความมั่นใจแสดงว่า f(i,j)=(h[j]h[i])(ji).

กำหนด l1=1และ li เป็นดัชนีที่เล็กที่สุดเช่นนั้น li>li1 และ h[li]<h[li1]. ในทำนองเดียวกันกำหนดr1=nและ ri เป็นดัชนีที่ใหญ่ที่สุดเช่นนั้น ri<ri1 และ h[ri]>h[ri1]. ลำดับl1,l2,... และ r1,r2, ง่ายต่อการคำนวณ O(n) เวลา.

กรณีที่ไม่มี i<j ดังนั้น h[i]<h[j] (เช่น f(i,j)>0) เป็นเรื่องเล็กน้อย ตอนนี้เรามุ่งเน้นกรณีที่ไม่สำคัญ ในกรณีเช่นนี้เพื่อหาคำตอบเราต้องพิจารณาคู่เหล่านั้นเท่านั้น

แต่ละ i<j ดังนั้น h[i]<h[j], ปล่อย u เป็นดัชนีที่ใหญ่ที่สุดเช่นนั้น luiและ v เป็นดัชนีที่เล็กที่สุดเช่นนั้น rvjจากนั้น h[lu]h[i] (มิฉะนั้น lu+1i โดยนิยามของ lu+1จึงขัดแย้งกับคำจำกัดความของ u) และในทำนองเดียวกัน h[rv]h[j]. ด้วยเหตุนี้

(h[rv]h[lu])(rvlu)(h[j]h[i])(rvlu)(h[j]h[i])(ji).
ซึ่งหมายความว่าเราต้องพิจารณาคู่เท่านั้น (lu,rv) ที่ไหน lu<rv.

แสดงว่า v(u)=argmaxv: lu<rvf(lu,rv)เรามีบทแทรกดังต่อไปนี้

คู่โดยที่และตำแหน่งที่มีเช่นนั้นและหรือว่าและไม่สามารถเป็นคำตอบสุดท้ายที่เหมาะสม(lu,rv)lu<rvu0u<u0v<v(u0)u>u0v>v(u0)

พิสูจน์ ตามคำจำกัดความของเรามี หรือ v(u0)

(h[rv(u0)]h[lu0])(rv(u0)lu0)(h[rv]h[lu0])(rvlu0),
(h[rv]h[rv(u0)])lu0+h[lu0](rvrv(u0))+h[rv(u0)]rv(u0)h[rv]rv(u0)0.

ในกรณีที่และให้สังเกตและและยังและเรามี u<u0v<v(u0)h[rv]h[rv(u0)]<0rvrv(u0)>0lu<lu0h[lu]>h[lu0]

(h[rv]h[rv(u0)])lu+h[lu](rvrv(u0))> (h[rv]h[rv(u0)])lu0+h[lu0](rvrv(u0)).

ซึ่งหมายความว่า หรือ

(h[rv]h[rv(u0)])lu+h[lu](rvrv(u0))+h[rv(u0)]rv(u0)h[rv]rv(u0)>0,
(h[rv(u0)]h[lu])(rv(u0)lu)>(h[rv]h[lu])(rvlu).

ดังนั้นเป็นทางออกที่ดีกว่าอย่างเคร่งครัดr_v) หลักฐานอื่น ๆ ที่คล้ายกัน (lu,rv(u0))(lu,rv)

เราสามารถคำนวณอันดับแรกโดยที่คือความยาวของลำดับจากนั้นคำนวณคำตอบที่ดีที่สุดแบบวนซ้ำในหมู่สำหรับและและทางออกที่ดีที่สุดระหว่างสำหรับและ2) เนื่องจากการแทรกการแก้ปัญหาที่ดีที่สุดทั่วโลกต้องมาจาก\}v(/2)l1,l2,o1(lu,rv)u=1,,/21v=v(/2),v(/2)+1,o2(lu,rv)u=/2+1,/2+2,v=1,,v(/2){(l/2,rv(/2)),o1,o2}


O(n)ทางออก

ให้ถ้าr_v หลักฐานของบทแทรกยังแสดงคุณสมบัติที่สำคัญ: สำหรับและหากจากนั้นr_v) นี่หมายความว่าเมทริกซ์เป็นเมทริกซ์โมโนโทนทั้งหมดโดยที่คือความยาวของลำดับ (ดังนั้นหมายถึงองค์ประกอบ -th จากปลาย) แล้วSMAWK ขั้นตอนวิธีการสามารถนำไปใช้หาค่าต่ำสุดของดังนั้นค่าสูงสุดของฉf(lu,rv)=lurvu>u0v>v0f(lu0,rv0)f(lu0,rv)f(lu,rv0)>f(lu,rv)M[x,y]:=f(lx,rcy+1)cr1,r2,rcy+1yMf


1
สิ่งที่คุณพิสูจน์ได้คือเป็นเมทริกซ์โมโนโทนดังนั้นการหารและพิชิตจึงให้อัลกอริทึมแต่คุณสามารถพิสูจน์ได้ว่าคือMongeเพื่อให้สามารถใช้อัลกอริทึม SMAWKได้ f(lu,rv)O(nlogn)f(lu,rv)O(n)
Willard Zhan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.