Вот псевдокод, который должен быть преобразован в любой процедурный язык:
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
Он просто вычисляет абсолютные различия между заданным числом и каждым элементом массива и возвращает вам один из них с минимальной разницей.
Для примеров значений:
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.
В качестве доказательства концепции вот код Python, который я использовал, чтобы показать это в действии:
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)
И, если вам действительно это нужно в Javascript, см. Ниже полный HTML-файл, демонстрирующий эту функцию в действии:
<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>
Теперь имейте в виду, что возможности для повышения эффективности могут быть увеличены, если, например, ваши элементы данных отсортированы (это может быть выведено из выборочных данных, но вы не указываете это явно). Вы можете, например, использовать двоичный поиск, чтобы найти ближайший элемент.
Вы также должны иметь в виду, что, если вам не нужно делать это много раз в секунду, повышение эффективности будет в основном незаметным, если ваши наборы данных не станут намного больше.
Если вы действительно хотите попробовать это таким образом (и можете гарантировать, что массив отсортирован в порядке возрастания), это хорошая отправная точка:
<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>
Он в основном использует брекетинг и проверку среднего значения, чтобы уменьшить пространство решения вдвое для каждой итерации, классический алгоритм O(log N)
, тогда как приведенный выше последовательный поиск был 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
Как уже говорилось, это не должно иметь большого значения для небольших наборов данных или для вещей, которым не требуется быть ослепительно быстрыми, но это вариант, который вы, возможно, захотите рассмотреть.
person
paxdiablo
schedule
21.12.2011
x
, пройти по массиву один за другим, сравнитьi
с текущим числом в массиве, если разница между ним иi
меньше текущего значения вx
, установитьx
на текущий номер массива . По окончанииx
имеет номер, ближайший кi
из массива. - person deceze♦   schedule 21.12.2011