검색 알고리즘 - (이진 검색)

2022. 7. 22. 16:53·Algorithm/자료구조와 함께 배우는 알고리즘

이번 글에서 해시법과 이진검색을 같이 포스팅하려 했지만 해시법을 공부하는데 시간이 많이 소요될 것 같아 이진검색 따로 먼저 포스팅 하려한다. 

 

이진검색을 업다운 게임을 예로 들자면 업다운 게임도 원하는 값을 최대한 적은 횟수로 찾아내는 것이다. 그럴 때 가장 좋은 방법은 범위의 중간값을 계속해서 물어보는 것이다.

 

이번 단원은 이러한 원리를 잘 알고 있으면 이해하는데 큰 어려움은 없을 것 같다.


이진검색

 

이진검색이란 데이터가 정렬 된 상태에서 선형 알고리즘보다 빠르게 검색할 수 있는 알고리즘이다. 

 

앞서 쉽게 설명을 했었는데 다시한번 정확히 개념을 설명하자면 배열이 정렬된 상태에서 원하는 값과 배열의 중간값을 비교해본다. 이 때 중간값과 같지 않다면 대소비교를 통해 범위를 점점 좁혀나가는 것이다.

 

다음은 실행 코드이다.

def bin_search(a,key):
    pl = 0
    pr = len(a) - 1

    while (1):
        pc = (pl + pr) // 2
        if a[pc] == key:
            return pc

        elif a[pc] < key:
            pl = pc + 1

        else :
            pr = pc - 1

        if pl > pr:
            break
            
            
if __name__ == '__main__':
    num = int(input('원소 수 입력 :'))
    x = [None] * num

    print('배열 데이터 입력 : ')

    x[0] = int(input('x[0]: '))

    for i in range(1,num):
        while True:
            x[i] = int(input(f'x[{i}]: '))
            if x[i] >= x[i - 1]:
                break

    ky = int(input('검색할 값 입력 :'))

    idx = bin_search(x,ky)

    if idx == -1:
        print('검색값을 갖는 원소가 존재하지 않음')
    else :
        print(f'검색값은 x[{idx}]')

위 코드는 책에서 나온 코드이다. bin_search함수가 이진검색 알고리즘인데 pl은 배열의 첫번째 pr은 배열의 마지막 pc는 배열의 중간 값이다.  

 

나도 이론을 다 알고있다고 생각해서 아래 코드를 혼자 짜보았는데 내 생각과는 달리 이상한 값이 나올 때도 여러번 있었다.

 

어디서 이런 오류값이 나오는지 찾지 못해 우선 현재까지의 코드를 올려놓고 추후 수정해야겠다.

# 이진검색 알고리즘

a_list = []
def binary_search(a: list,key):
    pl = 0                  # 배열의 시작지점
    pr = len(a) - 1         # 배열의 끝지점
    pc = (len(a) - 1) // 2  # 배열의 중간지점

    a.sort()				# 리스트를 정렬

    while key != pc:		# pc값이 key값과 같아질 때까지 실행

        if key > pc:		# pc 값이 key값보다 작을 때
            pl = pc
            pc_index = int((pr - pl) // 2)
            pc = a[pc_index]

        elif key < pc:		# pc 값이 key값보다 클 때
            pr = pc
            pc_index = int((pr - pl) // 2)
            pc = a[pc_index]

        if pl > pr:
            break
            return -1
        return pc

복잡도

 

알고리즘의 성능을 객관적으로 평가하는 기준. 복잡도는 크게 시간복잡도와 공간복잡도 두가지로 나뉜다. 이 전에 공부했었던 '파이썬 알고리즘 인터뷰' 책에서 나온 빅오와 같다고 생각한다. → https://re-hwi.tistory.com/64 

 

  • 시간 복잡도

: 실행하는데 필요한 시간을 평가

 

  • 공간 복잡도

: 메모리와 파일 공간이 얼마나 필요하지를 평가

 

 

반응형
저작자표시 (새창열림)

'Algorithm > 자료구조와 함께 배우는 알고리즘' 카테고리의 다른 글

스택과 큐  (0) 2022.07.25
검색 알고리즘 - (해시법)  (0) 2022.07.24
검색 알고리즘 - (선형 알고리즘)  (0) 2022.07.21
기본 자료구조와 배열  (0) 2022.07.21
반복하는 알고리즘 (2)  (0) 2022.07.18
'Algorithm/자료구조와 함께 배우는 알고리즘' 카테고리의 다른 글
  • 스택과 큐
  • 검색 알고리즘 - (해시법)
  • 검색 알고리즘 - (선형 알고리즘)
  • 기본 자료구조와 배열
re-hwi
re-hwi
재휘의 개발일기
    반응형
  • re-hwi
    Dvelopment blog
    re-hwi
  • 전체
    오늘
    어제
    • 재휘의 개발일기 (168)
      • 개발 (1)
        • 소프트웨어 공학 (25)
      • Python (18)
        • numpy (8)
      • OS (23)
        • 쉽게 배우는 운영체제 (23)
      • Front end (1)
        • HTML (6)
        • CSS (9)
        • JavaScript (18)
        • React (2)
        • Vue.js (5)
        • TypeScript (5)
        • Sass (3)
      • Algorithm (1)
        • 파이썬 알고리즘 인터뷰 (2)
        • 자료구조와 함께 배우는 알고리즘 (20)
      • Android (2)
        • 안드로이드 앱 프로그래밍 with 코틀린 (2)
      • Project (15)
      • Network (0)
      • etc (12)
        • 이것저것 (10)
  • 블로그 메뉴

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

  • 공지사항

  • 인기 글

  • 태그

    typeScript
    표
    오블완
    TS
    pwa
    프론트엔드
    자료구조
    개발
    연결리스트
    JavaScript
    컴포넌트
    파이썬
    FE
    뷰
    타입스크립트
    sass
    js
    정보처리기사
    CSS
    자료흐름도
    리액트
    numpy
    REACT
    정처기
    HTML
    scss
    플레이리스트
    알고리즘
    티스토리챌린지
    vue
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
re-hwi
검색 알고리즘 - (이진 검색)
상단으로

티스토리툴바