[英]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)];
。 似乎是分而治之的領域。 類似於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.