ฉันไม่มีเงื่อนงำอย่างจริงใจว่าจะเริ่มแก้ไขคำถามนี้อย่างไร ดูเหมือนว่าฉันจะถามคำถามเกี่ยวกับการเขียนโปรแกรมแบบไดนามิก แต่อาจารย์บอกว่าควรแก้ไขได้โดยใช้อัลกอริทึมโลภ มันคงจะดีมากถ้ามีคนชี้ให้ฉันไปในทิศทางที่ถูกต้องด้วยการบอกใบ้เล็ก ๆ
ฉันไม่มีเงื่อนงำอย่างจริงใจว่าจะเริ่มแก้ไขคำถามนี้อย่างไร ดูเหมือนว่าฉันจะถามคำถามเกี่ยวกับการเขียนโปรแกรมแบบไดนามิก แต่อาจารย์บอกว่าควรแก้ไขได้โดยใช้อัลกอริทึมโลภ มันคงจะดีมากถ้ามีคนชี้ให้ฉันไปในทิศทางที่ถูกต้องด้วยการบอกใบ้เล็ก ๆ
คำตอบ:
เริ่มต้นด้วยการสังเกตต่อไปนี้:
ให้แทนค่าสูงสุดของลำดับและให้แทนค่าต่ำสุด หากให้เลือกเหมาะสมที่สุด
เหตุใดจึงเป็นเช่นนี้ ทีนี้เนื่องจากลำดับเริ่มต้นด้วยจำนวนสูงสุดเราเลือกใหญ่และประสบการเบี่ยงเบนอย่างมากจากลำดับขั้นต่ำ (เนื่องจากb_iใด ๆ ที่ตามมาต้องมากกว่าหรือเท่ากับ ) หรือเราเลือกเล็กและทุกข์จาก เบี่ยงเบนไปสูงสุดค่าเฉลี่ยลดความเบี่ยงเบนสูงสุด
ตอนนี้เราสามารถพยายามที่จะพูดคุยสังเกตนี้เพื่อการใช้งานในลำดับทั่วไปa_1,ตัวอย่างเช่นเราสามารถแบ่งลำดับใด ๆ ให้เป็นลำดับได้เช่นกันโดยเริ่มต้นด้วยลำดับสูงสุดตามลำดับ
ตัวอย่าง:แบ่งเป็น ,และ1)( 2 ) ( 6 , 4 , 1 , 5 , 2 ) ( 8 , 7 , 5 , 1 )
ด้วยการแบ่งพาร์ติชันนี้ตอนนี้เราสามารถแก้แต่ละอนุกรมเหล่านี้แยกกันและรับการมอบหมายของซึ่งอย่างไรก็ตามอาจละเมิดเงื่อนไขที่ไม่ลดลง สิ่งนี้สามารถแก้ไขได้โดยไม่สูญเสียประสิทธิภาพ
สังเกตว่าการเรียงลำดับสุดท้ายมักจะมีค่าของลำดับทั้งหมดเสมอ (ไม่เช่นนั้นจะมีการเรียงลำดับอื่นหลังจากนั้น) ให้เป็นค่าที่เราได้รับมอบหมายให้ 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 ฉัน+ 1ไม่เพิ่มความเบี่ยงเบนเนื่องจากค่า maximium ในการเรียงตามลำดับที่ได้รับมอบหมายด้วยนั้นต่ำกว่าค่าสูงสุดในการเรียงลำดับที่กำหนดด้วยเสมอ
ฉันคิดว่าอัลกอริทึมนี้ถูกต้องแล้ว เกี่ยวกับเวลาทำงานขั้นตอนสำคัญคือการคำนวณ maxima ที่เพิ่มขึ้นสำหรับองค์ประกอบซึ่งเป็นไปได้ใน ? ไม่แน่ใจว่าที่ก่อl
ฉันจะคิดออกมาดัง ๆ ที่นี่แค่ทำงานผ่านคำแนะนำที่คุณให้ ไปที่คำใบ้ดั้งเดิมของการบอกว่าคือสิ่งที่คุณควรลองก่อน ฉันสามารถนึกถึงอัลกอริทึมโลภที่มีเวลานั้น
ส่วนหนึ่งของความซับซ้อนของเวลาหมายความว่าคุณสามารถเก็บรายชื่อของนับจากการเกิดขึ้นของแต่ละแต่ละค่าที่0..lนั่นเป็นเพียงแค่สร้างชุดซึ่งติดตามจำนวนของแต่ละในชุด คุณสามารถสร้างรายการ initalize โดยการสแกนลำดับอินพุตหนึ่งครั้ง0 .. l นับ= C 0 , … , C l l
คุณสามารถสแกนรายการนี้ในเพื่อรับค่าสูงสุดและต่ำสุด หากคุณต้องเติมรายชื่อทั้งหมดของด้วยจุดกึ่งกลางนี้ความแปรปรวนของคุณจะเป็นความแตกต่างจากค่านี้และค่าสูงสุด / นาที นี้นั้นเป็นสถานการณ์ที่เลวร้ายที่สุดกรณีของคุณขอเรียกว่าb_wb b w
ดังนั้นวิธีการของคุณเพื่อจากทางซ้าย คุณทั้งสองสามารถวาง elemeent นี้จากและได้รับนาที / สูงสุดของใน(ลิตร) ตอนนี้เราสามารถโลภ เราไม่เลือกตั้งแต่นั้นบังคับให้รายการทั้งหมดที่เหลืออยู่ (เพื่อตอบสนองความต้องการที่ไม่ลดลง) และเพิ่มความแปรปรวน ค่าต่ำสุดเราสามารถเลือกเป็น[I-1] ถ้าอยู่ในช่วงที่ยอมรับได้เราเลือกถ้าต่ำกว่าช่วงที่ใช้ต่ำสุด สิ่งนี้จะลดความแปรปรวนที่เนื่องจากข้อ จำกัด ที่ทราบนับb [ i + 1 ] … b [ n ] O ( l ) b i > b w b [ i - 1 ] a ฉันb i
นี่เป็นเพียงความคิดบางทีฉันอาจจะโชคดีและมันชี้ให้คุณในทิศทางที่ถูกต้อง อัลกอริทึมนี้อาจไม่ทำงาน (ใช้สำหรับการทดสอบง่ายๆของฉัน) แต่มันตรงกับคำแนะนำที่ได้รับดังนั้นอาจเป็นประโยชน์ ถ้าถูกต้องมันเป็นเรื่องง่ายที่จะเห็นว่าส่วนสามารถถูกดรอปไปยังได้หรือไม่ฉันไม่แน่ใจO ( บันทึกl )
นี่คือวิธีการแก้ปัญหาของอาจารย์ซึ่งเขาเรียกว่า "ลด" สำหรับแต่ละจากไปพยายามที่จะสร้างวิธีการแก้ปัญหาถ้าเรารู้ว่าการเบี่ยงเบนน้อยกว่าหรือเท่ากับฉันแรกที่พบวิธีแก้ไขคือค่าเบี่ยงเบนต่ำสุด เราสามารถหาทางออกให้เบี่ยงเบนในเวลา ดังนั้นเวลาทำงานเป็น(NL) จากนั้นแทนที่จะใช้การค้นหาเชิงเส้นเราสามารถใช้การค้นหาแบบไบนารี่เพื่อหาค่าเบี่ยงเบนที่เล็กที่สุดที่เป็นไปได้ของการแก้ปัญหา ซึ่งจะช่วยลดเวลาในการทำงานให้กับซึ่งตอบสนองความต้องการของ{L})0 l ฉันฉันO ( n ) O ( n l ) O ( n บันทึกl ) O ( n 4 √)
ฉันคิดว่านี่น่าจะทำได้ใน O (n)
รับปัญหาที่คล้ายกัน: เมื่อได้รับ , 1 ≤ i ≤ n, และ d ≥ 0, ค้นหาตามลำดับที่ไม่ลดหลั่นเช่นforสำหรับทุกคนหรือแสดงว่าเป็นไปไม่ได้ สิ่งนี้สามารถทำได้ใน O (n) และการใช้การค้นหาแบบไบนารีปัญหาดั้งเดิมได้รับการแก้ไขใน O (n log l)b i | a i - b i | ≤ d
ตอนนี้ถ้ามี i ≤ j เช่นนั้น a_i - a_j> 2d ดังนั้นจึงไม่มีวิธีแก้ปัญหา (เพราะ )
แต่ถ้า a_i - a_j ≤ 2d สำหรับทุกตัวฉันแล้วฉันคิดว่าจะหาทางออกได้เสมอ ดังนั้นสิ่งที่เราต้องทำคือหา m = max (a_i - a_j) สำหรับทุก ๆ i j และเลือก d = floor ((m + 1) / 2) จำนวนสูงสุดนั้นสามารถพบได้ใน O (n)