정렬 된 목록에서 가장 가까운 수를 얻을 수있는이 방법은 가장 효과적인가요?

전체 뇌 :

나는 (10'000와 1'400'000 사이의 크기) 정수의 큰 배열이있다. 나는 값으로 더 큰 최초의 정수를 얻을 싶어요. 값은 배열 안에 결코 없다.

나는 다양한 솔루션을 검토 한하지만 난 단지 발견했다 :

  1. 각각의 값을 추정하고 (O (N) 시간 복잡도로) 정렬 된리스트 또는 배열을 위해 설계되지 않은 방법.
  2. (잘 모르겠어요 그래서, 비록 다른 언어로, O (N) 이상의 시간 복잡성) 매우 큰 목록이나 배열을 위해 설계 재귀 및 / 또는하지 않은 방법.

난 내 자신의 방법을 설계했습니다. 여기있어 :

int findClosestBiggerInt(int value, int[] sortedArray) {
    if( sortedArray[0]>value ||
            value>sortedArray[sortedArray.length-1] )   // for my application's convenience only. It could also return the last.
        return sortedArray[0];

    int exp = (int) (Math.log(sortedArray.length)/Math.log(2)),
        index = (int) Math.pow(2,exp);
    boolean dir; // true = ascend, false = descend.
    while(exp>=0){
        dir = sortedArray[Math.min(index, sortedArray.length-1)]<value;
        exp--;
        index = (int)( index+ (dir ? 1 : -1 )*Math.pow(2,exp) );
    }

    int answer = sortedArray[index];
    return answer > value ? answer : sortedArray[index+1];
}

그것은 O (로그 n)은 시간 복잡도를 갖는다. 길이 1'400'000의 배열로, 21 회 동안 블록 내부 루프 것이다. 그럼에도 불구하고, 나는 그것을 개선 할 수 없음을 잘 모르겠어요.

그것을 할 수있는 더 효과적인 방법은 외부 패키지의 도움없이,이 있습니까? 이 계산은 매우 빈번하게 발생하기 때문에 저장 때마다 중대하다.

감사 !

ruakh :

유전자의 대답에서 알 수 있듯이, 당신은 이진 검색이 작업을 수행 할 수 있습니다. 내장 java.util.Arrays클래스가 제공 방법 당신을 위해 할을 :binarySearch

int findClosestBiggerInt(final int value, final int[] sortedArray) {
    final int index = Arrays.binarySearch(sortedArray, value + 1);
    if (index >= 0) {
        return sortedArray[index];
    } else {
        return sortedArray[-(index + 1)];
    }
}

당신은 빨리 당신이 쓴 방법보다 훨씬 더 될 것을 찾을 수 있습니다; 그것은 여전히 O (로그 N ) 시간,하지만 같은 고가의 작업을 수행하지 않기 때문에 일정한 요인은 훨씬 낮은 것 Math.log하고 Math.pow.

추천

출처http://43.154.161.224:23101/article/api/json?id=317728&siteId=1