2010-12-13 1 views
12

이 같은 배열이있는 경우 :Javascript에서 가장 가까운 값을 배열에서 가져 오는 정식 방법, 값 및 정렬 된 배열이 있습니까?

var array = [1, 3, 4, 5, 9, 10]; 

을 그리고이 같은 값을 가지고 올바른 무엇

var result = getClosestValues(array, value); // [5, 9] 

/:

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]]; 
} 

: 어레이가 정렬 크면

+0

배열에 8이 있다면 ... 그냥 반환해야합니까? –

+0

가장 가까운 2 개의 값 또는 가장 가까운 값을'value'의 양쪽에 넣으려고하십니까? 예를 들어'value = 6'가'[4,5]'또는'[5,9]'를 리턴해야합니까? –

+0

배열의 정렬이 보장 되나요? –

답변

32

가까운 요소를 찾아 진 고기를 사용 목표. 이 알고리즘에서는 불행히도 버전이 손상되었습니다. 여기에 또 다른 버전이다 :

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]; 
} 
+0

예, 이진 검색은 여기에 친구입니다. –

+0

원소 X가 타겟보다 낮고 원소 Y가 타겟보다 크다는 것을 알면, 근접성에 대한 임계 값을 정의한 다음 두 요소 사이를 스캔해야합니다. 그것은 당신이 그것들을 추적 할 필요가있을 가능성이 완전히 있습니다. 따라서 요소를 테스트 할 때 폐기하기 전에이 요소를 두 개의 보관 장소 중 하나에 저장하십시오. – jcolebrand

+4

array.length가 홀수 인 경우 실패합니다. 'var mid = Math.round ((lo + hi)/2);'수정합니다. – miguelrios

-5

C 코드 정렬 값 (데이터는 행렬로 배열의

#include <stdio.h> 

#define moddiff(a,b) ((a > b) ? (a-b) : (b-a)) 

#define uint unsigned int 

/* test case : sample array */ 
uint arr[] = { 1, 4, 9, 16, 25, 36, 49 , 64, 81 }; 

/* search for nearest num to key in a sorted array */ 
uint nrst_num(uint arr[], uint lo, uint hi, uint key) 
{ 
    uint mid = 0; 
    uint mid_parent = 0; 

    while (lo <= hi) { 
    mid_parent = mid; 
    mid = (lo + hi)/2; 

    if (key == arr[mid]) { 
     return mid; 
    } else if (key < arr[mid]) { 
     hi = mid - 1; 
    } else if (key > arr[mid]) { 
     lo = mid + 1; 
    } 
    } 

    uint ldiff = moddiff(key, arr[lo]); 
    uint mdiff = moddiff(key, arr[mid]); 
    uint hdiff = moddiff(key, arr[hi]); 
    uint mid_parent_diff = moddiff(key, arr[mid_parent]); 

    /* select the index from the lowest diff */ 
    if ((mid_parent_diff <= mdiff) && (mid_parent_diff <= ldiff) && (mid_parent_diff <= hdiff)) { 
     return mid_parent; 
    } else if ((mdiff <= mid_parent_diff) && (mdiff <= ldiff) && (mdiff <= hdiff)) { 
     return mid; 
    } else if ((ldiff <= mdiff) && (ldiff <= hdiff) && (ldiff <= mid_parent_diff)) { 
     return lo; 
    } 

    return hi; 
} 


int main() 
{ 
/* test case */ 
    uint key = 0; 

    printf(" { 1, 4, 9, 16, 25, 36, 49 , 64, 81 }"); 
    uint res = nrst_num(arr, 0, 8, key); 

    printf (" nearest point to key=%d is val=%d \n", key, res); 
} 
+2

'javascript' 질문에'c' 코드를 제공하는 것이 그렇게 유용하지 않습니다! –

0

가 xIndex 검색하는 열이 임계치는 인 경우 xval가 sarch하는 값이며 허용 거리 (아마도 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; 
} 
관련 문제