จะใช้อัลกอริทึมแบบโลภเพื่อค้นหาลำดับที่ไม่ลดลงใกล้เคียงกับลำดับที่ได้อย่างไร


20

a1,,an0laibi0lbimax(|a1b1|,,|anbn|)biO(nl4)

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

คำตอบ:


9

เริ่มต้นด้วยการสังเกตต่อไปนี้:

ให้maxแทนค่าสูงสุดของลำดับa1,...,anและให้minแทนค่าต่ำสุด หากa1=maxให้เลือกb1=b2=...=bn=(max+min)/2เหมาะสมที่สุด

เหตุใดจึงเป็นเช่นนี้ ทีนี้เนื่องจากลำดับเริ่มต้นด้วยจำนวนสูงสุดเราเลือกb1ใหญ่และประสบการเบี่ยงเบนอย่างมากจากลำดับขั้นต่ำ (เนื่องจากb_iใด ๆ ที่ตามมาbiต้องมากกว่าหรือเท่ากับb1 ) หรือเราเลือกb1เล็กและทุกข์จาก เบี่ยงเบนไปสูงสุดmaxค่าเฉลี่ยลดความเบี่ยงเบนสูงสุด

ตอนนี้เราสามารถพยายามที่จะพูดคุยสังเกตนี้เพื่อการใช้งานในลำดับทั่วไปa_1,a1,...,anตัวอย่างเช่นเราสามารถแบ่งลำดับใด ๆ ให้เป็นลำดับได้เช่นกันโดยเริ่มต้นด้วยลำดับสูงสุดตามลำดับ

ตัวอย่าง:แบ่งเป็น ,และ1)( 2 ) ( 6 , 4 , 1 , 5 , 2 ) ( 8 , 7 , 5 , 1 )(2,6,4,1,5,2,8,7,5,1)(2)(6,4,1,5,2)(8,7,5,1)

ด้วยการแบ่งพาร์ติชันนี้ตอนนี้เราสามารถแก้แต่ละอนุกรมเหล่านี้แยกกันและรับการมอบหมายของซึ่งอย่างไรก็ตามอาจละเมิดเงื่อนไขที่ไม่ลดลง สิ่งนี้สามารถแก้ไขได้โดยไม่สูญเสียประสิทธิภาพbi

สังเกตว่าการเรียงลำดับสุดท้ายมักจะมีค่าของลำดับทั้งหมดเสมอ (ไม่เช่นนั้นจะมีการเรียงลำดับอื่นหลังจากนั้น) ให้เป็นค่าที่เราได้รับมอบหมายให้ subsequences ทีนี้เพื่อให้ได้แบบไม่ลดลงในเราเริ่มจากด้านหลังที่และทำงานไปข้างหน้า หากมีขนาดใหญ่กว่าเราเพียงชุดW_ถ้ามันเล็กกว่านี้เราก็เก็บมันไว้ จากนั้นเราดำเนินการเปรียบเทียบกับและอื่น ๆ โปรดทราบว่าการลดใด ๆให้เป็นค่าW 1 , W 2 , . . , W k k W 1 , . . , w k w k w k - 1 w k w k - 1 : = w k w k - 2 w k - 1 w ฉันw ฉัน+ 1 w ฉันw ฉัน+ 1maxw1,w2,...,wkkw1,...,wkwkwk1wkwk1:=wkwk2wk1wiwi+1ไม่เพิ่มความเบี่ยงเบนเนื่องจากค่า maximium ในการเรียงตามลำดับที่ได้รับมอบหมายด้วยนั้นต่ำกว่าค่าสูงสุดในการเรียงลำดับที่กำหนดด้วยเสมอwiwi+1

ฉันคิดว่าอัลกอริทึมนี้ถูกต้องแล้ว เกี่ยวกับเวลาทำงานขั้นตอนสำคัญคือการคำนวณ maxima ที่เพิ่มขึ้นสำหรับองค์ประกอบซึ่งเป็นไปได้ใน ? ไม่แน่ใจว่าที่ก่อlO(n)l


2

ฉันจะคิดออกมาดัง ๆ ที่นี่แค่ทำงานผ่านคำแนะนำที่คุณให้ ไปที่คำใบ้ดั้งเดิมของการบอกว่าคือสิ่งที่คุณควรลองก่อน ฉันสามารถนึกถึงอัลกอริทึมโลภที่มีเวลานั้นO(nl)

ส่วนหนึ่งของความซับซ้อนของเวลาหมายความว่าคุณสามารถเก็บรายชื่อของนับจากการเกิดขึ้นของแต่ละแต่ละค่าที่0..lนั่นเป็นเพียงแค่สร้างชุดซึ่งติดตามจำนวนของแต่ละในชุด คุณสามารถสร้างรายการ initalize โดยการสแกนลำดับอินพุตหนึ่งครั้ง0 .. l นับ= C 0 , , C l ll0..lCount=C0,,Cll

คุณสามารถสแกนรายการนี้ในเพื่อรับค่าสูงสุดและต่ำสุด หากคุณต้องเติมรายชื่อทั้งหมดของด้วยจุดกึ่งกลางนี้ความแปรปรวนของคุณจะเป็นความแตกต่างจากค่านี้และค่าสูงสุด / นาที นี้นั้นเป็นสถานการณ์ที่เลวร้ายที่สุดกรณีของคุณขอเรียกว่าb_wb b wO(l)bbw

ดังนั้นวิธีการของคุณเพื่อจากทางซ้าย คุณทั้งสองสามารถวาง elemeent นี้จากและได้รับนาที / สูงสุดของใน(ลิตร) ตอนนี้เราสามารถโลภ เราไม่เลือกตั้งแต่นั้นบังคับให้รายการทั้งหมดที่เหลืออยู่ (เพื่อตอบสนองความต้องการที่ไม่ลดลง) และเพิ่มความแปรปรวน ค่าต่ำสุดเราสามารถเลือกเป็น[I-1] ถ้าอยู่ในช่วงที่ยอมรับได้เราเลือกถ้าต่ำกว่าช่วงที่ใช้ต่ำสุด สิ่งนี้จะลดความแปรปรวนที่เนื่องจากข้อ จำกัด ที่ทราบนับb [ i + 1 ] b [ n ] O ( l ) b i > b w b [ i - 1 ] a ฉันb ibiCountb[i+1]b[n]O(l)bi>bwb[i1]aibi

นี่เป็นเพียงความคิดบางทีฉันอาจจะโชคดีและมันชี้ให้คุณในทิศทางที่ถูกต้อง อัลกอริทึมนี้อาจไม่ทำงาน (ใช้สำหรับการทดสอบง่ายๆของฉัน) แต่มันตรงกับคำแนะนำที่ได้รับดังนั้นอาจเป็นประโยชน์ ถ้าถูกต้องมันเป็นเรื่องง่ายที่จะเห็นว่าส่วนสามารถถูกดรอปไปยังได้หรือไม่ฉันไม่แน่ใจO ( บันทึกl )O(l)O(logl)


2

นี่คือวิธีการแก้ปัญหาของอาจารย์ซึ่งเขาเรียกว่า "ลด" สำหรับแต่ละจากไปพยายามที่จะสร้างวิธีการแก้ปัญหาถ้าเรารู้ว่าการเบี่ยงเบนน้อยกว่าหรือเท่ากับฉันแรกที่พบวิธีแก้ไขคือค่าเบี่ยงเบนต่ำสุด เราสามารถหาทางออกให้เบี่ยงเบนในเวลา ดังนั้นเวลาทำงานเป็น(NL) จากนั้นแทนที่จะใช้การค้นหาเชิงเส้นเราสามารถใช้การค้นหาแบบไบนารี่เพื่อหาค่าเบี่ยงเบนที่เล็กที่สุดที่เป็นไปได้ของการแก้ปัญหา ซึ่งจะช่วยลดเวลาในการทำงานให้กับซึ่งตอบสนองความต้องการของ{L})0 l ฉันฉันO ( n ) O ( n l ) O ( n บันทึกl ) O ( n 4 √)i0liiO(n)O(nl)O(nlogl)O(nl4)


4
ดังนั้นเป็นเคล็ดลับ ... แต่ฉันทึ่งมากขึ้นโดย "เราสามารถหาทางออกให้เบี่ยงเบนใน O (n) เวลา" .. วิธีการก็คือว่าไม่ส่วนที่น่าสนใจ O(nl4)
jmad

@jmad ป.ร. ให้สำหรับแต่ละใช้เป็นค่าต่ำสุดซึ่งเป็นอย่างน้อยเป็นใหญ่เป็นก่อนหน้านี้ทั้งหมดและที่เป็นไม่มากไปกว่าออกไปจากa_jหากเราไม่พบคุณค่าเช่นนั้นมันหมายความว่าอย่างไร? ก็หมายความว่าก่อนหน้านี้เป็นมากกว่าใหญ่กว่าa_jดังนั้นก่อนเป็นมากกว่าใหญ่กว่าa_jดังนั้นคุณค่าของเป็นไปไม่ได้ หากคุณผ่านค่าโดยไม่ติดขัดเช่นนี้คุณจะพบวิธีแก้ปัญหาสำหรับkฉันเจบีทีฉันเจที 2 ฉันJฉันn ฉันO ( n )ijbjbkiajbtiajat2iajiniโดยไม่ต้องย้อนรอยในเวลา(n) O(n)
jwg

O (n log l) จะเป็นคำใบ้ที่แข็งแกร่งที่คุณต้องทำการค้นหาแบบไบนารี่ในช่วง 0 ถึง l
gnasher729

0

ฉันคิดว่านี่น่าจะทำได้ใน O (n)

รับปัญหาที่คล้ายกัน: เมื่อได้รับ , 1 ≤ i ≤ n, และ d ≥ 0, ค้นหาตามลำดับที่ไม่ลดหลั่นเช่นforสำหรับทุกคนหรือแสดงว่าเป็นไปไม่ได้ สิ่งนี้สามารถทำได้ใน O (n) และการใช้การค้นหาแบบไบนารีปัญหาดั้งเดิมได้รับการแก้ไขใน O (n log l)b i | a i - b i | daibi|aibi|d

ตอนนี้ถ้ามี i ≤ j เช่นนั้น a_i - a_j> 2d ดังนั้นจึงไม่มีวิธีแก้ปัญหา (เพราะ )biaid,bjaj+d<ai2d+d=aidbi

แต่ถ้า a_i - a_j ≤ 2d สำหรับทุกตัวฉันแล้วฉันคิดว่าจะหาทางออกได้เสมอ ดังนั้นสิ่งที่เราต้องทำคือหา m = max (a_i - a_j) สำหรับทุก ๆ i j และเลือก d = floor ((m + 1) / 2) จำนวนสูงสุดนั้นสามารถพบได้ใน O (n)


ความคิดที่น่าสนใจ! ฉันเชื่อว่าสิ่งนี้อาจใช้งานได้ แต่ดูเหมือนว่าจะมีช่องว่างขนาดใหญ่ในตอนท้ายของคำตอบของคุณและฉันมีเวลายากในการกรอกรายละเอียด คุณมีหลักฐานว่าถ้าสำหรับจะมีวิธีแก้ไขอยู่เสมอ? ที่สำคัญกว่าเราจะหามันได้อย่างไร คำถามเดิมบอกว่าเราต้องพบ 's แม้ว่าเราคิดว่าจะมีวิธีแก้ปัญหาอยู่ก็ตาม แต่ฉันก็ลำบากในการดูวิธีค้นหาที่เกี่ยวข้อง คุณอธิบายรายละเอียดเกี่ยวกับเรื่องนั้นได้ไหม? ฉันj b i b iaiaj2dijbibi
DW
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.