정렬이 된 상태에서만 이진 트리 검색이 가능하다.
package ex03.test; // 프로그램에서는 이 방식을 이용한다. // 이 방식으로 찾으면 데이터 1개 찾을 때 5, 2개 찾을 때 10,... 5n이 되자너. 풀스캔으로 찾으려면 n이야. 여러 개의 데이터를 찾으려면 풀스캔이 나을 수도 있어. // 풀스캔의 성능이 이진 트리의 성능을 앞설 때도 있다. public class BinaryTest03 { public static void main(String[] args) { // N = 21 // 시간복잡도 log2(N) -> log2(21) -> 4.xxx (최대 5번이면 끝남) // 이진 검색 => 반드시 정렬이 되어 있어야 한다. // 21 / 2*2*2*2*2 -> logn -> log21 int[] arr = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20}; int N = arr.length; final int target = 5; int start = 0; int end = N - 1; // 21 - 1 int mid; int round = 1; // 찾고자 하는 번지 System.out.println(round + "회전: arr[" + start + "] ~ arr[" + end + "]의 값을 비교합니다."); round++; while (true) { mid = start + ((end - start) / 2); //8 if (arr[mid] == target) { // 8 == 5(false) System.out.println(round + "회전: " + target + "값은 " + mid + "번지에 있습니다."); break; } if (arr[mid] < target) { start = mid + 1; // 8+1 => 9번 인덱스 녀석부터 끝까지 본다. } if (arr[mid] > target) { end = mid - 1; } System.out.println(round + "회전: arr[" + start + "] ~ arr[" + end + "]의 값을 비교합니다."); round++; } System.out.println("시간 복잡도: " + Math.log(N) / Math.log(2)); // 이것보다 최악은 없다는 뜻이다. } }
Share article