Berücksichtigen Sie bei einem Multiset von natürlichen Zahlen X die Menge aller möglichen Summen:
Zum Beispiel, während Summen ( { 1 , 1 } ) = { 0 , 1 , 2 } .
Was ist der effizienteste Algorithmus zur Berechnung der inversen Operation (gemessen an der Größe des eingegebenen Summensatzes)? Insbesondere ist es möglich, Folgendes effizient zu berechnen:
- Gibt an, ob eine bestimmte Menge eine gültige Menge von Summen ist. (Beispielsweise ist gültig, { 0 , 1 , 3 } jedoch nicht.)
- Ein Multiset, das sich zu dem angegebenen Set summiert.
- Das kleinste Multiset, das sich zu dem angegebenen Set summiert. (Zum Beispiel ergeben und { 1 , 1 , 1 } beide { 0 , 1 , 2 , 3 } , ersteres ist jedoch kleiner.)
algorithms
optimization
combinatorics
integers
Uri Granta
quelle
quelle
Antworten:
Lösung
Lösung besteht aus zwei Teilen. Zuerst entdecken wir die minimale Menge, dann beweisen wir, dass sie die Potenzsummenmenge darstellen kann. Die Lösung ist auf die Implementierung der Programmierung abgestimmt.
Minimaler eingestellter Algorithmus
Finden Sie das maximale Element aus der Summenmenge (Multi). P , die mögliche minimale (Multi) Menge ist anfänglich leer.am P
Wenn es nicht nur eine Gruppe gibt, repräsentiere auf alle möglichen Arten als ein Paar von Summen, die sich zu einem m summieren , S i j = { ( a i , a j ) | a i + a j = a m }am am Sich j= { ( aich, einj) | einich+ aj= am}
Überprüfen Sie, ob alle Elemente aus dem Summensatz enthalten sind.
Finden Sie das maximale Element aus allen S i j (Bedeutung zusammen) mit der folgenden Eigenschaft: Für jedes S i j ist a s entweder in S i j , oder wir können ein p aus der Menge der Summen finden, so dass ein p + a s ist in S i j .eins Sich j Sich j eins Sich j einp einp+ as Sich j
Wenn dies der Fall ist , die enthält nicht ein s , nur die Summe a s + a p , entfernen Sie ein p + a s von S i j (oder einem Satz nur eine Marke , es zu ignorieren) , und legen Sie ein p und eine s in S i j statt.Sich j eins eins+ ap einp+ as Sich j einp eins Sich j
Wenn in jedem ein Element vorhanden ist, entfernen Sie es einmal aus allen S i j (oder setzen Sie einfach eine Markierung, um es zu ignorieren und nicht mehr zu berühren) und fügen Sie es der Liste der Elemente der potenziellen minimalen Menge P hinzu .Sich j Sich j P
Wiederholen, bis alle leer sindSich j
Wenn ein Teil von nicht leer bleibt und wir nicht weitermachen können, versuchen Sie es erneut mit dem Maximalwert von allen S i j .Sich j Sich j
Erstellen Sie die rekursiven Schritte erneut, ohne sie zu entfernen, und fahren Sie mit dem Algorithmus zum Festlegen der Netzabdeckung über . (Zuvor können Sie sicher stellen, dass P alle Elemente enthält, die nicht als Summe von zwei Elementen dargestellt werden können. Sie müssen sich also auf jeden Fall in der zugrunde liegenden Menge befinden. Beispielsweise muss sich das minimale Element in P befinden .)P P P
(10. Beachten Sie, dass eine minimale Mengenlösung, die das Ziel des Algorithmus ist, nicht mehr als eine Wiederholung derselben Zahl enthalten kann.)
Beispiel:
Stellen Sie 15 auf alle möglichen Arten als Summe von zwei Zahlen aus dem Summensatz dar.
Versuchen Sie, die maximale Anzahl zu finden, die in allen Gruppen enthalten ist oder als Summe dargestellt werden kann. Offensichtlich können wir ab 8 anfangen, danach zu suchen, es macht keinen Sinn, darüber hinauszugehen.
13 aus der ersten Gruppe ist 13 = 8 + 5, also ist 13 in Ordnung, aber 12 aus der zweiten Gruppe ist nicht in Ordnung, da es keine 4 gibt, die 12 = 8 + 4 in der Summe ergibt. Als nächstes versuchen wir es mit 7. Aber sofort können 13 nicht abgedeckt werden, es gibt keine 6.
Als nächstes versuchen wir 5. 13 = 5 + 8, 12 = 5 + 7, 10 = 5 + 5 und für das letzte entweder 8 = 5 + 3 oder 7 = 5 + 2, aber nicht beide. Die Gruppen sind jetzt:
5 wird in allen Gruppen wiederholt, daher extrahieren wir es . Wir extrahieren 5 nur einmal aus jeder Gruppe.P= { 5 }
Offensichtlich gibt es keinen Grund, mehr als 5 zu erreichen, also versuchen wir es erneut mit 5. 8 = 5 + 3, 7 = 5 + 2, also ist alles in Ordnung
Extrahieren Sie erneut eine 5 aus allen Gruppen, da diese wiederholt wird. (Dies ist nicht üblich, aber unser Fall wurde absichtlich erstellt, um anzuzeigen, was bei Wiederholungen zu tun ist.)P= { 5 , 5 }
Jetzt versuchen wir es mit 3 und haben 5 = 3 + 2. Fügen Sie es der Gruppe hinzu.
Nun extrahiere 3 und 2, da sie sich überall wiederholen und es uns gut geht. und die Gruppen sind leer.P= { 5 , 5 , 3 , 2 }
Jetzt müssen wir rekursive Schritte ohne Entfernungen neu erstellen. Dies bedeutet einfach, dass wir die obigen Schritte ausführen, ohne die Elemente wirklich aus entfernen, indem wir sie in P platzieren und markieren, um sie nicht mehr zu ändern.Sich j P
( ( 5 , 8 ) , 2 ) , ( ( 5 , 7 ) , 3 ) , ( ( 5 , 5 ) , 5 ) , ( ( 5 , 3 ) , 7
Netzgerätedeckung
Der Zweck dieses Teils besteht darin, zu überprüfen, ob die gefundene minimale Menge die eingestellte Leistungssumme abdecken kann. Es ist möglich, dass eine gefundene Lösung alle angegebenen Summen abdeckt, es sich jedoch nicht um Leistungssummen handelt. (Technisch gesehen können Sie einfach eine Potenzsummenmenge aus der gefundenen Minimalmenge erstellen und prüfen, ob jede Summe, wie es die Potenzmenge vorschreibt, in der Anfangssummenmenge enthalten ist. Dies ist alles, was nur mit dem zusammengeführt wird, was wir bereits haben, sodass nichts verschwendet wird Sie können diesen Teil ausführen, während Sie die Rekursion zurückspulen.)
mit der Kodierung: 2 mit 1, 3 mit 2, 5 mit 4 und weitere 5 mit 8. Beachten Sie, dass jedes Element eine andere Kodierung hat, obwohl sie wiederholt werden.
Wenn eine binäre Darstellung der nicht gefundenen Summe entspricht, geben Sie an, dass es keine Lösung gibt.
Diskussion
Es musste der Algorithmus angegeben werden, mit dem überprüft werden soll, ob die Summen die Vervollständigung des Leistungssatzes abdecken, was in der binären Erweiterung verborgen ist. Wenn wir beispielsweise 8 und 7 vom ursprünglichen Beispiel ausschließen, liefert der erste Teil immer noch die Lösung, nur der zweite Teil meldet fehlende Summenkombinationen.
Teile des Algorithmus gehen davon aus, dass wir das Summenpaar in linearer Zeit finden können und dies eine Sortierung erfordert.
Falscher Start
Der Zweck dieses Algorithmus ist es, eine Lösung bereitzustellen, sobald wir alles richtig gestartet haben.
Verbesserungen
Schritt 4. ist derjenige, der auf diese Weise aufgerüstet werden könnte: Statt maximal könnten wir jedes Element in absteigender Reihenfolge ausprobieren, das die gegebene Bedingung erfüllt. Wir erstellen für jeden eine eigene Filiale. Wenn ein Zweig keine Lösung liefert, brechen Sie sie ab.
Eine andere Sache ist, dass wir wissen, dass wir nicht mehr als eine Wiederholung haben können, wenn der Fall minimal ist. Wir können dies in unseren Algorithmus integrieren.
Insgesamt ist die Bedingung in Schritt 4, dass sich eine Zahl in jeder Gruppe wiederholen muss oder die Fähigkeit hat, eine Summe zu erstellen, stark genug, um uns aus direkten exponentiellen Gewässern herauszuholen. Dies wäre ein Algorithmus, bei dem einfach jede Kombination ausprobiert und die Leistung erzeugt wird setze über jedes, bis wir eine Übereinstimmung finden.
quelle
HINWEIS: Dies funktioniert im Allgemeinen nicht ganz, siehe das nachstehende Gegenbeispiel von Uri.
quelle