Sono interessato a riordinare una lista in modo tale da massimizzare la somma dei quadrati delle differenze tra elementi adiacenti (ciclici). Ecco un pezzo di codice Python che bruta forze la soluzione in tempo fattoriale, in modo da poter capire cosa intendo:Riordino di una lista per massimizzare la differenza di elementi adiacenti
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
Questo produce i seguenti risultati per maximal_difference_reorder(range(4))
:
[(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)]
come si può vedi, tutti i risultati sono rotazioni cicliche e riflessioni l'una dell'altra. Se il punteggio è stato determinato con la somma delle differenze, non al quadrato, credo che tutte le permutazioni sarebbero equamente valutate, dato un input uniformemente distanziato.
La forzatura bruta funziona bene, ma O (n!) È terribile, quindi è possibile farlo in un tempo di calcolo asintotico più piccolo? Punti bonus se funziona per una mesh di input non uniforme o per altre funzioni di punteggio.
Per inciso, questo non è compito o una domanda di intervista, anche se forse sarebbe una buona soluzione. Piuttosto, sto provando a generare uno spettro di colori per una serie di dati parametrizzati, e sto cercando di evitare di avere colori simili l'uno accanto all'altro.
non è una differenza massima quadrato garantito per la gamma (n) la sequenza 0, n-1, 1, n-2, 2, n-3, ...? per esempio. la tua sequenza 0,3,1,2, ad es. 0,4,1,3,2 per intervallo (5), ecc. – barny
Penso che stia parlando di un elenco di numeri casuali.Come [n, 2n + 1, 35n + 4, x, y ...]. –
@barny: no, considera la catena 0,4,5,6,6. Quindi otterrai un punteggio di 66, con il massimo 77 in realtà. La domanda è se immergerti attorno al numero più grande o più piccolo –