PHP größte ganze Zahl aus Summe unsortierter Array

8

Kann mir jemand sagen, wie man die größte ganze Zahl, die aus einem unsortierten Array summiert wird, am besten findet?

z.B.

%Vor%

Danke

Aktualisieren

Ich habe die Methode, die ich verwendet habe, akzeptiert, aber einige der folgenden werden programmatisch korrekt sein

    
Matt 01.06.2011, 18:24
quelle

6 Antworten

3

Ich würde vorschlagen, das ganze Array zu summieren und dann die kleinste Summe mit dem Dezimalteil zu finden, der dem der gesamten Summe entspricht. Wenn die Zahlen nicht eine sehr hohe Genauigkeit nach dem Dezimalpunkt haben, was auch immer der Ansatz zum Finden der genauen Zahl ist, sollte diese Umkehr viel Rechenleistung einsparen.

Auch das Sortieren des Arrays und das Gierige aus den kleinsten Zahlen ergeben gute Ergebnisse. Die optimale Lösung hängt jedoch stark von der Art der ursprünglichen Menge ab. Könnten Sie näher spezifizieren, welche Art von Zahlen Sie erwarten?

    
David Miler 01.06.2011, 21:10
quelle
1

Der Großteil dieses Codes dient zum Abrufen der Permutationen eines Arrays. Ich bin mir sicher, dass es optimiert werden kann, aber das berechnet 3 Arrays mit Längen von 4, 5 und 6 in 45ms auf einem einzelnen Xeon-Quad-Core-Server. Springt auf etwa 220 ms, wenn ich ein viertes Array mit 7 Dezimalstellen hinzufüge, und satte 2 Sekunden, wenn ich ein Fünftel mit 8 hinzufüge.

Im Grunde werden alle Permutationen des Arrays, das die Floats enthält, abgerufen, und jedes einzelne wird Schlüssel für Schlüssel addiert, und wenn die Summe eine ganze Zahl größer als die aktuelle ganze Zahl ist, wird diese Zahl aktualisiert. Schließlich die größtmögliche Anzahl zurückgeben.

%Vor%

Das Guthaben für die Array-Permutationsfunktion geht an dirk dot avery a t gmail at http://php.net/manual/en/function.shuffle.php

    
Mahdi.Montgomery 01.06.2011 19:57
quelle
0

so etwas?

%Vor%

EDIT: @Felix Kling du hast absolut recht, eine while-Schleife hinzugefügt

    
Trey 01.06.2011 18:29
quelle
0

Ich habe den Code dafür nicht geschrieben, aber der Pseudo-Code ist unten. Die allgemeine Idee ist, dass Sie Kombinationen berechnen (x wählen y ... Ссылка ) und dann jede dieser Kombinationen summieren. Sie durchlaufen dies für die Länge des Arrays und nehmen dann Ihre max.

Ich bin mir auch sicher, dass es Optimierungen gibt, gierig zu sein und diese Schleife kurzzuschließen.

%Vor%     
Ben Roux 01.06.2011 18:50
quelle
0

OK darüber nachzudenken.

%Vor%

Ich habe die oben genannten, aber es muss einen einfacheren Weg geben, es zu tun?

    
Matt 01.06.2011 18:56
quelle
0

Das ist ein großes Problem, über das man nachdenken sollte. Aus der Spitze meines Kopfes, das ist der Pseudocode, den ich verwenden würde:

  1. A = Array von Elementen.
  2. A '= sortiertes Array von Elementen.
  3. S = Summe aller Elemente.
  4. Während A 'nicht leer ist:
    1. V = ganzzahliger Teil von S.
    2. R = Rest von S = S - Stock (S)
    3. Erstellen Sie eine temporäre Kopie von A ', X.
    4. Iterate von größten zu kleinsten Werten von X als X [i]:
      1. Wenn X [i] & lt; R, subtrahiere X [i] von R. Entferne X [i] von X.
      2. Wenn R == 0, haben wir die Lösung gefunden. V ist die ganze Zahl, X enthält die Summanden. STOP.
    5. Wenn X leer ist, gibt es keine Lösung. STOP.
    6. Reduziere S um den größten Wert in A '. S = S - Max (A '). Entferne Max (A ') von A'.
  5. Gehen Sie zurück zu Schritt 4.

Natürlich musste ich sehen, ob das tatsächlich funktionieren würde. Hier ist der (sehr unordentliche, Wegwerf-Qualität) Code, den ich geschrieben habe, um es zu testen:

%Vor%

Es ist ein hässlicher O (N ^ 2) Algorithmus, aber er sollte korrekt sein. Kann jemand ein anfängliches Array sehen, wo dies fehlschlagen würde?

Aus Spaß habe ich mit einem Array von 50 Elementen versucht und die erste Zeile durch folgende Zeilen ersetzt:

%Vor%

Auf einen Blick sieht es richtig aus - ich überlasse die Bestätigung jemand anderem;)

    
dossy 01.06.2011 20:45
quelle

Tags und Links