Per fare ciò su un elenco che non è stato ordinato richiederebbe un algoritmo che è peggio di O (n log n), che è il migliore che si possa sperare di ordinare l'elenco in primo luogo, cioè su un unsorted la lista O (n log n) è la migliore.
Tuttavia, va detto che l'ordinamento è un'operazione che deve essere eseguita solo una volta, quindi è possibile ordinare l'elenco e successivamente aggiungere direttamente gli elementi successivi nella sua posizione ordinata per mantenere un elenco ordinato che è un'operazione che richiede solo O (n) tempo. In alternativa, se gli elementi sono inizialmente inseriti in modo tale da mantenere un array ordinato, non sarà necessario eseguire un ordinamento in seguito.
Quindi la vera domanda qui è: qual è il momento migliore per scegliere i m numeri da una serie di n numeri tale che l'insieme di m numeri ha una differenza minima tra max e min dato che l'array n è ordinato ?
Come si vede, questo può essere fatto nel tempo O (n). Lo pseudoalgoritmo è il seguente:
Given array of size n called A_n containing input
Init values currentMin and currentMax
Init values bestDifference and bestDifferenceIndex
for i = 0, i <= n - m
currentMin = A_n[i]
currentMax = A_n[i + m - 1]
if i = 0 or currentMax - currentMin < bestDifference
bestDifference = currentMax - currentMin
bestDifferenceIndex = i
Alla fine di questo usando come input il tuo esempio, bestDifference dovrebbe mostrare 5 e bestDifferenceIndex sarà 0 (l'ordinata A_n sarebbe {5, 7, 10, 10, 12, 22}, il che significa che ha afferrato {5, 7, 10, 10}).
È un po 'fuorviante chiamare questo O (n log n) perché questo non è dovuto all'algoritmo stesso, ma piuttosto al tipo necessario perché l'algoritmo funzioni correttamente e che esegua l'ordinamento ogni volta garantendo comunque di funzionare sempre sarà sicuramente più lento rispetto a quando hai lavorato con un array pre-ordinato e hai evitato la chiamata per ordinarlo del tutto.
Spero che ti aiuti!