在Javascript中,给定一个值和一个排序数组,获取数组中最接近值的正式方法?
如果我有这样一个数组:在Javascript中,给定一个值和一个排序数组,获取数组中最接近值的正式方法?,javascript,algorithm,Javascript,Algorithm,如果我有这样一个数组: var array = [1, 3, 4, 5, 9, 10]; var value = 8; var getClosestValues = function(array, value) { var low, high = 0, value; for (var i = 0; i < array.length; i++) { if (low <= value && low < array[i])
var array = [1, 3, 4, 5, 9, 10];
var value = 8;
var getClosestValues = function(array, value) {
var low, high = 0, value;
for (var i = 0; i < array.length; i++) {
if (low <= value && low < array[i])
low = array[i];
if (high == value && high < array[i])
high = array[i];
};
return [low, high];
}
我有这样一个价值观:
var array = [1, 3, 4, 5, 9, 10];
var value = 8;
var getClosestValues = function(array, value) {
var low, high = 0, value;
for (var i = 0; i < array.length; i++) {
if (low <= value && low < array[i])
low = array[i];
if (high == value && high < array[i])
high = array[i];
};
return [low, high];
}
我想得到这个结果:
var result = getClosestValues(array, value); // [5, 9]
在javascript中,正确/首选的方法是什么?看起来这可能是某种形式的算法。也许是这样:
var array = [1, 3, 4, 5, 9, 10];
var value = 8;
var getClosestValues = function(array, value) {
var low, high = 0, value;
for (var i = 0; i < array.length; i++) {
if (low <= value && low < array[i])
low = array[i];
if (high == value && high < array[i])
high = array[i];
};
return [low, high];
}
谢谢 如果数组已排序且较大,请使用二进制切块查找最近的元素:
var getClosestValues = function(a, x) {
var lo = -1, hi = a.length;
while (hi - lo > 1) {
var mid = Math.round((lo + hi)/2);
if (a[mid] <= x) {
lo = mid;
} else {
hi = mid;
}
}
if (a[lo] == x) hi = lo;
return [a[lo], a[hi]];
}
否则,只需从一端扫描到另一端,跟踪目标上方和下方最近的值。不幸的是,对于此算法,您的版本已损坏。以下是另一个版本:
var getClosestValues = function(a, x) {
var lo, hi;
for (var i = a.length; i--;) {
if (a[i] <= x && (lo === undefined || lo < a[i])) lo = a[i];
if (a[i] >= x && (hi === undefined || hi > a[i])) hi = a[i];
};
return [lo, hi];
}
C代码
对于具有排序值的数组,数据是矩阵,xIndex是要搜索的列,xVal是要搜索的值,threshold是允许的距离,可能为0:
public static int getNearestValueIndex(double[][] data, int xIndex, Number xVal, int threshold){
int indexMin = 0;
int indexMax=data.length-1;
int index;
double val;
double valToFind=xVal.doubleValue();
double diff;
index = (indexMax+indexMin)/2;
while(index!=indexMin){
val = data[index][xIndex];
diff = Math.abs(valToFind-val);
if(diff<=threshold) break;
if(val<valToFind){
indexMin=index;
}else if(val>xVal.doubleValue()){
indexMax=index;
}
index = (indexMax+indexMin)/2;
}
val = data[index][xIndex];
if(data.length>(index+1) && Math.abs(valToFind-val)> Math.abs(valToFind-data[index+1][xIndex])){
index=index+1;
}
return index;
}
如果数组中有一个8怎么办。。它应该只返回它吗?您是否希望得到2个最接近的值或值的任意一侧最接近的值。例如,如果value=6,它应该返回[4,5]还是[5,9]?数组保证被排序吗?是的,如果数组中有8,它应该返回8,否则,两个周围的值eah,binary search是你的朋友。你需要定义一个接近度阈值,你知道元素X低于目标,一个元素Y大于目标,然后在这两个元素之间扫描。你完全有可能需要追踪这些。因此,当您测试一个元素时,在丢弃它之前,请将它存储在这两个保留位置之一。当array.length为奇数时,这对我来说是失败的。var mid=数学圆+高/2;修好了。@miguelrios:谢谢你指出这一点。我忘了在JavaScript中除法总是浮点的。我已经修改了我的答案。@GhoulFool:线性扫描算法报告10.1是10上或以上的最接近值,而10上或以下没有值。怎么了?顺便说一句,我刚刚调整了二进制chop版本,使其行为方式相同。它用来返回两个最低的值,即使它们都高于10。为javascript问题提供c代码并没有那么有用!