Inilah pseudo-code yang harus dapat dikonversi menjadi bahasa prosedural apa pun:
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
Itu hanya berhasil membedakan mutlak antara jumlah yang diberikan dan setiap elemen array dan memberi Anda kembali salah satu yang dengan perbedaan minimal.
Untuk nilai contoh:
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.
Sebagai bukti konsep, inilah kode Python yang saya gunakan untuk menunjukkan ini dalam tindakan:
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)
Dan jika kau benar - benar membutuhkannya dalam Javascript, lihat di bawah untuk file HTML lengkap yang menunjukkan fungsi dalam aksi:
<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>
Sekarang ingatlah bahwa mungkin ada ruang untuk peningkatan efisiensi jika, misalnya, item data Anda diurutkan (yang dapat disimpulkan dari data sampel tetapi Anda tidak secara eksplisit menyatakannya). Anda bisa, misalnya, menggunakan pencarian biner untuk menemukan item terdekat.
Anda juga harus mengingatnya, kecuali Anda harus melakukannya berkali- kali per detik, peningkatan efisiensi sebagian besar tidak akan terlihat kecuali set data Anda menjadi jauh lebih besar.
Jika kamu tidak ingin mencoba cara itu (dan dapat menjamin array diurutkan dalam urutan menaik), ini adalah baik titik awal:
<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>
Ini pada dasarnya menggunakan tanda kurung dan memeriksa nilai tengah untuk mengurangi ruang solusi hingga setengahnya untuk setiap iterasi, sebuah O(log N)algoritma klasik sedangkan pencarian berurutan di atas adalah 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
Seperti yang dinyatakan, itu seharusnya tidak membuat banyak perbedaan untuk dataset kecil atau untuk hal-hal yang tidak perlu terlalu cepat, tetapi ini adalah opsi yang mungkin ingin Anda pertimbangkan.
x, melalui array satu per satu, dibandingkanidengan angka saat ini dalam array, jika perbedaan antara itu danilebih kecil dari nilai saat ini dix, setelxke nomor array saat ini. Setelah selesai,xmiliki nomor terdekatidari array.