অ্যারে থেকে নিকটতম নম্বর পান


163

আমার বিয়োগ 1000 থেকে প্লাস 1000 পর্যন্ত একটি সংখ্যা রয়েছে এবং এতে আমার সংখ্যার সাথে একটি অ্যারে রয়েছে। এটার মত:

[2, 42, 82, 122, 162, 202, 242, 282, 322, 362]

আমি চাই যে নম্বরটি আমি অ্যারের নিকটতম সংখ্যায় পরিবর্তন পেয়েছি।

উদাহরণস্বরূপ আমি 80এটি পেতে চাই নম্বর হিসাবে আমি পেতে82


2
অসম্ভব সহজ: একটি ভেরিয়েবল আলাদা করে রাখুন x, একের পর এক অ্যারে দিয়ে যান, অ্যারের iবর্তমান সংখ্যার সাথে তুলনা করুন , যদি এর মধ্যে পার্থক্য থাকে এবং iবর্তমান মানের চেয়ে ছোট হয় তবে বর্তমান অ্যারে সংখ্যায় xসেট করুন x। শেষ হয়ে গেলে অ্যারের থেকে সবচেয়ে xকাছের নম্বরটি রয়েছে i
ছদ্মবেশ

উত্তর:


208

ES5 সংস্করণ:

var counts = [4, 9, 15, 6, 2],
  goal = 5;

var closest = counts.reduce(function(prev, curr) {
  return (Math.abs(curr - goal) < Math.abs(prev - goal) ? curr : prev);
});

console.log(closest);


1
খারাপ দিকটি হ'ল এটি হ'ল যদি হ্রাসের কলব্যাককে ঘোষিত ভারগুলির মতো একই সুযোগ থেকে ডাকা হয়। যেহেতু আপনি goalহ্রাস করতে পারছেন না , তাই আপনাকে অবশ্যই এটি বিশ্বব্যাপী সুযোগ থেকে উল্লেখ করতে হবে।
7yl4r

5
এটি করতে একটি উচ্চতর অর্ডার ফাংশন ব্যবহার করতে পারে।
ডিএমপি

3
@ 7yl4r বা একটি ফাংশন এ মোড়ানো? ;)
ডমিনিক

1
@ 7yl4r সত্যই নয় ... আপনি এটি অর্জনের জন্য বাঁধাই ব্যবহার করতে পারেন ... ---------- // হ্রাস-বিহীন ফাংশন হ্রাসকারী (লক্ষ্য, পূর্ব, কারির) {রিটার্ন (ম্যাথ.এবস (কার্ল - গোল) <ম্যাথ.এবস (পূর্ব - গোল)? কারার: ​​পূর্ব); main // main.js var গণনা = [4, 9, 15, 6, 2], লক্ষ্য = 5; গণনা.আরডুস (হ্রাসকারী) (নাল, গোল); ---------- আমি কীভাবে মন্তব্যে কোড রাখব জানিনা হা হা হা।
মরিসিও

তালিকাটি অর্ডার করা থাকলে তবে অনুকূল নয় তবে ছোট আইটেমগুলির জন্য এটি প্রতিটি আইটেমের উপরে পুনরাবৃত্তি করে। এমনকি বাইনারি অনুসন্ধান ব্যতীত যদি পরবর্তী সংখ্যাটি আরও এগিয়ে থাকে তবে একটি লুপ বেরিয়ে যেতে পারে।
ডোমিনিক

144

এখানে ছদ্ম-কোড যা কোনও প্রক্রিয়াগত ভাষায় রূপান্তরিত হওয়া উচিত:

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>
    <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>

এখন মনে রাখবেন উন্নত দক্ষতার সুযোগ থাকতে পারে যদি উদাহরণস্বরূপ, আপনার ডেটা আইটেমগুলি বাছাই করা হয় (এটি নমুনা ডেটা থেকে অনুমান করা যেতে পারে তবে আপনি এটি স্পষ্টভাবে বিবরণ দেন না)। উদাহরণস্বরূপ, আপনি নিকটতম আইটেমটি খুঁজতে বাইনারি অনুসন্ধান ব্যবহার করতে পারেন।

এছাড়াও আপনি মনে রাখা উচিত যে, যদি না আপনি এটা করতে প্রয়োজন অনেক প্রতি সেকেন্ডে বার দক্ষতা উন্নতি যদি না আপনার ডেটা সেট পেতে বেশিরভাগই unnoticable হতে হবে অনেক বড় করা হয়েছে।

আপনি যদি না এটা যে পথ চেষ্টা (এবং নিশ্চিত করতে পারে না অ্যারের আরোহী অনুক্রমে সাজানো হয়) চান, এই একটি ভাল শুরু হয়:

<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

যেমনটি বলা হয়েছে, এটি ছোট ডেটাসেটের জন্য বা এমন জিনিসগুলির ক্ষেত্রে খুব বেশি পার্থক্য করা উচিত নয় যেগুলি অন্ধভাবে দ্রুত করার দরকার নেই , তবে এটি এমন একটি বিকল্প যা আপনি বিবেচনা করতে চাইতে পারেন।


2
@ মিছা, আমি উত্তরে জেএস কোডটি যুক্ত করেছি, আমি যে ভাষাগুলির চেয়ে বেশি
অভ্যস্ত

2
আপনার কাছে বড় ডেটাসেট থাকলে এই অ্যালগরিদমের জন্য দরিদ্র রানটাইম।
ylun.ca

4
@ ylun.ca, যেহেতু তথ্য সাজানো হয়েছে এমন প্রশ্নের কোনও স্পষ্ট বিবৃতি নেই (উদাহরণটি সাজানো হয়েছে তবে এটি কাকতালীয় হতে পারে), আপনি ও (এন) এর চেয়ে ভাল দক্ষতা পেতে পারবেন না। যে কোনও ক্ষেত্রে, সেই আকারের কোনও ডেটাসেটের জন্য দক্ষতা বেশিরভাগ ক্ষেত্রে অপ্রাসঙ্গিক। তবে আপনার বক্তব্যটি একটি বৈধ পয়েন্ট তাই উত্তরটি আরও সম্পূর্ণ করার জন্য আমি সেই প্রভাবটিতে নোট যুক্ত করব।
প্যাক্সডিয়াবলো

1
আপনাকে ধন্যবাদ আমি আশা করি আমি একাধিকবার উত্সাহ দিতে পারতাম! স্ট্যাক ওভারফ্লো সম্পর্কে আরও উত্তরগুলির মধ্যে এই ধরণের প্রচেষ্টা করা উচিত।
রিচার্ড ভ্যানবারজেন

48

ES6 (2015) সংস্করণ:

const counts = [4, 9, 15, 6, 2];
const goal = 5;

const output = counts.reduce((prev, curr) => Math.abs(curr - goal) < Math.abs(prev - goal) ? curr : prev);

console.log(output);

পুনঃব্যবহারযোগ্যতার জন্য আপনি কোনও কারি ফাংশনে মোড়তে পারেন যা স্থানধারকদের সমর্থন করে ( http://ramdajs.com/0.19.1/docs/#curry বা https://lodash.com/docs#curry )। এটি আপনার প্রয়োজনের উপর নির্ভর করে প্রচুর নমনীয়তা দেয়:

const getClosest = curry((counts, goal) => {
  return counts
    .reduce((prev, curr) => Math.abs(curr - goal) < Math.abs(prev - goal) ? curr : prev);
});

const closestTo5 = getClosest(_, 5);
const closestTo = getClosest([4, 9, 15, 6, 2]);

24

ওয়ার্কিং কোড নীচে হিসাবে:

var array = [2, 42, 82, 122, 162, 202, 242, 282, 322, 362];

function closest(array, num) {
  var i = 0;
  var minDiff = 1000;
  var ans;
  for (i in array) {
    var m = Math.abs(num - array[i]);
    if (m < minDiff) {
      minDiff = m;
      ans = array[i];
    }
  }
  return ans;
}
console.log(closest(array, 88));


8
আরও মরিয়ার।
হট লিক্স

6
আমি তর্ক করব এটি একটি ভাল সমাধান কারণ এটি কেবল জাভাস্ক্রিপ্ট ব্যবহার করে। গৃহীত উত্তরটি jQuery ব্যবহার করে, যা মূল প্রশ্নে উল্লেখ করা হয়নি, এবং অন্যরা এই প্রশ্নের দিকে তাকিয়ে যা ব্যবহার করছে না।
শিম বিন

17

অরসোর্টড অ্যারে নিয়ে কাজ করে

এখানে কিছু ভাল সমাধান পোস্ট করা হলেও, জাভাস্ক্রিপ্ট একটি নমনীয় ভাষা যা আমাদের বিভিন্ন উপায়ে সমস্যা সমাধানের সরঞ্জাম সরবরাহ করে। এটি অবশ্যই আপনার স্টাইলে নেমে আসে। যদি আপনার কোডটি আরও কার্যকর হয় তবে আপনি হ্রাস প্রকরণটি উপযুক্ত খুঁজে পাবেন , যেমন:

  arr.reduce(function (prev, curr) {
    return (Math.abs(curr - goal) < Math.abs(prev - goal) ? curr : prev);
  });

তবে, তাদের কোডিং শৈলীর উপর নির্ভর করে কারও কারও কাছে পড়া শক্ত হতে পারে। সুতরাং আমি সমস্যাটি সমাধানের একটি নতুন উপায় প্রস্তাব করছি:

  var findClosest = function (x, arr) {
    var indexArr = arr.map(function(k) { return Math.abs(k - x) })
    var min = Math.min.apply(Math, indexArr)
    return arr[indexArr.indexOf(min)]
  }

  findClosest(80, [2, 42, 82, 122, 162, 202, 242, 282, 322, 362]) // Outputs 82

সর্বনিম্ন মানটি ব্যবহার করে অন্য পদ্ধতির বিপরীতে Math.min.apply, এটির জন্য ইনপুট অ্যারে arrবাছাই করার প্রয়োজন হয় না । আমাদের সূচকগুলি সম্পর্কে যত্ন নেওয়া বা এটি আগে সাজানোর দরকার নেই।

আমি স্পষ্টতার জন্য কোড লাইনটি লাইনে ব্যাখ্যা করব:

  1. arr.map(function(k) { return Math.abs(k - x) })প্রদত্ত সংখ্যার (সংখ্যাতে arr) বিয়োগ ইনপুট নম্বর ( x) এর পরম মানগুলি সংরক্ষণ করে একটি নতুন অ্যারে তৈরি করে । আমরা পরের ক্ষুদ্রতম সংখ্যার সন্ধান করব (যা ইনপুট সংখ্যার নিকটতমও)
  2. Math.min.apply(Math, indexArr) এটি স্রেফ সংখ্যার সন্ধানের একটি বৈধ উপায় যা আমরা সবে তৈরি করেছি (এর চেয়ে বেশি কিছু নয়)
  3. arr[indexArr.indexOf(min)]এটি সম্ভবত সবচেয়ে আকর্ষণীয় অংশ। আমরা আমাদের ক্ষুদ্রতম সংখ্যাটি পেয়েছি, তবে আমরা নিশ্চিত নই যে আমাদের প্রাথমিক সংখ্যা ( x) যোগ করা বা বিয়োগ করা উচিত কিনা । এটি কারণ আমরা Math.abs()পার্থক্যটি সন্ধান করতাম । তবে array.mapসূচীগুলিকে একই জায়গায় রেখে ইনপুট অ্যারের মানচিত্র তৈরি করুন (যৌক্তিকভাবে)। অতএব, নিকটতম সংখ্যাটি সন্ধান করতে আমরা কেবলমাত্র প্রদত্ত অ্যারেতে পাওয়া সর্বনিম্ন সূচকটি ফিরিয়ে দিই indexArr.indexOf(min)

আমি এটি প্রদর্শন করে একটি বিন তৈরি করেছি ।


1
আমি জানি না তবে আমি অনুমান 3nকরি যে কারওটির পারফরম্যান্স সন্দেহ থাকতে পারে যেহেতু এটি ব্যবহারিকভাবে এবং এটি ES5 এমনকি আপনি ২০১ 2016 সালে উত্তর দিয়েছিলেন এবং অন্যান্য সমাধানগুলি ঠিক আছে যদিও এই নুব যে প্রশ্নটি পরিষ্কারভাবে জিজ্ঞাসা করেছিল সে সময় প্রোগ্রামার ছিল না।
নুব

1
হ্যাঁ আপনি শিখতে দেখে দারুণ! উপায় দ্বারা আমি কেবল পারফরম্যান্স সম্পর্কিত সন্দেহ সম্পর্কে বিতর্ক না করে সন্দেহ করি যে এটি আসলে আরও খারাপ করেছে তবে আমি আপনার জন্য নম্বরগুলি O(n)চালিয়েছি এবং আপনার সমাধানটি 100k অপস / সেকেন্ডের চেয়ে কম পরিমাণে পারফর্ম O(log n)করে তবে @paxdiablo এলোমেলো সংখ্যায়। অ্যালগরিদম ডিজাইনের সময় সর্বদা বাছাই করুন তারা। (আপনি কী করছেন তা যদি আপনি জানেন এবং ব্যাক আপ আপনার ব্যাক আপ করার জন্য ব্যতীত))
noob

1
সহজ সমাধান জন্য প্রপস। আমার ব্যবহারের ক্ষেত্রে দুর্দান্ত কাজ করে (আমার কাছে
নুবের

2
আপনি অনুসন্ধানের ক্লোজস্টটি সমস্ত অ্যারেতে পুনরায় ব্যবহারযোগ্য করে তুলতে একটি হ্রাস কলব্যাক ফাংশনটি ফিরিয়ে আনতে পারেন: const findClosest = goal => (a,b) => Math.abs(a - goal) < Math.abs(b - goal) ? a : b;
জাকব ই ই

1
উদাহরণ: [2, 42, 82, 122, 162, 202, 242, 282, 322, 362].reduce(findClosest(80))
জাকব ই ই

11

বাছাই করা অ্যারেগুলির জন্য (লিনিয়ার সন্ধান)

এখনও পর্যন্ত সমস্ত উত্তর পুরো অ্যারের মাধ্যমে অনুসন্ধানে মনোনিবেশ করে। আপনার অ্যারেটি ইতিমধ্যে বাছাই করা বিবেচনা করে আপনি সত্যিই কেবল নিকটতম নম্বর চান এটি সম্ভবত দ্রুততম সমাধান:

var a = [2, 42, 82, 122, 162, 202, 242, 282, 322, 362];
var target = 90000;

/**
 * Returns the closest number from a sorted array.
 **/
function closest(arr, target) {
  if (!(arr) || arr.length == 0)
    return null;
  if (arr.length == 1)
    return arr[0];

  for (var i = 1; i < arr.length; i++) {
    // As soon as a number bigger than target is found, return the previous or current
    // number depending on which has smaller difference to the target.
    if (arr[i] > target) {
      var p = arr[i - 1];
      var c = arr[i]
      return Math.abs(p - target) < Math.abs(c - target) ? p : c;
    }
  }
  // No number in array is bigger so return the last.
  return arr[arr.length - 1];
}

// Trying it out
console.log(closest(a, target));

নোট করুন যে অ্যালগরিদমটি ব্যাপকভাবে উন্নত করা যেতে পারে যেমন বাইনারি ট্রি ব্যবহার করে।


যদিও এখানে এই কৌশলটি ভাল, এটিতে বেশ কয়েকটি টাইপ রয়েছে। উদাহরণ, a[i]বা i[0]
ওয়েসলে কর্মী

1
ধন্যবাদ, @ ওয়েসলি ওয়ার্কম্যান শুধু তাদের ঠিক করা। আমি আশা করি আমি সব পেয়েছি। যাইহোক, আপনি অন্যের উত্তরও সম্পাদনা করতে পারেন।
হুবার্ট গ্রাজেসকুইয়াক

উচ্চতর নিকটতম মান পেতে যেখানে আমাকে উপরের উত্তর কোডটিতে সংশোধন করা দরকার? উদাহরণ: [110, 111, 120, 140, 148, 149, 155, 177, 188, 190] আমি যদি 150 অনুসন্ধান করি তবে আমার 149 নয় 155 পাওয়া উচিত I আপনি দয়া করে সাহায্য করতে পারেন। ধন্যবাদ
ব্যবহারকারী 1199842

9

সমস্ত সমাধান ওভার ইঞ্জিনিয়ারড।

এটি যেমন সহজ:

const needle = 5;
const haystack = [1, 2, 3, 4, 5, 6, 7, 8, 9];

haystack.sort((a, b) => {
  return Math.abs(a - needle) - Math.abs(b - needle);
});

// 5

1
প্রকৃতপক্ষে, আরও অনেক বিষয়। তবে "অ্যারে থেকে নিকটতম নম্বর পেতে" আপনাকে এখনও বাছাই করা অ্যারে থেকে প্রথম উপাদানটি নির্বাচন করতে হবে।
শায়া উলমান

6

এই সমাধানটি ES5 অস্তিত্বমূলক কোয়ান্টিফায়ার ব্যবহার করে Array#some, যা কোনও শর্ত পূরণ হলে পুনরাবৃত্তি থামাতে দেয়।

এর বিপরীতে Array#reduce, একটি ফলাফলের জন্য এটি সমস্ত উপাদানকে পুনরাবৃত্তি করতে হবে না।

কলব্যাকের অভ্যন্তরে deltaঅনুসন্ধান করা মান এবং আসল মধ্যে একটি পরমitem নেওয়া হয় এবং শেষ ব-দ্বীপের সাথে তুলনা করা হয়। বৃহত্তর বা সমান হলে, পুনরাবৃত্তিটি থামবে, কারণ তাদের ডেল্টাসহ অন্যান্য সমস্ত মানগুলি প্রকৃত মানের চেয়ে বেশি।

যদি deltaকলব্যাকটি ছোট হয়, তবে প্রকৃত আইটেমটি ফলাফলকে বরাদ্দ করা হয় এবং এতে deltaসংরক্ষণ করা হয় lastDelta

অবশেষে, সমান ডেল্টাসহ ছোট মানগুলি নেওয়া হয়, যেমন নীচের উদাহরণের মতো 22, যার ফলস্বরূপ 2

যদি বৃহত্তর মানগুলির অগ্রাধিকার থাকে তবে ডেল্টা চেকটি এ থেকে পরিবর্তন করতে হবে:

if (delta >= lastDelta) {

প্রতি:

if (delta > lastDelta) {
//       ^^^ without equal sign

এটি পেতে হবে 22, ফলাফল42 (বৃহত্তর মানগুলির অগ্রাধিকার)।

এই ফাংশনটির অ্যারেতে বাছাই করা মানগুলি দরকার।


ছোট মানগুলির অগ্রাধিকার সহ কোড:

function closestValue(array, value) {
    var result,
        lastDelta;

    array.some(function (item) {
        var delta = Math.abs(value - item);
        if (delta >= lastDelta) {
            return true;
        }
        result = item;
        lastDelta = delta;
    });
    return result;
}

var data = [2, 42, 82, 122, 162, 202, 242, 282, 322, 362];

console.log(21, closestValue(data, 21)); // 2
console.log(22, closestValue(data, 22)); // 2  smaller value
console.log(23, closestValue(data, 23)); // 42
console.log(80, closestValue(data, 80)); // 82

বৃহত্তর মানগুলির অগ্রাধিকার সহ কোড:

function closestValue(array, value) {
    var result,
        lastDelta;

    array.some(function (item) {
        var delta = Math.abs(value - item);
        if (delta > lastDelta) {
            return true;
        }
        result = item;
        lastDelta = delta;
    });
    return result;
}

var data = [2, 42, 82, 122, 162, 202, 242, 282, 322, 362];

console.log(21, closestValue(data, 21)); //  2
console.log(22, closestValue(data, 22)); // 42 greater value
console.log(23, closestValue(data, 23)); // 42
console.log(80, closestValue(data, 80)); // 82


সুতরাং আপনি ধরে নিন যে প্রদত্ত অ্যারে বাছাই করা হয়েছে ... এটি আপনাকে অনেক সময় থেকে বাঁচায়।
রেডু

1
অপের অ্যারেটি সাজানো দেখায়, তাই হ্যাঁ :)
নিনা স্কলজ

প্রথম সমাধানটি ইনপুটগুলিতে বিরতি দেয় যা একই সংখ্যার দু'বার থাকে। উদাহরণস্বরূপclosestValue([ 2, 2, 42, 80 ], 50) === 2
সাবাস্তিয়ান ভের্ক্যামেন

@ সাবাস্টিভেনকামম্যান, অপের ডেটা অনন্য এবং সাজানো।
নিনা শোলজ

@ নিনাশোলজ ওপি কেবলমাত্র "এটিতে সংখ্যার সাথে আমার একটি অ্যারে রয়েছে" এবং "আমি চাই যে নম্বরটি আমি অ্যারের নিকটতম সংখ্যায় পরিবর্তন করেছি" তা নির্ধারণ করে । উদাহরণ অ্যারে কেবল একটি উদাহরণ ছিল। একটি অ্যারে অনন্য প্রবেশের গ্যারান্টি দেয় না।
সাবাস্তিয়ান ভের্ক্যামেন

4

ES6

বাছাই এবং অরসোর্টেড অ্যারেগুলির সাথে কাজ করে

নম্বর পূর্ণসংখ্যা এবং ভাসমান, স্ট্রিংস স্বাগত জানায়

/**
 * Finds the nearest value in an array of numbers.
 * Example: nearestValue(array, 42)
 * 
 * @param {Array<number>} arr
 * @param {number} val the ideal value for which the nearest or equal should be found
 */
const nearestValue = (arr, val) => arr.reduce((p, n) => (Math.abs(p) > Math.abs(n - val) ? n - val : p), Infinity) + val

উদাহরণ:

let values = [1,2,3,4,5]
console.log(nearestValue(values, 10)) // --> 5
console.log(nearestValue(values, 0)) // --> 1
console.log(nearestValue(values, 2.5)) // --> 2

values = [100,5,90,56]
console.log(nearestValue(values, 42)) // --> 56

values = ['100','5','90','56']
console.log(nearestValue(values, 42)) // --> 56

3

আমার কোনও পুরানো প্রশ্নের উত্তর দেওয়ার কথা ছিল কিনা তা আমি জানি না, তবে গুগল অনুসন্ধানে এই পোস্টটি প্রথম প্রদর্শিত হওয়ায় আমি আশা করি যে আপনি আমার সমাধান এবং আমার 2 সি এখানে যুক্ত করে ক্ষমা করবেন।

অলস হওয়ার কারণে, আমি বিশ্বাস করতে পারি না যে এই প্রশ্নের সমাধানটি একটি লুপ হবে, তাই আমি আরও কিছুটা অনুসন্ধান করে ফিল্টার ফাংশন নিয়ে ফিরে এসেছি :

var myArray = [2, 42, 82, 122, 162, 202, 242, 282, 322, 362];
var myValue = 80;

function BiggerThan(inArray) {
  return inArray > myValue;
}

var arrBiggerElements = myArray.filter(BiggerThan);
var nextElement = Math.min.apply(null, arrBiggerElements);
alert(nextElement);

এখানেই শেষ !


1
তাহলে নিম্ন সীমা সম্পর্কে কি? আপনি সর্বদা পরবর্তী উচ্চতর মানটি ব্যবহার করেন। তবে আপনার দৃষ্টিভঙ্গি আমাকে goog.math.clamp(গুগল বন্ধ) স্মরণ করিয়ে দেয় কেবল অ্যারে দিয়ে এবং নিম্ন সীমা সম্পর্কে যত্ন না নিয়ে।
নুব

আপনার সমাধান অ্যারে থেকে পরবর্তী উচ্চতর নম্বর প্রদান করে। নিকটতম বা সঠিক মান খুঁজে পাওয়া যায় না।
হুবার্ট গ্রেজস্কোইয়াক

2

অনুরূপ প্রশ্নের আমার উত্তরটিও সম্পর্কের জন্য অ্যাকাউন্টিং এবং এটি সরল জাভাস্ক্রিপ্টে রয়েছে, যদিও এটি বাইনারি অনুসন্ধান ব্যবহার করে না সুতরাং এটি হে (এন) এবং হে (লগএন) নয়:

var searchArray= [0, 30, 60, 90];
var element= 33;

function findClosest(array,elem){
    var minDelta = null;
    var minIndex = null;
    for (var i = 0 ; i<array.length; i++){
        var delta = Math.abs(array[i]-elem);
        if (minDelta == null || delta < minDelta){
            minDelta = delta;
            minIndex = i;
        }
        //if it is a tie return an array of both values
        else if (delta == minDelta) {
            return [array[minIndex],array[i]];
        }//if it has already found the closest value
        else {
            return array[i-1];
        }

    }
    return array[minIndex];
}
var closest = findClosest(searchArray,element);

https://stackoverflow.com/a/26429528/986160


2

আমি ফিউশন থেকে আসা পদ্ধতির পছন্দ করি তবে এতে একটি ছোট ত্রুটি রয়েছে। এটি ঠিক যে মত:

    function closest(array, number) {
        var num = 0;
        for (var i = array.length - 1; i >= 0; i--) {
            if(Math.abs(number - array[i]) < Math.abs(number - array[num])){
                num = i;
            }
        }
        return array[num];
    }

এটি এটি আরও দ্রুততর হয় কারণ এটি উন্নত forলুপটি ব্যবহার করে ।

শেষে আমি আমার ফাংশনটি এভাবে লিখেছি:

    var getClosest = function(number, array) {
        var current = array[0];
        var difference = Math.abs(number - current);
        var index = array.length;
        while (index--) {
            var newDifference = Math.abs(number - array[index]);
            if (newDifference < difference) {
                difference = newDifference;
                current = array[index];
            }
        }
        return current;
    };

আমি এটি দিয়ে পরীক্ষা করেছি console.time()এবং এটি অন্যান্য ফাংশনের চেয়ে কিছুটা দ্রুত।


আরে, আপনি এটি ব্যাখ্যা করতে পারেন কেন এটি একটি improved for loop? বিপরীত লুপগুলি সর্বদা কর্মক্ষমতা উন্নতি হয় না।
আরপুন

আপনি .lengthযখন ঘোষণা করেন তখনই আপনি একবার মূল্যায়ন করেন , যখন iএই লুপের জন্য। তবে আমি মনে করি var i = arr.length;while (i--) {}আরও দ্রুততর হবে
জন

আমি আমার উত্তর আপডেট। আমি এটা পরিবর্তন while। এখন এটি আরও দ্রুত।
জন

0

অ্যারেতে কিছুটা পরিবর্তিত বাইনারি অনুসন্ধান কাজ করবে।


3
জিৎ, এটি উদ্ভট - স্পষ্টতই কেউ বাইনারি অনুসন্ধান পছন্দ করেন না। (এমনকি এটি সর্বোত্তম সাধারণ সমাধানও ভেবেছিলেন))
হট লিক্স

0

একটি ছোট পরিসরের জন্য, সর্বাধিক সহজ জিনিসটি হ'ল একটি মানচিত্রের অ্যারে রাখা উচিত, যেখানে উদাহরণস্বরূপ, 80 তম এন্ট্রিটিতে এটির মধ্যে 82 এর মান থাকবে, আপনার উদাহরণটি ব্যবহার করুন। অনেক বড়, বিরল পরিসরের জন্য সম্ভবত যাওয়ার উপায় বাইনারি অনুসন্ধান।

একটি ক্যোয়ারী ভাষার সাহায্যে আপনি আপনার ইনপুট সংখ্যার উভয় দিকের কিছুটা দুরত্বের মান জিজ্ঞাসা করতে পারেন এবং তারপরে ফলাফলটি হ্রাসিত তালিকার মাধ্যমে বাছাই করতে পারেন। আপনাকে "পরিষ্কার" সমাধান দেওয়ার জন্য এসকিউএলটির "পরের" বা "পূর্ববর্তী" এর ভাল ধারণা নেই।


0

এখানে আরও একটি বৈকল্পিক আমাদের কাছে মাথা থেকে পায়ের সাথে সংযোগকারী বিজ্ঞপ্তি রয়েছে এবং প্রদত্ত ইনপুটটিতে কেবলমাত্র ন্যূনতম মান গ্রহণ করে। এটি আমাকে একটি এনক্রিপশন অ্যালগরিদমের জন্য চর কোড মান পেতে সহায়তা করেছিল।

function closestNumberInCircularRange(codes, charCode) {
  return codes.reduce((p_code, c_code)=>{
    if(((Math.abs(p_code-charCode) > Math.abs(c_code-charCode)) || p_code > charCode) && c_code < charCode){
      return c_code;
    }else if(p_code < charCode){
      return p_code;
    }else if(p_code > charCode && c_code > charCode){
      return Math.max.apply(Math, [p_code, c_code]);
    }
    return p_code;
  });
}

0
#include <algorithm>
#include <iostream>
#include <cmath>

using namespace std;

class CompareFunctor
{

public:
    CompareFunctor(int n) { _n = n; }
    bool operator()(int & val1, int & val2)
    {
        int diff1 = abs(val1 - _n);
        int diff2 = abs(val2 - _n);
        return (diff1 < diff2);
    }

private:
    int _n;
};

int Find_Closest_Value(int nums[], int size, int n)
{
    CompareFunctor cf(n);
    int cn = *min_element(nums, nums + size, cf);
    return cn;
}

int main()
{
    int nums[] = { 2, 42, 82, 122, 162, 202, 242, 282, 322, 362 };
    int size = sizeof(nums) / sizeof(int);
    int n = 80;
    int cn = Find_Closest_Value(nums, size, n);
    cout << "\nClosest value = " << cn << endl;
    cin.get();
}

0

সর্বাধিক দক্ষ হবে বাইনারি অনুসন্ধান search পরবর্তী সংখ্যাটি যখন বর্তমান থেকে আরও মিল হয় তখনও সহজ সমাধানগুলি প্রস্থান করতে পারে । এখানে প্রায় সমস্ত সমাধান বিবেচনা করে নিচ্ছে না যে অ্যারেটি অর্ডার করা হয়েছে এবং পুরো জিনিসটি যদিও পুনরাবৃত্তি হচ্ছে: /

const closest = (orderedArray, value, valueGetter = item => item) =>
  orderedArray.find((item, i) =>
    i === orderedArray.length - 1 ||
    Math.abs(value - valueGetter(item)) < Math.abs(value - valueGetter(orderedArray[i + 1])));

var data = [2, 42, 82, 122, 162, 202, 242, 282, 322, 362];

console.log('21 -> 2', closest(data, 21) === 2);
console.log('22 -> 42', closest(data, 22) === 42); // equidistant between 2 and 42, select highest
console.log('23 -> 42', closest(data, 23) === 42);
console.log('80 -> 82', closest(data, 80) === 82);

এটি অ-আদিমদের উপরও চালানো যেতে পারে যেমন, closest(data, 21, item => item.age)

পরিবর্তন findকরার জন্য findIndexঅ্যারের মধ্যে সূচক দেখাবে।


আনর্ডারড অ্যারে সম্পর্কে কী?
এডিজি

আনর্ডারডের জন্য এমন একটি সমাধান নিন যা প্রস্থান করে না, তবে আপনি যদি কাজটি বহুবার করে থাকেন তবে অ্যারেটি একবারে সাজানো আরও অনুকূল হতে পারে। উল্লিখিত হিসাবে যদি অ্যারেটি সত্যিই বড় হয় তবে একটি বাইনারি অনুসন্ধান লিনিয়ারের চেয়ে আরও কার্যকর হবে।
ডমিনিক

0

অ্যারেতে দুটি নিকটতম নম্বর সন্ধান করতে

function findTwoClosest(givenList, goal) {
  var first;
  var second;
  var finalCollection = [givenList[0], givenList[1]];
  givenList.forEach((item, firtIndex) => {
    first = item;

    for (let i = firtIndex + 1; i < givenList.length; i++) {
      second = givenList[i];

      if (first + second < goal) {
        if (first + second > finalCollection[0] + finalCollection[1]) {
          finalCollection = [first, second];
        }
      }
    }
  });

  return finalCollection;
}

var counts = [2, 42, 82, 122, 162, 202, 242, 282, 322, 362]
var goal = 80;
console.log(findTwoClosest(counts, goal));

-5

কমপ্লেক্সিটি ও (এনলগ (এন)) এর অ্যারে থেকে সংখ্যার নিকটতম উপাদান খুঁজে পেতে কোড স্নিপেট এখানে:

ইনপুট: - {1,60,0, -10,100,87,56 lement উপাদান: - অ্যারে মধ্যে নিকটতম নম্বর: - 60

উত্স কোড (জাভা):

package com.algo.closestnumberinarray;
import java.util.TreeMap;


public class Find_Closest_Number_In_Array {

    public static void main(String arsg[]) {
        int array[] = { 1, 60, 0, -10, 100, 87, 69 };
        int number = 56;
        int num = getClosestNumber(array, number);
        System.out.println("Number is=" + num);
    }

    public static int getClosestNumber(int[] array, int number) {
        int diff[] = new int[array.length];

        TreeMap<Integer, Integer> keyVal = new TreeMap<Integer, Integer>();
        for (int i = 0; i < array.length; i++) {

            if (array[i] > number) {
                diff[i] = array[i] - number;
                keyVal.put(diff[i], array[i]);
            } else {
                diff[i] = number - array[i];
                keyVal.put(diff[i], array[i]);
            }

        }

        int closestKey = keyVal.firstKey();
        int closestVal = keyVal.get(closestKey);

        return closestVal;
    }
}

পোস্টে জাভাস্ক্রিপ্টের জন্য ট্যাগগুলিতে জিজ্ঞাসা করা হয়েছিল
শ্যানন হচকিন্স
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.