Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Javascript中,给定一个值和一个排序数组,获取数组中最接近值的正式方法?_Javascript_Algorithm - Fatal编程技术网

在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代码并没有那么有用!