วิธีการแก้
โซลูชันมีสองส่วน ครั้งแรกที่เราค้นพบชุดน้อยที่สุดจากนั้นเราพิสูจน์ว่ามันสามารถเป็นตัวแทนของชุดผลรวมพลังงาน โซลูชันได้รับการปรับสำหรับการใช้งานการเขียนโปรแกรม
อัลกอริทึมชุดน้อยที่สุด
ค้นหาองค์ประกอบสูงสุดจากชุดผลรวม (หลาย) Pชุดเริ่มต้นที่น้อยที่สุด (หลายชุด) นั้นว่างเปล่าaม.P
เว้นแต่จะมีเพียงกลุ่มหนึ่งแทนมในรูปแบบที่เป็นไปได้ทั้งหมดเป็นคู่ของจำนวนเงินที่เพิ่มขึ้นเป็นเมตร , S ฉันJ = { ( ฉัน , J ) | a i + a j = a m }aม.aม.Sฉันเจ= { ( aผม,J) | ผม+ aJ= aม.}
ตรวจสอบว่ามีองค์ประกอบทั้งหมดจากชุดผลรวม
หาองค์ประกอบสูงสุดsจากS ฉันJ (ความหมายร่วมกัน) ที่มีคุณสมบัติดังต่อไปสำหรับแต่ละS ฉันเจ , sเป็นทั้งในS ฉันเจหรือเราสามารถหาPจากชุดของผลรวมเพื่อให้P +asSฉันเจSฉันเจasSฉันเจaพีอยู่ใน S ฉันเจaพี+ asSฉันเจ
ถ้าเป็นกรณีที่ไม่ได้มีsเพียงผลรวมs + PลบP + sจากS ฉันJ (หรือเพียงแค่ตั้งเครื่องหมายจะไม่สนใจมัน) และแทรกพีและSฉันเจasas+ aพีaพี+ asSฉันเจaพีใน S i jแทนasSฉันเจ
หากองค์ประกอบมีอยู่ในทุก ๆSฉันเจลบออกจากทุกครั้งเดียว (หรือเพียงแค่ทำเครื่องหมายไว้ที่จะไม่สนใจมันและไม่จะสัมผัสมันได้อีกต่อไป) และเพิ่มลงในรายการขององค์ประกอบของที่มีศักยภาพน้อยที่สุดชุดPSฉันเจP
ทำซ้ำจนกว่าทั้งหมดจะว่างเปล่าSฉันเจ
ถ้าบางส่วนของSฉันเจยังไม่ว่างเปล่าและเราไม่สามารถดำเนินการต่อได้ให้ลองอีกครั้งโดยใช้ค่าสูงสุดจากทั้งหมดSฉันเจ
สร้างขั้นตอนโดยไม่ต้องเวียนเกิดการลบและต่อด้วยขั้นตอนวิธีการคุ้มครองชุดอำนาจเหนือP(ก่อนหน้านี้คุณสามารถทำการตรวจสอบอย่างปลอดภัยว่าPรวมองค์ประกอบทั้งหมดที่ไม่สามารถแสดงเป็นผลรวมของสององค์ประกอบดังนั้นพวกเขาจะต้องอยู่ในชุดพื้นฐานสำหรับตัวอย่างเช่นองค์ประกอบน้อยที่สุดจะต้องอยู่ในP )PPP
(10. สังเกตว่าการแก้ปัญหาการตั้งค่าขั้นต่ำซึ่งเป็นเป้าหมายของอัลกอริทึมไม่สามารถมีการซ้ำซ้อนของหมายเลขเดียวกันมากกว่าหนึ่งรายการ)
ตัวอย่าง:
{ 2 , 3 , 5 , 7 , 8 , 10 , 12 , 13 , 15 }
แทน 15 ด้วยวิธีที่เป็นไปได้ทั้งหมดโดยรวมเป็นตัวเลขสองตัวจากผลรวมของชุด
( 13 , 2 ) , ( 12 , 3 ) , ( 10 , 5 ) , ( 8 , 7 )
ลองหาจำนวนสูงสุดที่อยู่ในทุกกลุ่มหรือที่สามารถแสดงเป็นผลรวม เห็นได้ชัดว่าเราสามารถเริ่มค้นหามันจาก 8 ไม่มีจุดไปอยู่เหนือมัน
13 จากกลุ่มแรกคือ 13 = 8 + 5 ดังนั้น 13 เป็นเรื่องปกติ แต่ 12 จากกลุ่มที่สองไม่ดีเนื่องจากไม่มี 4 ที่จะทำ 12 = 8 + 4 ในชุดของผลรวม ต่อไปเราลองด้วย 7 แต่ไม่สามารถครอบคลุม 13 ได้ทันทีไม่มี 6
ต่อไปเราลอง 5. 13 = 5 + 8, 12 = 5 + 7, 10 = 5 + 5, และสำหรับสุดท้าย 8 = 5 + 3 หรือ 7 = 5 + 2 แต่ไม่ใช่ทั้งคู่ กลุ่มอยู่ในขณะนี้:
( ( 5 , 8 ) , 2 ) , ( ( 5 , 7 ) , 3 ) , ( ( 5 , 5 ) , 5 ) , ( ( 5 , 3 ) , 7 )
5 กำลังทำซ้ำในทุกกลุ่มดังนั้นเราจึงแยก } เราแยก 5 เพียงครั้งเดียวจากแต่ละกลุ่มP= { 5 }
( 8 , 2 ) , ( 7 , 3 ) , ( 5 , 5 ) , ( 3 , 7 )
เห็นได้ชัดว่าไม่มีจุดใดสูงกว่า 5 ดังนั้นเราจึงลอง 5 อีกครั้ง 8 = 5 + 3, 7 = 5 + 2 ดังนั้นทั้งหมดก็ใช้ได้
( ( 5 , 3 ) , 2 ) , ( ( 5 , 2 ) , 3 ) , ( 5 , 5 ) , ( 3 , ( 5 , 2 ) )
แยกหนึ่ง 5 อีกครั้งจากทุกกลุ่มเนื่องจากเป็นการทำซ้ำ (นี่ไม่ใช่เรื่องปกติ แต่กรณีของเราถูกสร้างขึ้นโดยเจตนาเพื่อแสดงสิ่งที่ต้องทำในกรณีที่เรามีการทำซ้ำ) P= { 5 , 5 }
( 3 , 2 ) , ( 2 , 3 ) , ( 5 ) , ( 3 , 2 )
ตอนนี้เราลองด้วย 3 และมี 5 = 3 + 2 เพิ่มลงในกลุ่ม
(3,2),(2,3),(3,2),(3,2)
ตอนนี้แยก 3 และ 2 เนื่องจากพวกมันซ้ำทุกที่และเราก็ปรับและกลุ่มว่างเปล่าP={5,5,3,2}
( ) , ( ) , ( ) , ( )
ตอนนี้เราต้องสร้างขั้นตอนแบบวนซ้ำโดยไม่ต้องลบออกนี่หมายถึงการทำข้างต้นโดยไม่ต้องลบองค์ประกอบออกจากเพียงแค่วางมันลงในPและทำเครื่องหมายว่าจะไม่เปลี่ยนแปลงอีกต่อไปSฉันเจP
( ( 5 , 8 ) , 2 ) , ( ( 5 , 7 ) , 3 ) , ( ( 5 , 5 ) , 5 ) , ( ( 5 , 3 ) ( (
( 13 , 2 ) , ( 12 , 3 ) , ( 10 , 5 ) , ( 8 , 7 )
( ( 5 , 8 ) , 2 ) , ( ( 5 , 7 ) , 3 ) , ( ( 5 , 5 ) , 5 ) , ( ( 5 , 3 ) , 7 )
( ( 5 , ( 5 , 3 ) ) , 2 ) , ( ( 5 , ( 5 , 2 ) ) , 3 ) , ( ( 5 , ( 3 , 2 ) ) , 5 ) , ( ( 5 , 3 ) , ( 5 , 2 ) )
ความคุ้มครองชุดไฟ
วัตถุประสงค์ของส่วนนี้คือการตรวจสอบว่าชุดขั้นต่ำที่พบสามารถครอบคลุมชุดผลรวมพลังงานได้หรือไม่ เป็นไปได้ว่าวิธีแก้ปัญหาที่ค้นพบสามารถครอบคลุมผลรวมที่ได้รับทั้งหมด แต่ไม่ได้ผลรวมของพลังงาน (ในทางเทคนิคคุณสามารถสร้างชุดผลรวมพลังงานจากชุดขั้นต่ำที่พบและตรวจสอบว่าผลรวมแต่ละชุดตามที่ชุดควบคุมเริ่มต้นอยู่ในชุดผลรวมเริ่มต้นนี่คือทั้งหมดที่รวมเข้ากับสิ่งที่เรามีอยู่แล้ว คุณสามารถทำส่วนนี้ได้ในขณะที่กรอกซ้ำการสอบถามซ้ำ)
- เข้ารหัสองค์ประกอบทั้งหมดจากชุดขั้นต่ำโดยใช้พลังต่อเนื่องของ 2 คำสั่งไม่สำคัญ เข้ารหัสองค์ประกอบเดียวกันด้วยค่าใหม่หลาย ๆ ครั้งตามที่ทำซ้ำ เริ่มจาก C = 1 ทุกองค์ประกอบถัดไปจะมี C = 2C
( 2 = [ 1 ] , 3 = [ 2 ] , 5 = [ 4 ] , 5 = [ 8 ] )
- แทนที่องค์ประกอบในรายการเรียกคืนที่เรียกคืน
( ( 5 , ( 5 , 3 ) ) , 2 ) , ( ( 5 , ( 5 , 2 ) ) , 3 ) , ( ( 5 , ( 3 , 2 ) ) , 5 ) , ( ( 5 , 3 ) , ( 5 , 2 ) )
ด้วยการเข้ารหัส: 2 กับ 1, 3 กับ 2, 5 กับ 4 และอีก 5 กับ 8 สังเกตว่าแต่ละองค์ประกอบมีการเข้ารหัสที่แตกต่างกันแม้ว่าพวกเขาจะทำซ้ำ
( ( 4 , ( 8 , 2 ) ) , 1 ) , ( ( 4 , ( 8 , 1 ) ) , 2 ) , ( ( 4 , ( 2 , 1 ) ) , 8 ) , ( ( 8 , 2 ) , ( 4 , 1 ) )
- รวบรวมผลรวมกลางทั้งหมดในขณะนี้เรามี (1,2,4,8)
( ( 4 , ( 10 ) ) , 1 ) , ( ( 4 , ( 9 ) ) , 2 ) , ( ( 4 , ( 3 ) ) , 8 ) , ( ( 10 ) , ( 5 ) )
(1,2,3,4,5,8,9,10)
((14),1),((13),2),((7),8),(15)
Intermediate sums (1,2,3,4,5,8,9,10,13,14,15)
{(15),(15),(15),(15)}
Check that the result is 2m−1, where m is the number of elements in the solution, in the example m=4
Collect missing numbers from 1 to 2m−1 in the intermediate sum list
(6,7,11,12)
- Justify their absence in the following manner: represent each number in binary form
(6=01102)
(7=01112)
(11=10112)
(12=10102)
6 represents the sum of 3+5 since 01102 is covering second and third element from (2=[1],3=[2],5=[4],5=[8]). The sum of these elements, 8, is listed in the initial sum list {2,3,5,7,8,10,12,13,15}, so all is fine.
7 represents the sum of 2+3+5 since 01112 is covering first three elements from (2=[1],3=[2],5=[4],5=[8]). The sum of these elements, 10, is listed in the initial sum list so all is fine.
11 is 2+3+5, and 10 is in the list.
12 is 3+5, and 8 is in the list.
If any binary representation corresponds to the sum that cannot be found, report that there is no solution.
So all is fine and (2,3,5,5) is the solution. It is the minimal solution as well.
Discussion
It was necessary to provide the algorithm that is going to check if the sums cover the power set completion, which is what is hidden in the binary expansion. For example if we exclude 8 and 7 from the initial example, the first part would still provide the solution, only the second part would report missing combinations of sums.
First part of discovering the possible minimal set is mnlog(m) which comes to mlog2(m): we are looking around m elements n times having one log(m) binary search.
The last part is done in recursion return and it does not require any special effort, we are searching over less than m elements, we need binary form which is logm and we have one addition and search if the sum is in the list, so together it is again about mlog2(m).
If we assume that the number of elements in the power sum set corresponds to the number of partitions of the largest element in the underlying set then the complexity is around mlog3(m). Any of the two justifies the initial sorting in order to find the largest element.
Parts of the algorithm assume that we can find the pair of sums in linear time and this requires sorting.
Incorrect start
First part of the algorithm may fail, if we have started it on the wrong foot. For example 2,3,4,5,6,7,8,9,10,11,12,13,15 has the basic solution 2,3,4,6 which you get if you start algorithm from 6. However we can start our algorithm from 7, since there is nothing in step 4. that would say not to, and lock ourselves in, the algorithm cannot end properly. The reason is that 7 is 7=4+3 and 4 and 3 are in the solution. So locked algorithm does not always mean that there is no solution, just to try again with lower initial value. In that case, some ideas about the possible values are hidden within remaining Sij. That is why we suggested starting from there in case of failure.
Another example, if you miss and start algorithm from 5, you would get 5,4,3,3 but this one does not include 2.
Notice that this algorithm is not going to give a derived solutions like 2 , 2 , 3 , 4 , 4ซึ่งเราได้เพียงแค่เปลี่ยน 6 เป็น 4 และ 2 ในการแก้ปัญหา 2 , 3 , 4 , 6. มีกฎพิเศษที่ครอบคลุมรุ่นเหล่านี้
วัตถุประสงค์ของอัลกอริทึมนี้คือการให้บริการโซลูชั่นเมื่อเราเริ่มต้นได้อย่างถูกต้อง
ปรับปรุง
ขั้นตอนที่ 4 คือสิ่งที่สามารถอัพเกรดได้ในลักษณะนี้: แทนที่จะเป็นจำนวนสูงสุดเราสามารถลองทุกองค์ประกอบตามลำดับจากมากไปน้อยซึ่งเป็นไปตามเงื่อนไขที่กำหนด เราสร้างสาขาแยกสำหรับแต่ละ หากสาขาบางแห่งไม่ให้ทางออกให้ยกเลิก
ตัวอย่างเช่นสำหรับ 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 15 เราสามารถลองในรอบแรก 7 , 6 , 5 , 4ในวิธีที่แยกต่างหากเนื่องจากพวกเขาทั้งหมดผ่านการทดสอบครั้งแรก (ไม่มีเหตุผลที่จะใช้ 2 หรือ 3 เพราะเรารู้ว่ามันต้องอยู่ในชุดพื้นฐาน) และทำต่อไปเรื่อย ๆ จนกว่าเราจะรวบรวมทุกเวอร์ชั่นที่สามารถจบได้ สิ่งนี้จะสร้างโซลูชันที่ครอบคลุมทั้งหมดซึ่งจะค้นพบชุดข้อมูลพื้นฐานมากกว่าหนึ่งชุด
อีกสิ่งหนึ่งเนื่องจากเรารู้ว่าเราไม่สามารถมีการซ้ำซ้อนได้มากกว่าหนึ่งครั้งหากกรณีมีน้อยที่สุดเราจึงสามารถรวมสิ่งนี้ในอัลกอริทึมของเรา
โดยรวมแล้วเงื่อนไขในขั้นตอนที่ 4 ที่ตัวเลขจะต้องทำซ้ำในทุกกลุ่มหรือมีความสามารถในการสร้างผลรวมนั้นแข็งแกร่งพอที่จะทำให้เราหลุดพ้นจากแหล่งน้ำแบบเอ็กซ์โพเนนเชียลโดยตรงซึ่งจะเป็นอัลกอริทึมของ กำหนดให้แต่ละจนกว่าเราจะพบการแข่งขัน