यहाँ छद्म कोड है जो किसी भी प्रक्रियात्मक भाषा में परिवर्तनीय होना चाहिए:
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.
अवधारणा के प्रमाण के रूप में, यहाँ पायथन कोड जो मैं इस क्रिया में दिखाता था:
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)
और, यदि आपको वास्तव में जावास्क्रिप्ट में इसकी आवश्यकता है , तो एक पूर्ण 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
जैसा कि कहा गया है, कि छोटे डेटासेट के लिए या उन चीजों के लिए बहुत अंतर नहीं करना चाहिए, जिन्हें अंधाधुंध तेज़ करने की आवश्यकता नहीं है , लेकिन यह एक विकल्प है जिस पर आप विचार कर सकते हैं।
xकरें, एक-एक करके सरणी के माध्यम से जाएं, सरणीiमें वर्तमान संख्या की तुलना करें , यदि इसके बीच का अंतर औरiवर्तमान मान से छोटा हैx,xतो वर्तमान सरणी संख्या पर सेट करें। समाप्त होने पर, सरणी सेxनिकटतम संख्या हैi।