簡體   English   中英

JavaScript在數組中找到小於等於給定數字的第一個數字

[英]JavaScript find first number in array that is <= to given number

我有一個素數數組:

const primes = [3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97]

我想在此列表中找到第一個數字,即<=給定的數字。

例如,... getHighestPrimeNumber(58) ...應該返回53,即最大值也小於或等於58的素數。

預期結果:

getHighestPrimeNumber(58)=== 53

getHighestPrimeNumber(53)=== 53

getHighestPrimeNumber(52)=== 47

我目前的方法是遍歷素數,但這效率很低,特別是考慮到列表中可能有10,000+個數字-謝謝

香草JS或Lodash都可以

由於您使用lodash標記發布了此標簽,僅供參考,由於_.sortedIndex ,它的使用很簡單

 const primes = [3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97] const closestPrime = (n) => { let index = _.sortedIndex(primes, n) return primes[index] == n ? primes[index] : primes[index-1] } console.log(closestPrime(58)) console.log(closestPrime(53)) console.log(closestPrime(52)) 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.min.js"></script> 

對於二進制搜索而言,這是一項好任務:

 const bisect = (needle, haystack) => { let lo = 0; let hi = haystack.length; while (lo <= hi) { const mid = ~~((hi - lo) / 2 + lo); if (haystack[mid] === needle) { return needle; } else if (haystack[mid] > needle) { hi = mid - 1; } else { lo = mid + 1; } } return haystack[hi]; }; const getHighestPrimeNumber = n => { const primes = [3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97]; return bisect(n, primes); }; console.log(getHighestPrimeNumber(58) === 53); console.log(getHighestPrimeNumber(53) === 53); console.log(getHighestPrimeNumber(52) === 47); 

一些注意事項:

  • 您可能希望將質數數組作為getHighestPrimeNumber的參數,這樣就不會在每次函數調用時都創建它並對其進行垃圾回收。 此時,您最好直接調用二進制搜索。
  • 如果您擔心數組邊界上方和下方的查詢,則可以根據某些策略進行處理,例如: return haystack[Math.min(hi,haystack.length-1)];
  • 二進制搜索的時間復雜度為O(n log(n))。 集合查找為O(1),因此,如果您除了維護數組外還維護一個集合,並首先嘗試在那里進行查找,則可能會提高性能。

似乎是分而治之的領域。 類似於Binary搜索

const primes = [3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97]

function findHighestPrimeNumberRecursive(arr, ceiling) {
  const midpoint = arr.length/2
  if(arr[midpoint ] === ceiling){
    // we found it!
    return primes[arr.length-1];
  } else {
    if(arr[midpoint] <== ceiling) {
      return findHighestPrimeNumberRecursive(arr.slice(0, midpoint), ceiling);
    } else {
      return findHighestPrimeNumberRecursive(arr.slice(midpoint, arr.length), ceiling);
    }
  }
}

function getHighestPrimeNumber(ceiling) {
  return findHighestPrimeNumberRecursive(primes, ceiling);
} 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM