Ecco il pseudo-codice che dovrebbe essere convertibile in qualsiasi linguaggio procedurale:
array = [2, 42, 82, 122, 162, 202, 242, 282, 322, 362]
number = 112
print closest (number, array)
def closest (num, arr):
curr = arr[0]
foreach val in arr:
if abs (num - val) < abs (num - curr):
curr = val
return curr
Funziona semplicemente le differenze assolute tra il numero dato e ogni elemento dell'array e restituisce uno di quelli con il differenza minima.
Per i valori di esempio:
number = 112 112 112 112 112 112 112 112 112 112
array = 2 42 82 122 162 202 242 282 322 362
diff = 110 70 30 10 50 90 130 170 210 250
|
+-- one with minimal absolute difference.
Come una prova di concetto, ecco il codice Python che ho usato per mostrare in azione:
def closest (num, arr):
curr = arr[0]
for index in range (len (arr)):
if abs (num - arr[index]) < abs (num - curr):
curr = arr[index]
return curr
array = [2, 42, 82, 122, 162, 202, 242, 282, 322, 362]
number = 112
print closest (number, array)
E, se si davvero bisogno in Javascript, vedi sotto per un file HTML completo che dimostra la funzione in azione:
<html>
<head></head>
<body>
<script language="javascript">
function closest (num, arr) {
var curr = arr[0];
var diff = Math.abs (num - curr);
for (var val = 0; val < arr.length; val++) {
var newdiff = Math.abs (num - arr[val]);
if (newdiff < diff) {
diff = newdiff;
curr = arr[val];
}
}
return curr;
}
array = [2, 42, 82, 122, 162, 202, 242, 282, 322, 362];
number = 112;
alert (closest (number, array));
</script>
</body>
</html>
Ora tenere a mente ci può essere spazio per una maggiore efficienza se, ad esempio, i vostri elementi di dati sono ordinati (che potrebbe essere dedotto dai dati di esempio, ma voi non esplicitamente dichiararlo). Ad esempio, è possibile utilizzare una ricerca binaria per trovare l'elemento più vicino.
Si deve anche tenere a mente che, a meno che non avete bisogno di farlo molte volte al secondo, i miglioramenti di efficienza saranno prevalentemente unnoticable a meno che i set di dati ottengono molto più grande.
Se fai vogliono provare in questo modo (e in grado di garantire l'array è ordinato in ordine crescente), questo è un buon punto di partenza:
<html>
<head></head>
<body>
<script language="javascript">
function closest (num, arr) {
var mid;
var lo = 0;
var hi = arr.length - 1;
while (hi - lo > 1) {
mid = Math.floor ((lo + hi)/2);
if (arr[mid] < num) {
lo = mid;
} else {
hi = mid;
}
}
if (num - arr[lo] <= arr[hi] - num) {
return arr[lo];
}
return arr[hi];
}
array = [2, 42, 82, 122, 162, 202, 242, 282, 322, 362];
number = 112;
alert (closest (number, array));
</script>
</body>
</html>
Esso utilizza fondamentalmente bracketing e il controllo della valore medio di ridurre lo spazio delle soluzioni della metà per ogni iterazione, un classico algoritmo O(log N)
considerando che la ricerca sequenziale sopra è stato O(N)
:
0 1 2 3 4 5 6 7 8 9 <- indexes
2 42 82 122 162 202 242 282 322 362 <- values
L M H L=0, H=9, M=4, 162 higher, H<-M
L M H L=0, H=4, M=2, 82 lower/equal, L<-M
L M H L=2, H=4, M=3, 122 higher, H<-M
L H L=2, H=3, difference of 1 so exit
^
|
H (122-112=10) is closer than L (112-82=30) so choose H
Come detto, che non dovrebbe fare molta differenza per dataset di piccole dimensioni o per cose che non hanno bisogno di per essere accecantemente veloce, ma è un'opzione che potresti voler prendere in considerazione.
È impossibile solo se non si prova nulla. Che cosa hai provato? –
Semplicemente impossibile: mettere da parte una variabile 'x', passare attraverso l'array uno per uno, confrontare' i' con il numero corrente dell'array, se la differenza tra esso e 'i' è minore del valore corrente in' x ', imposta' x' sul numero di array corrente. Al termine, 'x' ha il numero più vicino a' i' dall'array. – deceze