การตัดไม้ที่เท่าเทียมกันจากไม้ที่แตกต่างกัน


10

คุณมีแท่งของความยาวโดยพลการไม่จำเป็นต้องเป็นหนึ่งn

โดยการตัดไม้บางส่วน (หนึ่งตัดตัดหนึ่งแท่ง แต่เราสามารถตัดได้บ่อยเท่าที่เราต้องการ) คุณต้องการที่จะได้รับแท่งเช่นนั้น:k<n

  • ทั้งหมดเหล่านี้แท่งมีความยาวเดียวกัน;k
  • แท่งทั้งหมดอย่างน้อยก็เท่ากับแท่งอื่น ๆ ทั้งหมดk

โปรดทราบว่าเราได้รับแท่งหลังจากทำการตัดCn+CC

คุณใช้อัลกอริทึมแบบใดที่จำนวนการตัดที่จำเป็นน้อยที่สุด? และหมายเลขนั้นคืออะไร?

ยกตัวอย่างเช่นใช้และใด ๆ อัลกอริทึมต่อไปนี้สามารถใช้ได้:n 2k=2n2

  • สั่งซื้อไม้โดยการเรียงลำดับของความยาวดังกล่าวว่าL_nL1L2Ln
  • ถ้าตัดแปะ # 1 ถึงสองชิ้นเท่ากัน ขณะนี้มีสองแท่งความยาวซึ่งเป็นอย่างน้อยเป็นเวลานานเป็นไม้ที่เหลือnL 1 / 2 2 ... nL12L2L1/22n
  • มิฉะนั้น ( ) ตัดติด # 1 ถึงสองชิ้นไม่เท่ากันขนาดและL_1-L_2ขณะนี้มีสองแท่งความยาวซึ่งมีความยาวมากกว่าและไม้อื่น ๆnL 2 L 1 - L 2 L 2 L 1 - L 2 3 nL1<2L2L2L1L2L2L1L23n

ในทั้งสองกรณีการตัดครั้งเดียวก็เพียงพอแล้ว

ฉันพยายามที่จะพูดคุยเรื่องนี้กับใหญ่กว่าแต่มีหลายกรณีที่ต้องพิจารณา คุณสามารถหาทางออกที่สง่างาม?k

คำตอบ:


6

การสังเกตหลักแรกเพื่อแก้ปัญหานี้ก็คือความเป็นไปได้ที่มีความยาวตัด ,l

Feasible(l)=[i=1nLilk] ,

เป็นค่คงซ้ายอย่างต่อเนื่องและไม่เพิ่มขึ้นในลิตรเนื่องจากจำนวนการตัดที่จำเป็นมีลักษณะคล้ายกันดังนั้นการค้นหาความยาวที่เหมาะสมจึงเป็นเพียงl

l=max{lFeasible(l)}\}

นอกจากเป็นคำตอบอื่น ๆ ได้เสนอทั้งหมดต่อเนื่องกระโดดมีรูปแบบเจ สิ่งนี้ทำให้เรามีปัญหาการค้นหาแบบแยกส่วนหนึ่งมิติที่คล้อยตามการค้นหาแบบไบนารี (หลังจากเรียงลำดับชุดผู้สมัครที่ จำกัด )Li/j

โปรดทราบว่าเราจะต้องพิจารณาที่สั้นกว่า -largest อันเดียวเท่านั้นเนื่องจากจะเป็นไปได้เสมอLik

จากนั้นขอบเขตที่ต่างกันบนนำไปสู่อัลกอริทึมของประสิทธิภาพที่แตกต่างกันj

  • 1jkส่งผลให้มีพื้นที่การค้นหาขนาดกำลังสอง (เป็น ),k
  • 1jk/iใน linearithmic หนึ่ง (สมมติว่าเรียงตามขนาดลดลง) และLi
  • ขอบเขตที่เกี่ยวข้องเพิ่มเติมเล็กน้อยในเส้นตรง

ใช้นี้เราสามารถแก้ปัญหาที่นำเสนอในเวลาและพื้นที่k)Θ(n+klogk)Θ(n+k)

หนึ่งต่อไปคือการสังเกตว่าผลรวมในเติบโตในโดยสำหรับผู้สมัครแต่ละคน "ผ่าน" ที่ซ้ำกันนับ เมื่อใช้สิ่งนี้เราสามารถใช้การเลือกอันดับแทนการค้นหาไบนารี่และรับอัลกอริทึมที่ทำงานในเวลาและพื้นที่ซึ่งเหมาะสมที่สุดFeasiblel1Li/jΘ(n)

ค้นหารายละเอียดในบทความอัลกอริทึมที่มีประสิทธิภาพของเราสำหรับส่วนแท่ง Envy ฟรีที่มีการตัดน้อยที่สุด (โดย Reitzig และ Wild, 2015)


เมื่อมันปรากฏออกมาความคิดจากแนวทางของเราในการตัดฟืนจะนำไปสู่ปัญหาทั่วไปหรือการแบ่งสรร (สัดส่วน)ปัญหาของความเกี่ยวข้องเชิงปฏิบัติ ดูสั้น ๆ ของเราบทความเกี่ยวกับว่า
Raphael

4

ตามที่ @randomA แนะนำเราจะดำเนินการในสองขั้นตอน: ก่อนอื่นเราจะพบชุดของแท่งที่จะถูกตัดแล้วลดจำนวนการตัด

เช่นเดียวกับในกรณีพิเศษในคำถามที่เราเรียงลำดับ / ชื่อไม้เพื่อให้L_n นี้จะใช้เวลาเวลาL1L2LnO(nlogn)

ในฐานะที่เป็น @ user1990169 ชี้ว่าเราไม่เคยมีการตัดชิ้นส่วนkik

ในระยะแรกเราใช้การค้นหาแบบไบนารี่เพื่อค้นหาหมายเลข , , เพื่อให้แท่งสามารถตัดเป็นอย่างน้อยชิ้นขนาด (บวกชิ้นเล็ก ๆ ) แต่แท่งไม่สามารถตัดเป็นชิ้นขนาด{s-1} นี้จะใช้เวลาเวลาs1sk1,,skLs1,,s1kLs1O(klogk)

ถ้าค่านี้เป็นขนาดที่เหมาะสมและเราสามารถข้ามเฟสที่สองได้Ls1=Ls

มิฉะนั้นเรารู้ว่าขนาดที่เหมาะสมที่สุดทำให้เป็นไปตามและถ้าแล้วผลลัพธ์จากการตัดไม้อย่างน้อยหนึ่งแท่งเป็นชิ้นขนาดเท่ากัน ระยะที่สองจะกำหนด :oLs1>oLso>Lsoo

สำหรับแต่ละแท่ง , , กำหนดขนาดของชุดตัวเลือกดังนี้: หากการตัดเป็นชิ้นขนาดจะเปลี่ยนแท่งให้เป็นชิ้น (รวมถึงอันที่สั้นกว่าถ้ามี) จากนั้นผู้สมัครสำหรับ ติดทุกคนค่าที่และ{s-1} (ดูที่คำตอบของ @ user1990169ว่าทำไมขนาดเหล่านี้จึงมีขนาดเท่านั้น)i1isLsriLijjriLij<Ls1

รักษาผู้สมัครแต่ละขนาดเท่าไหร่มันเกิดขึ้น การใช้ต้นไม้ค้นหาสมดุลนี้สามารถทำได้ในเนื่องจากจำนวนเสียงทั้งหมดของผู้สมัครขนาดที่ถูกผูกไว้โดย2kO(klogk)iri2k

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

ดังนั้นเราอีกครั้งสามารถใช้ค้นหา binary ที่จะหาผู้สมัครที่มีความยาวที่ใหญ่ที่สุดที่นำไปสู่การตัดที่ถูกต้องในk) จากนั้นเราก็ย้ำกว่าชุดของความยาวที่ผู้สมัครได้ถึงเกณฑ์นี้และหาหนึ่งที่มีความหลากหลายที่ใหญ่ที่สุดในหมู่พวกเขาในที่(k)O(klogk)O(k)

โดยรวมแล้วเราได้รับ runtime ในหรือถ้าเราไม่สนใจ (หรือไม่ต้องทำ) การเรียงลำดับเริ่มต้นO(nlogn)O(klogk)


ในขั้นตอนการค้นหาแบบไบนารีคุณจะตรวจสอบว่า "แท่งสามารถตัดเป็นขนาดอย่างน้อยชิ้นได้อย่างไร" 1,,skLs
Erel Segal-Halevi

สำหรับคำนวณL_i ผลรวมของค่าเหล่านี้คือจำนวนชิ้นที่คุณจะได้รับ 1isLi/Ls
FrankW

"ขนาดของผู้สมัครที่เกิดขึ้นบ่อยที่สุดคือขนาดที่เหมาะสมที่สุดสำหรับเรา" - ทำไม?
Erel Segal-Halevi

becase ในแต่ละครั้งที่มันเกิดขึ้นเรามีติดที่ให้ชิ้นกับตัด tt1
FrankW

1
จำนวนการตัดทั้งหมดคือในกรณีที่ดีที่สุด (แท่งที่มีความยาวเท่ากันแท่งอื่น ๆ ทั้งหมดที่ครึ่งหนึ่งยาวที่สุดเท่าที่จะเป็นได้และเท่าที่ฉันเห็นจะไม่มีวันเกิน (มัน จะไม่เกินอย่างแน่นอนเนื่องจากการตัดทุกครั้งจะให้แท่งที่มีความยาวถูกต้องและส่วนที่เหลือ แต่ดูเหมือนว่าเราสามารถเลือกขนาดได้เสมอเพื่อให้มีอย่างน้อยหนึ่งการตัดที่เหลือความยาวที่ถูกต้อง มีหลักฐานสำหรับการที่แม้ว่า.)k2k2k1k
FrankW

1

หลังจากที่คุณสั่งให้แท่งเรียงลำดับตามความยาวของมันแล้วแท่งจะถูกตัดก็ต่อเมื่อไม้ทั้งหมดถูกตัดออกLiL1,L2,...Li1

ตั้งแต่ตอนนี้เราจะไม่ทำให้ตัดไม้ใด ๆเป็นต้นไปเนื่องจากเราสามารถมีแท่งที่มีความยาว{k}k<nLkkLk

ดังนั้นตอนนี้แทน , เราจะจัดการกับเพียงแท่ง (อาจจะเพิ่มติด -th รวม) และจำนวนสูงสุดของการปรับลดนั้นจะต้องถูกต้องในกรณีที่เลวร้ายที่สุดk-1nk1k=k1

นอกจากนี้หากจำนวนการตัดที่เหมาะสมคือจะต้องมีแท่งไม้อย่างน้อยหนึ่งชุดในหมู่แท่งที่จะถูกยึดโดยรวมจากแท่งไม้ดั้งเดิม 1 อัน<k1k1 (ทั้งในส่วนหรือใน 1 ชิ้น) กล่าวคือจะไม่มีส่วนใดของแท่งไม้ดั้งเดิมนั้นถูกปล่อยให้ 'ไม่ถูกจับ' นี่เป็นเพราะด้วยหลักการของหลุมนกพิราบจะต้องมีการตัดอย่างน้อย 1 ครั้งที่จะต้องสร้างไม้ที่ถูกต้องมากกว่า 1 อัน

จากนั้นคุณสามารถดำเนินการซ้อนกันสองครั้งสำหรับลูป (ทั้งคู่จนถึง ) วงรอบนอกจะแสดงจำนวนติดมีทุกส่วนจะต้องมีการดำเนินการและห่วงด้านในจะแสดงว่าจำนวนของชิ้นส่วนที่ทำจากติดว่า สำหรับแต่ละขนาดตรวจสอบว่าคุณสามารถรับไม้ที่เป็นไปได้โดยการตัดไม้เป็นต้นไปตามลำดับและหากทำได้ให้ปรับปรุงการตัดต่ำสุดที่จำเป็นหากจำนวนที่ต้องการในปัจจุบันน้อยกว่าkij
LijL1

ความซับซ้อนโดยรวมของอัลกอริทึมด้านบนคือO(nlog(n)+k3)


1

แนวคิดระดับสูงจะเป็นการค้นหาแบบไบนารี

ขนาดของแท่งไม้ที่ขอแต่ละอันจะมีขนาดที่เล็กที่สุดและใหญ่ที่สุด ด้วยเหตุนี้เราจะดำเนินการโดยใช้การค้นหาแบบไบนารีกับขนาดของแท่งตรงกลางดูตัวเลขเราสามารถได้รับถ้าเป็นมากกว่าที่กำหนดแล้วเรารู้ว่าเราต้องเลือกขนาดอ้างอิงผู้สมัครใหม่ ดังนั้นเราจึงย้ายไปที่ใหญ่กว่าหรือเล็กกว่าโดยใช้แท่งอ้างอิงใหม่ เราหยุดเมื่อน้อยกว่าkkkkk

เมื่อเราพบแท่งอ้างอิงที่เหมาะสมแล้วก็มีมุมหนึ่งที่เราจะต้องปรับขนาดให้ใหญ่ขึ้น เราสามารถเรียงลำดับการตัดไม้ทั้งหมดตามจำนวนการตัดบนพวกเขาและขนาดของไม้ เลือกอันที่มีจำนวนการตัดน้อยที่สุดและขนาดที่น้อยที่สุด ลดจำนวนการตัดบนแท่งนี้ 1 และทำให้แท่งย่อยทั้งหมดของขนาดเท่ากัน นี่จะเป็นขนาดอ้างอิงใหม่ตรวจสอบเพื่อดูว่าขนาดใหม่นี้สามารถนำไปสู่การยอมรับหรือไม่ ฉันยอมรับฉันไม่ทราบวิธี จำกัด เวลาทำงานในกรณีนี้k

หวังว่าฉันจะเห็นสิ่งที่มีประโยชน์จากคำตอบอื่น ๆ


2
ฉันคิดว่าความคิดพื้นฐานของวิธีการของคุณจะได้ผล แต่คำอธิบายอัลกอริทึมของคุณยังไม่ชัดเจนเพียงพอ คุณสามารถเพิ่มรหัสเทียมที่มีรายละเอียดมากขึ้นได้ไหม
FrankW

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