이진탐색(Binary Search)

2023. 4. 6. 22:47·Algorithm

 

정렬된 상태의 데이터에서 특정 값을 빠르게 탐색하는 방법

- 찾고자 하는 값과 데이터 중앙에 있는 값을 비교

- 찾고자 하는 값이 더 작으면 데이터 왼쪽 부분에서 이진 탐색

- 찾고자 하는 값이 더 크면 데이터 오른쪽 부분에서 이진 탐색

알고리즘 시간 복잡도 : O(logn)

 

이진 탐색의 구현

1. 탐색의 대상이 되는 자료들이 array[low] 에서부터 array[high]에 들어있다고 가정하자. (정렬되어 있어야 함)

즉 어떤 시점에서 탐색되어야 할 범위는 low에서 high 까지가 된다.

맨 처음 low에는 0번 인덱스의 값, high에는 n-1번 인덱스의 값이 들어갈 것이다.

 

2. low와 high값에 의거해  중간값mid 값은 (low + high) / 2이다.

즉, array[low] ~ array[high] 까지의 탐색은

array[low] ~ array[middle-1] +  array[middle+1] + array[high]까지의 탐색이 된다.

 

3. array[mid] 값과 구하고자 하는 key값을 비교한다.

3-1. key > mid :  구하고자 하는 값이 중간값보다 높다면 low를 mid +1로 만들어 줌 (왼쪽 반을 버림)

3-2. key < mid : 구하고자하는 값이 중간값 보다 낮다면 high를 mid-1로 만들어 줌 (오른쪽 반을 버림)

3-3. key == mid : 구하고자 하는 값을 찾음 중간값 리턴 

 

4. low > high가 될 때까지 1~3번을 반복하면서 구하고자 하는 값을 찾는다.

(이때까지 못 찾으면 탐색 실패 -1, false, error 등 return)

 

 

이진 탐색 과정

데이터가 우선 정렬된 상태여야 이진 탐색 진행 가능

찾고자 하는 데이터 : 30

반복문
// 반복문 구조
    public static int binarySearch(int arr[], int target) {
        int left = 0;
        int right = arr.length -1;

        while (left <= right){
            int mid = (left + right) / 2; // mid를 중앙으로 설정 해줌
        if(target == arr[mid]) return mid; // 찾고자 하는 target이 mid 면 return
        else if (target < arr[mid]) { // target이 mid 작다면
            right = mid - 1; // right을 중앙으로
        }else {
            left = mid + 1; // target이 mid 크다면 left를 중앙으로
        }
    }
        return -1;
    }

 

 

재귀 호출

 

// 재귀 호출 구조
    public static int binarySearch2(int[] arr, int target, int left, int right) {
        if(left > right){ // 탈출 조건
            return -1;
        }
        int mid = (left + right) / 2;
        if(target == arr[mid]) return mid;
        else if (target < arr[mid]) {
            return binarySearch2(arr, target, left, mid - 1);
        }else {
            return binarySearch2(arr, target, mid + 1, right);
        }
    }

 

'Algorithm' 카테고리의 다른 글

투포인터 (Two Pointers)  (0) 2023.04.03
힙(Heap)  (0) 2023.04.02
그래프  (1) 2023.03.29
이진 탐색 트리 자료구조 2  (1) 2023.03.28
이진 탐색 트리 자료구조  (1) 2023.03.28
'Algorithm' 카테고리의 다른 글
  • 투포인터 (Two Pointers)
  • 힙(Heap)
  • 그래프
  • 이진 탐색 트리 자료구조 2
JAVALA
JAVALA
워니‘s Diary
  • JAVALA
    정신줄 JAVA라
    JAVALA
  • 전체
    오늘
    어제
    • 분류 전체보기 (84)
      • Codding_Test (11)
        • BaekJoon (7)
        • Programmers (3)
      • Algorithm (11)
      • Daily (4)
        • memoir (4)
      • TroubleShooting (8)
        • InteliJ (1)
        • Server (1)
        • Infra (0)
        • DB (0)
      • Computer Science (1)
      • JAVA (8)
      • Javascript (0)
      • Spring Boot (7)
      • API (2)
      • Server (0)
      • DB (2)
        • ORACLE (1)
      • Infra (2)
      • Refactoring (0)
      • Plugin (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    개발자 비전공자
    자바 스프링부트
    spring boot
    프론트엔드 개발자
    개발자
    자바 알고리즘
    자바
    자바 스프링
    springboot
    백엔드 개발자
    개발자 국비
    백준
    개발자 부트캠프
    스프링부트
    코딩테스트
    트리 자료구조
    자바 클래스
    자바 메소드
    제로베이스
    프로그래머스
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
JAVALA
이진탐색(Binary Search)
상단으로

티스토리툴바