Ich möchte eine Liste so neu anordnen, dass die Summe der Quadrate der Differenzen zwischen benachbarten Elementen (zyklisch) maximiert wird. Hier ist ein Stück Python-Code, dass Brute-Kräfte der Lösung in faktorielles Zeit, so können Sie sehen, was ich meine:Neuordnen einer Liste zum Maximieren der Differenz benachbarter Elemente
def maximal_difference_reorder(input):
from itertools import permutations
best_sum = 0
best_orderings = []
for x in permutations(input):
d = np.sum(np.diff(x)**2) + (x[0] - x[-1])**2
if d > best_sum:
best_orderings = [x]
best_sum = d
elif d == best_sum:
best_orderings.append(x)
return best_orderings
Die folgenden Ergebnisse für maximal_difference_reorder(range(4))
ergibt:
[(0, 2, 1, 3),
(0, 3, 1, 2),
(1, 2, 0, 3),
(1, 3, 0, 2),
(2, 0, 3, 1),
(2, 1, 3, 0),
(3, 0, 2, 1),
(3, 1, 2, 0)]
Wie können Sie sehen Sie, alle Ergebnisse sind zyklische Rotationen und Reflexionen von einander. Wenn die Punktzahl mit der Summe der nicht quadrierten Differenzen bestimmt wurde, glaube ich, dass alle Permutationen bei einer gleichmäßig verteilten Eingabe gleichmäßig bewertet würden.
Brute Forcing funktioniert gut, aber O (n!) Ist schrecklich, also ist es möglich, dies in einer kleineren asymptotischen Rechenzeit zu tun? Bonuspunkte, wenn es für ein ungleichmäßiges Eingabegitter oder für andere Bewertungsfunktionen verwendet wird.
Übrigens ist das keine Hausaufgabe oder eine Interviewfrage, obwohl es vielleicht ein guter wäre. Ich versuche vielmehr, ein Farbspektrum für eine Reihe von parametrisierten Daten zu erzeugen, und versuche, ähnliche Farben nebeneinander zu vermeiden.
Ist das nicht eine maximale quadratische Abweichung garantierte für Bereich (n) durch die Folge 0, n-1, 1, n-2, 2, n-3, ...? z.B. Ihre 0,3,1,2-Sequenz, z.B. 0,4,1,3,2 für den Bereich (5) usw. – barny
Ich denke, er spricht über eine Liste von Zufallszahlen. Wie [n, 2n + 1, 35n + 4, x, y ...]. –
@ barny: nein, betrachte die Kette 0,4,5,6,6. Dann erhalten Sie eine Punktzahl von 66, wobei das Maximum 77 ist. Die Frage ist, ob man um die größte oder kleinste Zahl dipserse –