อัลกอริทึมที่มีประสิทธิภาพสำหรับ 'unsumming' ชุดจำนวนเงิน


24

รับชุดของตัวเลขธรรมชาติ X พิจารณาชุดของผลรวมที่เป็นไปได้ทั้งหมด:

sums(X)={iAi|AX}

ยกตัวอย่างเช่นsums({1,5})={0,1,5,6}ในขณะที่ sums({1,1})={0,1,2} }

อัลกอริธึมที่มีประสิทธิภาพมากที่สุดสำหรับการคำนวณการดำเนินการผกผันคืออะไร โดยเฉพาะมันเป็นไปได้ที่จะคำนวณอย่างมีประสิทธิภาพต่อไปนี้:

  1. ไม่ว่าจะเป็นชุดที่กำหนดเป็นชุดผลรวมที่ถูกต้อง (ตัวอย่างเช่น{0,1,2}ถูกต้อง แต่{0,1,3}ไม่ถูกต้อง)
  2. เซ็ตมัลติเซตที่รวมกับเซ็ตที่กำหนด
  3. ชุดมัลติเซ็ตที่เล็กที่สุดที่รวมกับเซ็ตที่กำหนด (ตัวอย่างเช่น{1,2}และ{1,1,1}ทั้งผลรวมเป็น{0,1,2,3}แต่ตัวเก่ามีขนาดเล็กลง)

1
คุณอาจจะให้เราMultiSetของผลบวกมากกว่าชุดของผลบวก? สิ่งนี้จะสร้างความสมมาตรที่น่าพอใจ (ดูเมื่อคุณเริ่มต้นด้วยหลายค่า)
DW

1
คำถามอื่น - คุณสนใจผลทางทฤษฎีมากที่สุด (เช่นความซับซ้อนเชิงซีโมติก) หรือวิธีแก้ปัญหาที่ใช้งานจริง หากหลังคุณมีความคิดเกี่ยวกับค่าทั่วไปสำหรับพารามิเตอร์: เช่นขนาดของ Multiset X ขนาดขององค์ประกอบที่ใหญ่ที่สุดใน Multiset X ซึ่งเป็น multiplicity สูงสุดหรือไม่ สิ่งนี้อาจส่งผลต่อว่าสมควรใช้“ ค้อนใหญ่” เช่นตัวแก้ ILP หรือตัวแก้ SAT
DW

@DW ฉันสนใจที่จะใช้ชุดของผลรวมมากกว่า Multiset (แม้ว่าอาจเป็นปัญหาที่น่าสนใจเช่นกัน) และนี่ก็เป็นปัญหาคณิตศาสตร์เชิงนันทนาการด้วยดังนั้นฉันจึงสนใจในขอบเขตที่ซับซ้อนมากกว่าการแก้ปัญหาภาคปฏิบัติ
Uri Granta

3
หากคุณได้รับผลรวมจำนวนหลายชุดคุณจะต้องทำแบบนี้อย่างตรงไปตรงมา (ดูตัวอย่างmath.stackexchange.com/questions/201545/… )
jschnei

@UriZarfaty ชุดที่กำหนดเป็นอินพุทได้รับการจัดเรียงแล้ว? ในที่สุดนี้มีการตั้งค่าหรือหลายชุด? ความคิดเห็นยังแนะนำว่าคุณต้องการชุดบริสุทธิ์
Evil

คำตอบ:


9

วิธีการแก้

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

อัลกอริทึมชุดน้อยที่สุด

  1. ค้นหาองค์ประกอบสูงสุดจากชุดผลรวม (หลาย) Pชุดเริ่มต้นที่น้อยที่สุด (หลายชุด) นั้นว่างเปล่าamP

  2. เว้นแต่จะมีเพียงกลุ่มหนึ่งแทนในรูปแบบที่เป็นไปได้ทั้งหมดเป็นคู่ของจำนวนเงินที่เพิ่มขึ้นเป็นเมตร , S ฉันJ = { ( ฉัน , J ) | a i + a j = a m }amaม.SผมJ={(aผม,aJ)|aผม+aJ=aม.}

  3. ตรวจสอบว่ามีองค์ประกอบทั้งหมดจากชุดผลรวม

  4. หาองค์ประกอบสูงสุดsจากS ฉันJ (ความหมายร่วมกัน) ที่มีคุณสมบัติดังต่อไปสำหรับแต่ละS ฉันเจ , sเป็นทั้งในS ฉันเจหรือเราสามารถหาPจากชุดของผลรวมเพื่อให้P +asSผมJSผมJasSผมJaพีอยู่ใน S ฉันเจaพี+asSผมJ

  5. ถ้าเป็นกรณีที่ไม่ได้มีsเพียงผลรวมs + PลบP + sจากS ฉันJ (หรือเพียงแค่ตั้งเครื่องหมายจะไม่สนใจมัน) และแทรกพีและSผมJasas+aพีaพี+asSผมJaพีใน S i jแทนasSผมJ

  6. หากองค์ประกอบมีอยู่ในทุก ๆSผมJลบออกจากทุกครั้งเดียว (หรือเพียงแค่ทำเครื่องหมายไว้ที่จะไม่สนใจมันและไม่จะสัมผัสมันได้อีกต่อไป) และเพิ่มลงในรายการขององค์ประกอบของที่มีศักยภาพน้อยที่สุดชุดPSผมJP

  7. ทำซ้ำจนกว่าทั้งหมดจะว่างเปล่าSผมJ

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

  9. สร้างขั้นตอนโดยไม่ต้องเวียนเกิดการลบและต่อด้วยขั้นตอนวิธีการคุ้มครองชุดอำนาจเหนือ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ผมJP

( ( 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))

ความคุ้มครองชุดไฟ

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

  1. เข้ารหัสองค์ประกอบทั้งหมดจากชุดขั้นต่ำโดยใช้พลังต่อเนื่องของ 2 คำสั่งไม่สำคัญ เข้ารหัสองค์ประกอบเดียวกันด้วยค่าใหม่หลาย ๆ ครั้งตามที่ทำซ้ำ เริ่มจาก C = 1 ทุกองค์ประกอบถัดไปจะมี C = 2C

(2=[1],3=[2],5=[4],5=[8])
  1. แทนที่องค์ประกอบในรายการเรียกคืนที่เรียกคืน

((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. รวบรวมผลรวมกลางทั้งหมดในขณะนี้เรามี (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)}
  1. Check that the result is 2m1, where m is the number of elements in the solution, in the example m=4

  2. Collect missing numbers from 1 to 2m1 in the intermediate sum list

(6,7,11,12)

  1. 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 ที่ตัวเลขจะต้องทำซ้ำในทุกกลุ่มหรือมีความสามารถในการสร้างผลรวมนั้นแข็งแกร่งพอที่จะทำให้เราหลุดพ้นจากแหล่งน้ำแบบเอ็กซ์โพเนนเชียลโดยตรงซึ่งจะเป็นอัลกอริทึมของ กำหนดให้แต่ละจนกว่าเราจะพบการแข่งขัน


1
กว้างกว่า: ฉันเห็นคำอธิบายเกี่ยวกับใจของอัลกอริทึม แต่ (a) ไม่มีการปลอมและ (b) ไม่มีข้อพิสูจน์ความถูกต้อง ทำไมคุณคิดว่าวิธีการนี้ให้อัลกอริทึมที่ทำงานอย่างถูกต้องกับอินพุตที่เป็นไปได้ทั้งหมด อะไรคือเหตุผล? คุณมีหลักฐานของความถูกต้องสำหรับสิ่งนี้หรือไม่?
DW

ฉันคิดว่าปัญหาใช้เวลาทำงานร่วมกันประมาณ 30 ชั่วโมง (อัตรา 30 ครั้งต่อชั่วโมงก็ดี ... ) แต่ไม่มีตัวเลือกการจ่ายเงิน

ในที่สุดอ่านคำตอบในรายละเอียดที่สมควรได้รับ การทำงานที่ดี!
Uri Granta

1

หมายเหตุ: วิธีนี้ใช้งานไม่ได้โดยทั่วไปดูตัวอย่าง counter ของ Uri ด้านล่าง

วิธีหนึ่งในการบรรลุอย่างน้อย 1 และ 2 สำหรับชุดที่กำหนด Y (ขั้นต่ำต้องปรับแต่งเล็กน้อย) คือ (การเรียงลำดับ Y ก่อนถ้าจำเป็น):

  • ตรวจสอบว่า 0Y. ถ้าไม่มีก็ไม่มีทางแก้
  • ปล่อย Y เป็นจำนวนบวกที่เล็กที่สุดใน Y. แล้วก็Y จะต้องอยู่ใน Xหากมีอยู่ (ไม่เช่นนั้นจะเป็นผลรวมของจำนวนบวกที่น้อยกว่าซึ่งจะเกิดขึ้นด้วย Y)
  • ปล่อย Z1<<Zn เป็นสมาชิกที่เหลือของ Y. เราจะพยายามหาชุดY' ดังนั้น Y=Y'+{0,Y}. อย่างชัดเจน0 จะต้องอยู่ใน Y'. สำหรับผม=1,...,n: ถ้า Zผม+YYเพิ่ม Zผม ไปยัง Y'; มิฉะนั้นถ้าZผม-YYไม่มีทางออก; มิฉะนั้น (เช่นถ้าZผม+YYแต่ Zผม+YY) เราไม่ต้องการ Zผม ใน Y'.
  • ทำซ้ำซ้ำด้วย Y'รวบรวมองค์ประกอบที่น้อยที่สุด Y,Y',...เป็นมัลติเซ็ต นี่คือทางออกของคุณถ้าคุณจบด้วยชุดที่ว่างเปล่า}

ในแต่ละขั้นตอนแบบเรียกซ้ำขนาดของชุดจะลดลงอย่างน้อย 1 (เนื่องจากเราไม่รวมองค์ประกอบที่น้อยที่สุด Y) ดังนั้นจำนวนขั้นตอนจึงเป็น O(n). แต่ละขั้นตอนมีการวนซ้ำหนึ่งครั้งในชุดปัจจุบันสำหรับO(n2) ความซับซ้อนทั้งหมด (สมมติว่าต้นทุนต่อหน่วยสำหรับการดำเนินการทางคณิตศาสตร์)

ค้นหาวิธีแก้ปัญหาที่น้อยที่สุด (โปรดทราบว่านี่ไม่จำเป็นต้องซ้ำกันเช่นสำหรับ Y={0,1,3,4,5,6,7} เรามี {0,1,3,4,6} และ {0,1,3,5,6}) มีส่วนร่วมมากขึ้นเล็กน้อย: หลังจากค้นหาขั้นต่ำ YYคุณจะวิเคราะห์ความก้าวหน้าทางเลขคณิต {a+kY} ใน Yปฏิเสธถ้าหนึ่งในนั้นคือซิงเกิลและเลือกสมาชิกสลับ Y'; หากความก้าวหน้ามีความยาวคี่คุณจะต้องเลือกสมาชิกบางคนที่ต่อเนื่องกันดังนั้นจึงไม่ใช่ความเป็นเอกลักษณ์


เห็นได้ชัดว่า Y 'ไม่ได้นำไปสู่จุดจบ? หลังจากทั้งหมดอาจมีหลาย Y เช่นว่า Y = Y '+ {0, y} ตัวอย่างเช่น {0,1,2,3,4} = {0,2,3} + {0,1} = {0,1,2,3} + {0,1} แต่การสลายตัวในอดีตนำไปสู่ ทางตัน.
Uri Granta

นั่นเป็นเรื่องจริงและเป็นปัญหาที่แท้จริง ฉันจะต้องดูว่าสามารถแก้ไขได้หรือไม่ ขอบคุณ!
Klaus Draeger

@UriZarfaty ฉันสงสัยว่าอัลกอริทึมของ Klaus อาจจะถูกต้องสำหรับกรณีพิเศษที่คุณเริ่มต้นด้วยชุดมากกว่าชุดมัลติเซต (เช่นไม่มีรายการในชุดมัลติมีหลายหลากมากกว่า 1) คุณมีตัวอย่างตัวอย่างหรือไม่? บางทีมันอาจจะน่าสนใจที่จะมองหาอัลกอริทึมสำหรับกรณีพิเศษที่คุณเริ่มต้นด้วยชุดแทนที่จะเป็นชุดมัลติเซต หากมันใช้งานได้กับกรณีนั้นเราอาจจะสามารถทำให้มันเป็นแบบมัลติเซตได้เช่นโดยพยายามหาเซตY' และจำนวนสูงสุด k ดังนั้น Y=Y'+{0,Y,...,Y} ที่ไหน {0,Y,...,Y} มี k สำเนาของ Yจากนั้นเรียกคืน Y'.
DW
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.