꿈꿈개
꿈을 좇아 꿈틀꿈틀
꿈꿈개
전체 방문자
오늘
어제
  • 분류 전체보기 (24)
    • 코딩테스트 문제풀이 (16)
    • 일기 (1)
    • AI (0)
      • 논문리뷰 (0)
      • NLP (0)
      • CV (0)
    • 자료구조 (2)
    • 알고리즘 (4)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 일기 #개발자 #퇴사 #인생 #기록 #블로그
  • 개발 #알고리즘 #자료구조

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
꿈꿈개
알고리즘

[알고리즘] 이진탐색

알고리즘

[알고리즘] 이진탐색

2022. 8. 11. 13:24

이진탐색

이진탐색(Binary Search)은 반으로 쪼개가면 탐색하는 알고리즘이다.

단, 데이터가 정렬되어있다는 것을 전제조건으로 깔고 간다. 

 

이를 위해 시작, 끝, 중간점을 변수로 지정하여 찾으려는 값과 배열의 중간점에 있는 데이터를 반복적으로 비교한다!

 

시간복잡도 : O(logN)

 

코드 구현

#이진탐색은 전제조건을 정렬이다.
#처리해야할 데이터 개수나 값이 1000만 단위 이상으로 넘어가면 이진탐색과 같이 o(logn)의 속도를 내는 이진탐색을 고려야한다

def binary_search(array, target, start, end) :
    if start>end :
        return None
    pivot=(start+end)//2
    if array[pivot]==target :
        return pivot
    elif array[pivot]>target :
        return binary_search(array, target, start, pivot-1)
    elif array[pivot]<target :
        return binary_search(array, target, pivot+1, end)

n, target=list(map(int, input().split()))
array=list(map(int, input().split()))

result=binary_search(array, target, 0, n-1)
if result == None :
    print("존재하지 않음")
else :
    pirnt(result+1)



 

bisect 라이브러리

 

파이썬에서 이진탐색을 쉽게 이용할 수 있도록 라이브러리를 제공한다.

  • bisect_left(a, x) : 정렬된 순서를 유지하면서 리스트 a에 데이터 x를 삽입할 가장 왼쪽 인덱스를 찾는 메서드
  • bisect_rigth(a,x) : 정렬된 순서를 유지하도록 리스트 a에 데이터 x를 삽입할 가장 오른쪽 인덱스를 찾는 메서드

예를 들어 정렬된 리스트 [2, 3, 3, 6, 7, 8]이 들어있을 경우 3을 넣고자 한다고 치면 bisect_left(array, 3) 은 인덱스 1, bisect_rigth(array, 3)은 인덱스 3을 반환한다.

 

이 라이브러리를 이용해 특정 범위에 속하는 원소의 개수를 구할 때 용이하다. O(logN)으로 빠르게 계산가능!

트리 자료구조

트리 자료 구조란 노드와 노드의 연결로 표현

그래프 자료구조의 일종으로 데이터베이스 시스템에서 많은 양의 데이터를 관리하기 위해 사용된다고한다.

 

주요특징

  • 부모노드와 자식노드의 관계료 표현
  • 최상단 노드를 루트노드라고함
  • 최하단 노드를 단말 노드라고 함
  • 트리의 일부를 서브 트리라고 함
  • 계층적이고 정렬된 데이터를 다루기에 적합

 

이진 탐색 트리

이진탐색이 동작될 수 있도록 구현된 자료구조이다.

모든 트리가 이진탐색트리는 아니다.

 

주요특징

  • 부모 노드보다 왼쪽 자식 노드가 작음
  • 부모 노드보다 오른쪽 자식 노드가 큼

 

※빠르게 입력받는 법!

 

주로 이진 탐색 문제는 입력 데이터가 많거나 탐색 범위가 넓은 편이므로 빠르게 입력받을 수 있는 sys 라이브러리를 사용하면 좋다!

 

사용방법

import sys

input_data=sys.stdin.readline().rstrip()

pirnt(input_data)

 

※해당 포스팅은 <이것이 취업을 위한 코딩테스트다 (나동빈 저)> 책을 참고하여 작성되었습니다.

'알고리즘' 카테고리의 다른 글

[알고리즘] 최단경로 찾기  (0) 2022.08.11
[알고리즘] 다이나믹 프로그래밍  (0) 2022.08.11
[알고리즘] DFS/BFS  (0) 2022.08.09
  • 이진탐색
  • 트리 자료구조
  • 이진 탐색 트리
'알고리즘' 카테고리의 다른 글
  • [알고리즘] 최단경로 찾기
  • [알고리즘] 다이나믹 프로그래밍
  • [알고리즘] DFS/BFS
꿈꿈개
꿈꿈개
꿈을 꾸는 개발자의 공부 일지

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.