在javascript数组中搜索最近的下一个值
我有一个javascript数组,比如在javascript数组中搜索最近的下一个值,javascript,Javascript,我有一个javascript数组,比如var test=[2,5,8,12,56]现在我想搜索最接近的下一个值9。因此,在这种情况下,输出是12(而不是8!)。如果对数组进行排序,您可以尝试以下方法,您需要针对边界情况进行调整,这只是为了了解算法 NUM is input TEST is your array INDEX is index variable For INDEX from 0 .. TEST.SIZE -1 IF NUM > TEXT[INDEX]
var test=[2,5,8,12,56]代码>现在我想搜索最接近的下一个值9。因此,在这种情况下,输出是12(而不是8!)。如果对数组进行排序,您可以尝试以下方法,您需要针对边界情况进行调整,这只是为了了解算法
NUM is input
TEST is your array
INDEX is index variable
For INDEX from 0 .. TEST.SIZE -1
IF NUM > TEXT[INDEX]
RETURN TEXT[INDEX]
这里有一个简单的方法:
function getNextVal(arr, val) {
// omit the next line if the array is always sorted:
arr = arr.slice(0).sort(function(a,b){return a-b;});
for (var i=0; i < arr.length; i++)
if (arr[i] >= val)
return arr[i];
// return default value when val > all values in array
}
函数getNextVal(arr,val){
//如果数组始终排序,请忽略下一行:
arr=arr.slice(0).sort(函数(a,b){返回a-b;});
对于(变量i=0;i=val)
返回arr[i];
//当val>数组中的所有值时返回默认值
}
如果搜索值在数组中,您不会说要返回什么,所以我假设您想要返回它。如果“最近的下一个值”意味着它应该总是返回比搜索值高的下一个数字,请更改arr[i]>=val
以使用
而不是=
如果你有一个大数组,你可能需要某种二进制排序,而不是从头开始。希望这对你有帮助
var test = [2,5,8,12,56];
var key = 9;
var closestNext=1000;
for(var i=0;i<test.length;i++)
{
if(test[i] > key)
{
if(test[i]<closestNext)
{
closestNext = test[i];
}
}
}
alert(closestNext);
var检验=[2,5,8,12,56];
var-key=9;
var closestNext=1000;
用于(变量i=0;i键)
{
如果(test[i]1首先使用arr.sort();
对数组进行排序,只需按升序对值进行排序(3,6,4,7,1-->1,3,4,6,7
),然后只需迭代:
function getNext(inputVal,arr)
{
arr.sort();;
for (var i=0;i<arr.lenght;i++)
{
if (arr[i] >= inputVal)
{
return arr[i];
}
}
throw new Error('Out of range');
}
函数getNext(inputVal,arr)
{
arr.sort();;
对于(变量i=0;i=inputVal)
{
返回arr[i];
}
}
抛出新错误(“超出范围”);
}
如果您知道数组总是要排序,或者如果事先对数组进行排序是合理的(例如,当数组不经常更改但需要大量检索时),则可以对排序后的数组使用二进制搜索
如果在数组中找不到该值,则返回上界,该上界指示大于给定值的最小元素。这将平均给出O(logn)复杂度,而朴素方法(在整个数组上循环)平均给出O(n)复杂度
// Binary search
// Adapted from http://jsfromhell.com/array/search
function binarySearch(arr, val, insert) {
var high = arr.length, low = -1, mid;
while (high - low > 1) {
mid = (high + low) >> 1;
if (arr[mid] < val) low = mid;
else high = mid;
}
if (arr[high] == val || insert) {
return high;
} else {
return -1;
}
}
function getClosestNext(arr, val) {
// Get index
var i = binarySearch(arr, val, true);
// Check boundaries
return (i >= 0 && i < arr.length) ? arr[i] : null;
}
//二进制搜索
//改编自http://jsfromhell.com/array/search
函数二进制搜索(arr、val、insert){
var高=平均长度,低=-1,中;
而(高-低>1){
中=(高+低)>>1;
如果(arr[mid]=0&&i
如果搜索57,输出应该是什么?数组通常有多长?只有像上面这样的几个元素或几千个元素?如果数组总是排序的,只需对排序数组中的值进行二进制搜索,只需稍加修改,即当搜索间隔变为空时,应返回上限。这s给出O(logn)复杂度,而天真的方法给出O(n)复杂度。请注意,sort
具有破坏性。@nnnnnnnnnn很自然。抱歉,我错过了它。@some-没关系,这些细节很容易错过:我必须编辑我的答案以包含排序回调函数(这样它实际上会按数字顺序排序,这是我一开始没有想到的)。是的..误读了他需要下一个到12的问题..注意arr.sort()
将按字典顺序排序(例如,“2”之前的“12”)除非您提供回调以执行其他操作,并且您可能希望在排序之前制作数组的副本,而不是更改输入数组。