Angenommen, ich habe Ganzzahlen mit fester Breite (dh sie passen in ein Register der Breite w ), a 1 , a 2 , ... a n, so dass ihre Summe a 1 + a 2 + ⋯ + a n = S auch in ein Register passt der Breite w .
Es scheint mir, dass wir die Zahlen immer auf vertauschen können, so dass jede Präfixsumme S i = b 1 + b 2 + ⋯ + b i auch in ein Register der Breite w passt .
Grundsätzlich besteht die Motivation darin, die Summe auf Registermaschinen mit fester Breite zu berechnen , ohne sich in irgendeiner Zwischenstufe um Ganzzahlüberläufe sorgen zu müssen.
Gibt es einen schnellen (vorzugsweise linearen) Algorithmus, um eine solche Permutation zu finden (unter der Annahme des als Eingabearray gegeben ist)? (oder sagen Sie, wenn eine solche Permutation nicht existiert).
quelle
-2^(n-1)
bis auswählen2^(n-1)-1
. Es erfordert natürlich das Zweierkomplement und ein klar definiertes Überlaufverhalten, aber in einer Sprache wie C # sollte es funktionieren.Antworten:
Strategie0 , während die Zugabe durchgeführt wird .
Der folgende Linearzeitalgorithmus verwendet die Strategie, um schweben , indem entweder positive oder negative Zahlen basierend auf dem Vorzeichen der Teilsumme ausgewählt werden. Die Liste der Nummern wird vorverarbeitet. Es berechnet die Permutation der Eingabe im laufenden Betrieb
Algorithmus
Richtigkeit
Richtigkeit kann durch ein einfaches induktives Argument über die Länge der Zahlenliste festgestellt werden.
Beweisen Sie zunächst, dass, wenn alle positiv (oder alle negativ) sind und ihre Summe keinen Überlauf verursacht, auch die Präfixsummen nicht. Das ist unkompliziert.a1,…,an
Nun kann das erste Ergebnis angewendet werden, und zusammen reichen diese Ergebnisse aus, um zu beweisen, dass die Summe niemals über die Grenzen hinausgeht.
quelle