ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • (분할 정복) 이진 탐색
    자료구조와 알고리즘 2020. 11. 1. 15:22

    탐색 알고리즘2: 이진 탐색 (Binary Search)

    1. 이진 탐색 (Binary Search) 이란?

    • 탐색할 자료를 둘로 나누어 해당 데이터가 있을만한 곳을 탐색하는 방법
    • 기본 조건은 데이터가 정렬되어 있어야 한다.

    다음 문제를 먼저 생각해보자

    이진 탐색의 이해 (순차 탐색과 비교하며 이해하기)

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

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

    3. 어떻게 코드로 만들까?

    • 이진 탐색은 데이터가 정렬되있는 상태에서 진행
    • 데이터가 [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 search(data, value):
        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
        
        while data[medium] < value:
            medium = len(data[medium+1:])//2
        while data[medium] > value:
            medium = len(data[:medium])//2
        if data[medium] == value:
            return True
        else:
            return False
    search([2,3,8,12,20],7)

    선생님꺼

    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+1:], search)
            else:
                return binary_search(data[:medium], search)
    import random
    data_list = random.sample(range(100), 10)
    data_list

    [69, 65, 18, 71, 11, 10, 42, 68, 36, 89]

    data_list.sort()
    data_list

    [10, 11, 18, 36, 42, 65, 68, 69, 71, 89]

    binary_search(data_list, 66)

    [10, 11, 18, 36, 42, 65, 68, 69, 71, 89]

    [68, 69, 71, 89]

    [68, 69]

    [68]

    False

    '자료구조와 알고리즘' 카테고리의 다른 글

    그래프 이해  (0) 2020.11.02
    순차탐색  (0) 2020.11.01
    (분할 정복) 병합 정렬(merge sort)  (0) 2020.10.31
    (분할 정복) 퀵 정렬  (0) 2020.10.31
    동적 계획법과 분할 정복  (0) 2020.10.31
전설의 개발자