Hier ist der Pseudocode, der in jede prozedurale Sprache konvertierbar sein sollte:
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
Es berechnet einfach die absoluten Unterschiede zwischen der angegebenen Anzahl und jedem Array-Element und gibt Ihnen einen der mit dem minimalen Unterschied zurück.
Für die Beispielwerte:
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.
Als Proof of Concept ist hier der Python-Code, mit dem ich dies in Aktion gezeigt habe:
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)
Und wenn Sie es wirklich in Javascript brauchen, finden Sie unten eine vollständige HTML-Datei, die die Funktion in Aktion demonstriert:
<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>
Denken Sie jetzt daran, dass möglicherweise die Effizienz verbessert werden kann, wenn beispielsweise Ihre Datenelemente sortiert sind (dies könnte aus den Beispieldaten abgeleitet werden, aber Sie geben es nicht explizit an). Sie können beispielsweise eine binäre Suche verwenden, um das nächstgelegene Element zu finden.
Sie sollten auch bedenken , dass, wenn Sie es tun müssen , viele Male pro Sekunde, werden die Effizienzverbesserungen werden meist unnoticable es sei denn , Ihre Datensätze bekommen viel größer.
Wenn Sie es auf diese Weise versuchen möchten (und garantieren können, dass das Array in aufsteigender Reihenfolge sortiert ist), ist dies ein guter Ausgangspunkt:
<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>
Grundsätzlich wird die Klammerung und Überprüfung des Mittelwerts verwendet, um den Lösungsraum für jede Iteration um die Hälfte zu reduzieren. Dies ist ein klassischer O(log N)Algorithmus, während die obige sequentielle Suche wie folgt lautete 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
Wie bereits erwähnt, das sollte nicht viel Unterschied für kleine Datenmengen oder für Dinge, die nicht brauchen blendend schnell zu sein, aber es ist eine Option , die Sie betrachten wünschen können.
x, gehen Sie das Array nacheinander durch, vergleichen Sie sieimit der aktuellen Nummer im Array, wenn die Differenz zwischen ihr undikleiner als der aktuelle Wert in istx, setzen Sie siexauf die aktuelle Array-Nummer. Wenn Sie fertig sind,xhaben Sie die Nummer,idie dem Array am nächsten kommt .