2013-05-14 5 views
0

배열에서 가장 가까운 float 값을 선택하는 데 문제가 있습니다. 다음은 몇 가지 예제 데이터입니다.배열의 가장 가까운 float 값 검색

처리 할 숫자는 항상이 미러링 특성을 공유합니다. 내가 -8.8를 검색 할 경우

{-9,-3,-1,0,1,3,9} 

나는 반환 기대 -9. 나는 8.8을 검색하면

은 내가 각 배열 요소를 뺀 값 I의 절대 값을 추적 배열을 갈 것입니다 가장 가까운 값에 대한 배열을 검색 할 때 과거에는 9

반환 기대 원했어. 가장 작은 값이 이길 것입니다. 방법은 나를 위해 여기에 문제를 제시 그건

배열에 이상이 개 번호는 것 때문에 상점 "가장 가까운"(내 위의 예 9 & -9에서)

+0

실제로 오타였습니다. – dubbeat

답변

0

당신이 언급 한대로, 당신의 숫자는, 이후 항상 0을 기준으로 미러링 한 다음 음수를 검사합니다 (배열이 정렬되었다고 가정). 언급 된 문제를 피할 수 있습니다. 0.5는 어때? 그것도 같은 거리에있는 두 개의 숫자가 있습니다. 어떻게 넥타이를 깰거야?

+0

배열이 항상 정렬됩니다. 그래서 만약 내 검색 값이 0보다 작 으면 배열의 전반을 검색하고 0보다 큰 검색은 배열의 두 번째 절반을 찾았 을까? 이것이 내가 지금 시도 할 것입니다. 0.5의 경우 ...... 확실하지 않다. – dubbeat

2

배열이 항상 정렬되므로 이진 검색은 후보 집합을 최대 2 개의 배열 값으로 줄 이도록해야합니다. 원래 어레이에 기계 정밀도보다 약간 다른 부동 소수점이 포함되어있는 경우 발생할 수있는 한 가지 문제점에 대해서만 생각할 수 있습니다.

이 상황에 가장 잘 대처하는 방법은 응용 프로그램에 달려 있습니다 (처음에는 비공개가 아닌 경우). 그러나 테스트 값과 구별 할 수없는 모든 값은 배열에 인접한 서브 시퀀스를 형성 할 것이므로 경험적으로이 서브 시퀀스의 중간 요소를 선택할 수 있습니다.

1

배열이 미러링되어 있기 때문에 쉽게 처리 할 수 ​​있습니다. 처음에는 검색 값의 부호를 무시할 수 있으며 언급 한 것처럼 가장 가까운 절대 값을 찾습니다. 그런 다음 서명을 수정하십시오.

이 코드는 파이썬이지만 필요한 코드로 번역 할 수 있도록 의사 코드에 충분히 근접해야합니다.

def find_closest(search_val): 
    smallest_diff = float(inf) 
    closest_val = 0 
    # Search only positive half of array 
    for val in [0, 1, 3, 9]: 
     # Treat search_val as positive for now 
     diff = abs(val - abs(search_val)) 
     if diff < smallest_diff: 
      smallest_diff = diff 
      closest_val = val 
    # Correct sign of result 
    if search_val < 0: 
     closest_val = -closest_val 
    return closest_val