티스토리 뷰

알고리즘

Binary Search

날따라해봐요요롷게 2022. 2. 4. 12:52

이진탐색

 

정렬된 배열을 절반씩 줄여나가면서 탐색하는 기법

 

https://leetcode.com/problems/binary-search/

 

Binary Search - LeetCode

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com

 

구현

 

def bs1(lst, target):
    def bs(start_index, end_index):
        # start_index 와 end_index가 == 경우 해당 값을 찾은 경우 이므로 -1을 리턴하면 안된다.
        if start_index > end_index:
            return -1

        mid = (start_index + end_index) // 2

        if lst[mid] < target:
            return bs(mid+1, end_index)
        elif lst[mid] > target:
            return bs(start_index, mid-1)
        else:
            return mid

    return bs(0, len(lst) - 1)

assert bs1(lst=[1,2,3,4,5], target=3) == 2

 

내장함수

 

def bisect_left(*args, **kwargs): # real signature unknown
    """
    Return the index where to insert item x in list a, assuming a is sorted.
    
    The return value i is such that all e in a[:i] have e < x, and all e in
    a[i:] have e >= x.  So if x already appears in the list, a.insert(i, x) will
    insert just before the leftmost x already there.
    
    Optional args lo (default 0) and hi (default len(a)) bound the
    slice of a to be searched.
    """
    pass

def bisect_right(*args, **kwargs): # real signature unknown
    """
    Return the index where to insert item x in list a, assuming a is sorted.
    
    The return value i is such that all e in a[:i] have e <= x, and all e in
    a[i:] have e > x.  So if x already appears in the list, a.insert(i, x) will
    insert just after the rightmost x already there.
    
    Optional args lo (default 0) and hi (default len(a)) bound the
    slice of a to be searched.
    """
    pass

각각의 내장 함수가 어떤 값을 반환하는지 하나씩 살펴보자

 

import bisect
lst = [-1,1,2,2,2,3,4]
bisect.bisect_left(lst, 2)
==> 2 # target 값의 가장 앞쪽 인덱스를 return 한다.

lst = [-1,1,3,4,5]
bisect.bisect_left(lst, 2)
==> 2 # target 값보다 같거나 큰 범위에서의 가장 앞쪽 인덱스를 return 한다.

lst = [-5, -4, -3, -2,-1]
bisect.bisect_left(lst, 0)
==> 5 # return 값이 해당 리스트의 길이를 넘어선 값이다.
# 즉, 주어진 list 보다 큰 수를  target하면 리스트의 길이보다 큰 값을 return 한다.

lst = [3,4,5,6,7]
bisect.bisect_left(lst, 2)
==> 0
# lst 에 value보다 작은 값을 target으로 설정 시 0을 return 한다.

lst = [1,2,2,2,4,5]
bisect.bisect_right(lst, 2)
==> 4 # right 내장 함수를 사용 시 return 값은 target 값 보다 큰 값의 인덱스를 return 한다.

 

 

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

Binary Search - 정렬된 배열에서 특정 수의 개수 구하기  (0) 2022.02.05
Binary Search - Search in Rotated Sorted Array  (0) 2022.02.04
dfs - 섬의 개수(number of islands)  (0) 2022.01.21
DFS (GRAPH)  (0) 2022.01.21
스택, 큐  (0) 2022.01.18
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함