전체 뇌 :
나는 (10'000와 1'400'000 사이의 크기) 정수의 큰 배열이있다. 나는 값으로 더 큰 최초의 정수를 얻을 싶어요. 값은 배열 안에 결코 없다.
나는 다양한 솔루션을 검토 한하지만 난 단지 발견했다 :
- 각각의 값을 추정하고 (O (N) 시간 복잡도로) 정렬 된리스트 또는 배열을 위해 설계되지 않은 방법.
- (잘 모르겠어요 그래서, 비록 다른 언어로, 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
.