रकम का एक सेट '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
क्या आप संभवतः हमें रकम के सेट के बजाय रकम की बहुतायत दे सकते हैं ? यह एक मनभावन समरूपता पैदा करेगा (जैसा कि आप मूल्यों की एक बहु श्रृंखला के साथ शुरू करते हैं)।
डीडब्ल्यू

1
एक और सवाल - क्या आप सैद्धांतिक परिणामों (जैसे, स्पर्शोन्मुख जटिलता), या व्यावहारिक समाधान (योजनाएं जो व्यवहार में ठीक काम कर सकती हैं) में सबसे अधिक रुचि रखते हैं? यदि उत्तरार्द्ध, क्या आपके पास मापदंडों के लिए विशिष्ट मूल्यों का विचार है: उदाहरण के लिए, मल्टीसेट एक्स का आकार, मल्टीसेट एक्स में सबसे बड़े तत्व का आकार, उच्चतम गुणन? यह प्रभावित कर सकता है कि क्या ILP सॉल्वर या SAT सॉल्वर की तरह "बड़ा हथौड़ा" लगाना उचित है।
डीडब्ल्यू

@ मैं निश्चित रूप से मल्टीसेट के बजाय रकम के सेट का उपयोग करने में दिलचस्पी रखता हूं (हालांकि यह एक दिलचस्प समस्या भी हो सकती है)। इसके अलावा, यह मूल रूप से एक मनोरंजक गणित समस्या थी, इसलिए मैं व्यावहारिक समाधान के बजाय मुख्य रूप से जटिलता की सीमा में दिलचस्पी रखता हूं।
उड़ी ग्रांट

3
यदि आपको रकम का मल्टीसेट दिया जाता है, तो यह लालच करना बहुत सरल है (उदाहरण के लिए देखें math.stackexchange.com/questions/201545/… )।
jschnei

@UriZarfaty इनपुट के रूप में दिया गया सेट पहले से ही हल है? अंत में यह सेट या मल्टीसेट है? टिप्पणी अभी भी सुझाव है कि आप शुद्ध सेट चाहते हैं।
ईविल

जवाबों:


9

समाधान

समाधान के दो भाग हैं। पहले हम न्यूनतम सेट की खोज करते हैं, फिर हम साबित करते हैं कि यह पावर सम सेट का प्रतिनिधित्व कर सकता है। समाधान प्रोग्रामिंग कार्यान्वयन के लिए समायोजित किया गया है।

न्यूनतम सेट एल्गोरिथ्म

  1. अधिक से अधिक तत्व का पता लगाएं योग (बहु) सेट से। पी , संभावित न्यूनतम (बहु) सेट शुरू में खाली है।amP

  2. जब तक वहाँ केवल एक ही समूह, का प्रतिनिधित्व करते है रकम है कि को जोड़ने की एक जोड़ी के रूप में हर संभव तरीके में एक मीटर , एस मैं j = { ( एक मैं , एक जे ) | एक मैं + एक j = एक मीटर }amamSij={(ai,aj)|ai+aj=am}

  3. जांचें कि रकम के सेट से सभी तत्व शामिल हैं।

  4. अधिक से अधिक तत्व का पता लगाएं सब से एस मैं j निम्नलिखित संपत्ति के साथ (एक साथ अर्थ): प्रत्येक के लिए एस मैं जे , एक रों में या तो है एस मैं j , या हम प्राप्त कर सकते हैं एक पी रकम का सेट इतना है कि से एक पी + एक रों में है एस मैं jasSijSijasSijapap+asSij

  5. यदि यह मामला है कि शामिल नहीं है एक रों , बस राशि एक रों + एक पी , को दूर एक पी + एक रों से एस मैं j (या बस इसे अनदेखा करने के लिए एक निशान सेट) और डालने एकSijasas+apap+asSij और एक s में एस मैं japasSij बजाय।

  6. यदि हर में एक तत्व मौजूद है, तो इसे एक बार सभी S i j से हटा दें (या इसे अनदेखा करने के लिए एक चिह्न सेट करें और इसे किसी भी लंबे समय तक स्पर्श न करें) और इसे संभावित न्यूनतम सेट P के तत्वों की सूची में जोड़ें ।SijSijP

  7. तब तक दोहराएं जब तक सभी खाली न हो जाएंSij

  8. यदि कुछ गैर-रिक्त रहता है और हम जारी नहीं रख सकते हैं, तो सभी S i j से अधिकतम मान के साथ फिर से प्रयास करेंSijSij

  9. हटाने के बिना पुनरावर्ती चरणों को फिर से बनाएँ और पर बिजली सेट कवरेज एल्गोरिथ्म के साथ जारी रखें । (इससे पहले, आप एक सुरक्षित जाँच कर सकते हैं कि 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 ठीक नहीं है क्योंकि रकम के सेट में 12 = 8 + 4 बनाने के लिए कोई 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 में रखना है और इसे किसी भी लंबे समय तक नहीं बदलना है।SijP

( ( 5 , 8 ) , 2 ) , ( ( 5 , 7 ) , 3 ) , ( ( 5 , 5 ) , 5 ) , ( ( 5 , 3 ) , 7

(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. क्रमिक शक्तियों का उपयोग करके न्यूनतम सेट से सभी तत्वों को एन्कोड करें। आदेश महत्वपूर्ण नहीं है। एक ही तत्व को एक नए मान के साथ एनकोड करें जितनी बार यह दोहरा रहा है। 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)

मध्यवर्ती योग (1,2,3,4,5,8,9,10,13,14,15)

{(15),(15),(15),(15)}
  1. जांचें कि परिणाम , जहां मीटर समाधान में तत्वों की संख्या है, उदाहरण में एम = 42m1mm=4

  2. इंटरमीडिएट योग सूची में से 2 मीटर - 1 से लापता संख्याओं को इकट्ठा करें12m1

(6,7,11,12)

  1. निम्नलिखित तरीके से उनकी अनुपस्थिति को सही ठहराते हैं: प्रत्येक संख्या को द्विआधारी रूप में दर्शाते हैं

( 7 = 0111 2 ) ( 11 = 1011 2 ) ( 12 = 1010 2 )(6=01102) (7=01112) (11=10112) (12=10102)

3 + 5 के योग का प्रतिनिधित्व करता है, क्योंकि 0110 2 दूसरे ( तीसरे) तत्व को कवर कर रहा है ( 2 = [ 1 ] , 3 = [ 2 ] , 5 = [ 4 ] , 5 = [ 8 ] ) । इन तत्वों, 8 का योग, प्रारंभिक योग सूची { 2 , 3 , 5 , 7 , 8 , 10 , 12 , 13 , में सूचीबद्ध है, इसलिए सब ठीक है।601102(2=[1],3=[2],5=[4],5=[8]){2,3,5,7,8,10,12,13,15}

2 + 3 + 5 का योग दर्शाता है क्योंकि 0111 2 पहले तीन तत्वों को कवर कर रहा है ( 2 = [ 1 ] , 3 = [ 2 ] , 5 = [ 4 ] , 5 = [ 8 ] )701112(2=[1],3=[2],5=[4],5=[8]) । इन तत्वों का योग, 10, प्रारंभिक राशि सूची में सूचीबद्ध है, इसलिए सब ठीक है।

2 + 3 + 5 है, और 10 सूची में है। 121112 3 + 5 है, और 8 सूची में है।

यदि कोई बाइनरी प्रतिनिधित्व उस राशि से मेल खाता है जो नहीं मिल सकता है, तो रिपोर्ट करें कि कोई समाधान नहीं है।

तो सब ठीक है और (2,3,5,5) समाधान है। यह न्यूनतम उपाय भी है।

विचार-विमर्श

यह सुनिश्चित करने के लिए आवश्यक था कि एल्गोरिदम यह जांचने के लिए जा रहा है कि क्या रकम पावर सेट पूरा होने को कवर करती है, जो कि बाइनरी विस्तार में छिपी हुई है। उदाहरण के लिए यदि हम प्रारंभिक उदाहरण से 8 और 7 को बाहर करते हैं, तो पहला भाग अभी भी समाधान प्रदान करेगा, केवल दूसरा भाग गुमशुदा संयोजनों की रिपोर्ट करेगा।

संभावित न्यूनतम सेट की खोज का पहला भाग जो m log 2 ( m ) पर आता है : हम m तत्वों n बार एक लॉग ( m ) बाइनरी खोज के आसपास देख रहे हैं ।mnlog(m)mlog2(m)mnlog(m)

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.

एल्गोरिथ्म के कुछ हिस्सों का मानना ​​है कि हम रैखिक समय में रकम की जोड़ी पा सकते हैं और इसके लिए छंटाई की आवश्यकता होती है।

गलत शुरुआत

2,3,4,5,6,7,8,9,10,11,12,13,152,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, which we got simply by turning 6 into 4 and 2 in the solution 2,3,4,6. There are special rules that cover these versions.

The purpose of this algorithm is to provide a solution once we have started it all correctly.

Improvements

Step 4. is the one that could be upgraded in this manner: instead of maximal we could try out every element in descending order that satisfies the given condition. We create a separate branch for each. If some branch does not give a solution, cancel it.

For example for 2,3,4,5,6,7,8,9,10,11,12,13,15 we could try in the first round 7,6,5,4 in separate ways since all of them are passing the first test. (There is no reason to use 2 or 3 since we know they have to be in the underlying set.) and simply continue that way all around until we collect all versions that can reach the end. This would create a full-coverage solution which would discover more than one underlying set.

Another thing, since we know that we cannot have more than one repetition if the case is minimal, we can incorporate this in our algorithm.

Overall, the condition in step 4. that a number must repeat in every group or have ability to create a sum is strong enough to get us out of direct exponential waters, which would be an algorithm of simply trying out every combination and creating the power set over each until we find a match.


1
More broadly: I see a textual description of an algorithm, but (a) no pseudocode, and (b) no proof of correctness. Why do you think that this approach provides an algorithm that will work correctly on all possible inputs? What's the justification? Do you have a proof of correctness for this?
D.W.

I think the problem has taken around 30 hours of work all together (30 times hourly rate, well...). But there is no paid option.

Finally read the answer in the detail it deserved. Great work!
Uri Granta

1

NOTE: This does not quite work in general, see Uri's counterexample below.

One way of achieving at least 1. and 2. for a given set Y (minimality requires a bit of tweaking) is (sorting Y first, if necessary):

  • Check whether 0Y. If not, there is no solution.
  • Let y be the smallest positive number in Y. Then y must also be in X, if it exists (otherwise it would be the sum of smaller positive numbers, which would also occur in Y).
  • Let z1<<zn be the remaining members of Y. We will try to find a set Y such that Y=Y+{0,y}. Obviously 0 must be in Y. For i=1,,n: if zi+yY, add zi to Y; otherwise, if ziyY, there is no solution; otherwise (i.e. if zi+yY, but zi+yY), we don't need zi in Y.
  • Repeat recursively with Y, collecting the minimal elements y,y, into a multiset. This is your solution iff you end up with an empty set.}

In each recursive step, the size of the set decreases by at least 1 (since we exclude the least element y), so the number of steps is in O(n). Each step contains a single iteration over the current set, for an O(n2) total complexity (assuming unit costs for arithmetic operations).

Finding a minimal solution (note that this is not necessarily unique; for example, for Y={0,1,3,4,5,6,7} we have {0,1,3,4,6} and {0,1,3,5,6}) is slightly more involved: after finding the minimum yY, you would analyze the arithmetic progressions {a+ky} in Y, reject if one of them is a singleton, and otherwise pick alternating members for Y; if a progression has odd length, you need to pick some pair of successive members, hence the non-uniqueness.


Is it obvious that Y' doesn't lead to a dead end? After all there can be many Y's such that Y=Y'+{0,y}. For example {0,1,2,3,4} = {0,2,3}+{0,1} = {0,1,2,3}+{0,1} but the former decomposition leads to a dead end.
Uri Granta

That is true, and is a real problem. I'll have to see if it can be fixed. Thanks!
Klaus Draeger

@UriZarfaty, I wonder if Klaus's algorithm might be correct for the special case where you start with a set rather than a multiset (i.e., no item in the multiset has multiplicity more than 1). Do you have a counterexample? Maybe it's interesting to first look for an algorithm for the special case where you start with a set rather than a multiset. If it works for that case, we might be able to generalize it to work for a multiset, e.g., by trying to find a set Y and a maximal number k such that Y=Y+{0,y,,y} where {0,y,,y} contains k copies of y, then recurse on Y.
D.W.
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.