yooniiverse
개발 블로그
yooniiverse
전체 방문자
오늘
어제
  • 분류 전체보기
    • 운영체제
    • 네트워크
    • ~2023.02
      • 외부교육
      • 대외활동
      • 스터디
      • 동아리
      • TIL
      • IT지식
      • 기타
      • 트러블 슈팅
      • 프로그래밍
      • Python
      • Java
      • JS
      • DB(SQL)
      • JSP
      • Spring
      • 기술면접
      • 자바
      • 코딩테스트
      • 자료구조
      • 알고리즘
      • 백준 문제풀이
      • 인공지능
      • 머신러닝
      • 프로젝트
      • 안드로이드 앱개발
      • 웹개발
      • 웹 서비스
      • 웹퍼블리싱
      • Node.js 백엔드 개발
      • CS
      • 1일 1CS지식
      • 운영체제
      • 네트워크
      • 데이터베이스
      • 정보처리기사
      • 도서 리뷰
      • 개발 관련 도서
      • 기타 도서

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
yooniiverse

개발 블로그

~2023.02/알고리즘

[탐색 알고리즘 #1] 이진 탐색(Binary Search)

2022. 2. 25. 18:57
📌 탐색 알고리즘

- 이진 탐색 ✔
- 순차 탐색
- 코딩 테스트 연습문제 풀이

 

이진 탐색(Binary Search)


  • 탐색할 자료를 둘로 나누어 해당 데이터가 있을만한 곳을 탐색하는 방법

 

분할 정복 알고리즘과 이진 탐색


  • 분할 정복 알고리즘 (Divide and Conquer)
    • Divide : 문제를 하나 또는 둘 이상으로 나눈다.
    • Conquear : 나눠진 문제가 충분히 작고, 해결이 가능하다면 해결하고, 그렇지 않다면 다시 나눈다.
  • 이진탐색
    • Divide : 리스트를 두 개의 서브 리스트로 나눈다.
    • Conquear
      • 검색할 숫자 (search) > 중간값 이면, 뒷 부분의 서브 리스트에서 검색할 숫자를 찾는다.
      • 검색할 숫자 (search) < 중간값 이면, 앞 부분의 서브 리스트에서 검색할 숫자를 찾는다.

 

어떻게 코드로 만들까?


  • 이진 탐색은 데이터가 정렬돼있는 상태에서 진행
  • 데이터가 [2, 3, 8, 12, 20] 일 때,
    • binary_search(data_list, find_data) 함수를 만들고
      • find_data는 찾는 숫자
      • data_list는 데이터 리스트
      • data_list의 중간값을 find_data와 비교해서
        • find_data < data_list의 중간값 이라면
          • 맨 앞부터 data_list의 중간까지 에서 다시 find_data 찾기
        • data_list의 중간값 < find_data 이라면
          • data_list의 중간부터 맨 끝까지에서 다시 find_data 찾기
        • 그렇지 않다면, data_list의 중간값은 find_data인 경우로, return data_list 중간위치

 

알고리즘 구현


def binary_search(data, search):
    print(data)
    if len(data) == 1 and search == data[0]:
        return True
    if len(data) == 1 and search != data[0]:
        return False
    if len(data) == 0:
        return False

    medium = len(data) // 2
    if search == data[medium]:
        return True
    else:
        if search > data[medium]:
            return binary_search(data[medium:], search)
        else:
            return binary_search(data[:medium], search)


import random
data_list = random.sample(range(100), 10)
data_list.sort()
print(data_list)
print(binary_search(data_list, 7))
[3, 11, 17, 21, 31, 37, 43, 69, 75, 99]
[3, 11, 17, 21, 31, 37, 43, 69, 75, 99]
[3, 11, 17, 21, 31]
[3, 11]
[3]
False

 

알고리즘 분석


  • n개의 리스트를 매번 2로 나누어 1이 될 때까지 비교연산을 k회 진행
    • n * (1/2) * (1/2) ... = 1
    • n * (1/2)^k = 1
    • n = 2^k = log(2)n = log(2)2^k
    • log(2)n = k
    • 빅 오 표기법으로는 k + 1 이 결국 최종 시간 복잡도임 (1이 되었을 때도, 비교연산을 한 번 수행)
      • 결국 O(log(2)n + 1)이고, 2와 1, 상수는 삭제 되므로, O(logn)

'~2023.02 > 알고리즘' 카테고리의 다른 글

[탐색 알고리즘 #3] 코딩 테스트 연습문제 풀이  (0) 2022.02.25
[탐색 알고리즘 #2] 순차 탐색(Sequential Search)  (0) 2022.02.25
동적 계획법과 분할 정복  (0) 2022.02.23
탐욕 알고리즘(그리디)  (0) 2022.02.23
그래프 기본 탐색 알고리즘_너비 우선 탐색(BFS)  (0) 2022.01.15
    '~2023.02/알고리즘' 카테고리의 다른 글
    • [탐색 알고리즘 #3] 코딩 테스트 연습문제 풀이
    • [탐색 알고리즘 #2] 순차 탐색(Sequential Search)
    • 동적 계획법과 분할 정복
    • 탐욕 알고리즘(그리디)
    yooniiverse
    yooniiverse

    티스토리툴바