이진 검색, 시간복잡도

Dec 20, 2023
이진 검색, 시간복잡도

1. 이진 검색

💡
정렬이 되어있는 데이터를 검색하는 방법 전체 데이터의 자리수/2 를 중간 값으로 하고, 이를 기준으로 찾고자 하는 값이 중간 값보다 크면 오른쪽, 작으면 왼쪽의 중간 값을 다시 구해 값을 찾는 방식
 
 
int[] arr = {0,1,2,3,4,5,6,7,8,9}
 
위의 배열에서 원하는 찾고자 하는 값이 7일 때,
총 10개의 값의 중간 값을 구한다.
중간 값 arr[min]= arr[10/2] = arr[5] =4 이렇게 구할 수 있다.
 
중간값을 기준으로 7>4 이기 때문에 4 이하의 값은 생략하고 5 이상의 값들로 다시 스캔한다.
 
중간 값 arr[min] = arr[7] = 7 이다.
 
찾고자 하는 값과 일치하기 때문에 스캔이 종료된다.
 
코드로 만들어보자.
 
우선 배열의 중간값을 찾아야 한다.
mid = start + ((end - start) / 2);
 
배열의 시작점 start =0 , 배열의 끝점 =10 이다.
첫번째 스캔 때는 변함이 없지만, 두번째 스캔부터 값이 변경된다.
만약 원하는 값이 중간 값보다 작다면 배열의 왼쪽을 스캔해야 하기 때문에 end값을 변경한다.
end 값은 중간값보다 하나 작은 값이 된다.
if(arr[min]>target){ end = mid - 1 ; }
 
반대로 원하는 값이 중간 값보다 크다면 배열의 오른쪽을 스캔한다. 이때는 end 값은 그대로지만 start 값이 mid 위치에서 +1 증가한다.
 
if(arr[min]<target{ start= mid + 1 ; }
 
이제 반복문으로 합쳐보자
 
public static void main(String[] args) { int[] arr = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; Scanner sc = new Scanner(System.in); System.out.print("원하는 값을 입력하세요:"); int target = sc.nextInt(); int start = 0; int end = arr.length - 1; int mid; int count = 0; while (true) { mid = start + ((end - start) / 2); count = count + 1; if (arr[mid] == target) { break; } else if (arr[mid] < target) { start = mid + 1; } else if (arr[mid] > target) { end = mid - 1; } } System.out.println("타겟의 위치는 " + mid); System.out.println("검색 횟수 :" + count); }
 
반복이 언제 종료될지 모르기 때문에 while 반복문을 사용했다.
배열의 시작점의 인덱스는 0 , 끝점의 인덱스는 데이터의 수 -1 이다.
 
반복문이 돌 때 마다 mid 값을 변경해 target 값과 arr[min] 값이 일치할 때 break 로 코드를 종료한다.
notion image
 
{0,1,2,3,4,5,6,7,8,9} 에서 처음 중간 값 4이다. target 값을 3으로 정한다면 배열의 왼쪽을 다시 스캔한다. 이때 중간 값은 1이 되며, 1의 오른쪽을 다시 스캔한다. 이때는 중간 값이 2가 되고, 3은 그 다음 스캔 때 찾게 된다.
 
 

2. 이진검색의 장점

 
💡
검색속도가 매우 빨라 대량의 데이터를 스캔하는데 유리하다. 단 자료가 정렬되어 있어야 서용할 수 있다.
 
예를 들어 {0,1,2,3,4,5,6,7,8,9} 의 배열에서 0을 검색한다고 가정하자.
왼쪽부터 스캔하면 1번만에 스캔이 가능하다. 하지만 오른쪽부터 스캔을 하게 된다면? 10번만에 스캔해야 한다.
 
하지만 이진 검색으로 하게 된다면, 최소는 1번, 최대 4회 이내에 값을 찾을 수 있다.
 
 
 

3. 시간복잡도

💡
입력한 값을 연산할 때, 연산횟수에 비해 걸리는 시간을 나타내는 것
스캔의 시간복잡도는 데이터가 늘어나면 선형으로 늘어난다.
 
notion image
 
 
 
이번에는 이진검색을 알아보자.
 
이진검색은 로그의 형태로 늘어난다.
예를 들면 데이터의 크기가 8 이라면 log2(8)=3 이기 때문에 총 3회 이내로 스캔이 완료된다.
자료 크기가 256개가 되면 log2(256) = 8 이기 때문에 8회 이내에 스캔이 완료가 된다.
자려 크기가 20이라면 log2(20) = 4. xx기 때문에 횟수로는 5번 이내 스캔 완료된다.
선형 탐색에 비해 찾는 속도가 매우 빠르다.
 
{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19}
20개의 데이터가 있다.
 
1개의 데이터를 찾는다면 선형 탐색은 최대 20번의 스캔이 필요한데 이진검색은 최대 5번이 걸린다.
그렇다면 4개의 파일을 찾게된다면 어떻게 될까.
 
선형탐색은 동일하게 20번의 스캔이 필요하지만, 이진검색은 최대 20번이 필요하다.
4개 이상이 되면 이진검색은 선형탐색에 비해 효율이 떨어지게 된다.
 
💡
이진검색은 데이터의 15% 미만인 경우에 효과적이다.
 
Share article

{CODE-RYU};