CS 알고리즘 이진탐색

Dec 18, 2023
CS 알고리즘 이진탐색

이진검색이란 ?

💡
배열을 반씩 잘라가며 중앙값을 기준으로 목표를 찾아가는 방법
 
💡
중앙값의 위치는 최솟값 + (최댓값 - 최솟값) / 2 로 정의
💡
mid = start + ((end - start) / 2)
 
💡
세 가지 기본 원칙
  1. 중앙값보다 작으면 왼쪽에서 찾는다
  1. 중앙값보다 크면 오른쪽에서 찾는다
  1. 중앙값과 같으면 찾은것이다
 
💡
시간 복잡도 = O(log n)
선형탐색(풀스캔)은 시간 복잡도가 O(n)으로 비효율적이다.
 
그렇지만 배열 안에서 찾는 요소의 수가 여러개일 때에는
💡
분포도가 10~15% 이상인 경우는 랜덤액세스 비용때문에 선형탐색(풀스캔)이 더 좋다
 
 
public class BinarySearch { public static void main(String[] args) { // N = 21 // 시간복잡도 log2(N) -> log2(21) -> 4.xxx // 이진 검색 => 반드시 정렬이 되어 있어야 한다. // 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 = 2; int start = 0; int end = N - 1; int mid; int round = 1; while (true) { // 1 회전 mid = start + ((end - start) / 2); // 기대값 7 System.out.println("mid: " + mid); if (arr[mid] == target) { System.out.println(round + "회전 : " + target + "값은 " + mid + "번지에 있습니다"); break; } if (arr[mid] < target) { // 기대값 start 5, end 8 start = mid + 1; } if (arr[mid] > target) { end = mid - 1; } System.out.println(round + "회전 start : " + start); System.out.println(round + "회전 end : " + end); round++; } System.out.println("시간복잡도 : " + (Math.log(N) / Math.log(2))); } }
Share article

stwin755