설명에서 언급 한 것처럼 배열이 정렬되므로 2 진수 검색을 수행하여 숫자가 나타나는 배열에서 가장 낮은 인덱스를 찾고 번호가 나타나는 가장 높은 인덱스를 찾을 수 있습니다. 이진 검색을 사용하여 색인을 찾고 O (log n) 알고리즘을 얻습니다.
일부 다른 배열 값으로이 코드를 사용해보십시오.
public static void main(final String[] args) {
final int numberToCount = 7;
final int[] x = new int[]{1,2,3,4,4,6,6,6,6,7,7,7,7,7,8,8,8,8,8,8};
final int indexOfKnownOccurence = Arrays.binarySearch(x, numberToCount);
if (indexOfKnownOccurence < 0) {
System.out.println("No instances of the number found");
return;
}
final int lowerBound = findIndexOfFirstOccurence(x, numberToCount, 0, indexOfKnownOccurence);
final int upperBound = findIndexOfLastOccurence(x, numberToCount, indexOfKnownOccurence, x.length - 1);
System.out.println("Lower bound: " + lowerBound);
System.out.println("Upper bound: " + upperBound);
System.out.println("Number of occurrences: " + (upperBound - lowerBound + 1));
}
//Binary search for start index
public static int findIndexOfFirstOccurence(final int[] x, final int numberToFind, final int startIndex, final int endIndex) {
if (startIndex == endIndex) {
return startIndex;
} else if (x[startIndex] == numberToFind) {
return startIndex;
} else if (startIndex + 1 == endIndex) {
return endIndex;
}
final int midIndex = startIndex + (int)Math.floor((endIndex - startIndex)/2);
if (x[midIndex] == numberToFind) {
return findIndexOfFirstOccurence(x, numberToFind, startIndex, midIndex);
} else {
return findIndexOfFirstOccurence(x, numberToFind, midIndex, endIndex);
}
}
//Binary search for end index
public static int findIndexOfLastOccurence(final int[] x, final int numberToFind, final int startIndex, final int endIndex) {
if (startIndex == endIndex) {
return endIndex;
} else if (x[endIndex] == numberToFind) {
return endIndex;
} else if (startIndex + 1 == endIndex) {
return startIndex;
}
final int midIndex = startIndex + (int)Math.floor((endIndex - startIndex)/2);
if (x[midIndex] == numberToFind) {
return findIndexOfLastOccurence(x, numberToFind, midIndex, endIndex);
} else {
return findIndexOfLastOccurence(x, numberToFind, startIndex, midIndex);
}
}
배열 x은 정렬되지 않습니다. 이진 검색을 사용하여 숫자의 수를 찾을 수 있습니다. –
물론입니다. n-1에 대한 이진 검색, n + 1에 대한 이진 검색, 사이에있는 요소의 수를 찾습니다. –
바이너리 접근법이 O (logn) – Keiwan