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


10

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

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

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

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

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

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

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

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

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

คำตอบ:


6

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

Feasible⁡(l)=[∑i=1n⌊Lil⌋≥k] ,

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

l⋆=max{l∣Feasible⁡(l)}\}

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

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

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

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

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

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

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


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

4

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

เช่นเดียวกับในกรณีพิเศษในคำถามที่เราเรียงลำดับ / ชื่อไม้เพื่อให้L_n นี้จะใช้เวลาเวลาL1≥L2≥⋯≥LnO(nlog⁡n)

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

ในระยะแรกเราใช้การค้นหาแบบไบนารี่เพื่อค้นหาหมายเลข , , เพื่อให้แท่งสามารถตัดเป็นอย่างน้อยชิ้นขนาด (บวกชิ้นเล็ก ๆ ) แต่แท่งไม่สามารถตัดเป็นชิ้นขนาด{s-1} นี้จะใช้เวลาเวลาs1≤s≤k1,…,skLs1,…,s−1kLs−1O(klog⁡k)

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

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

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

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

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

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

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


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

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

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

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

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

1

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

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

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

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

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

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


1

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

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

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

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


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

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