CS/자료구조 & 알고리즘

이진탐색 (시간복잡도와 이유)

혀니리리 2023. 12. 16. 15:46
728x90

[알고리즘] 이분 탐색 / 이진 탐색 (Binary Search) (velog.io)

 

[알고리즘] 이분 탐색 / 이진 탐색 (Binary Search)

이진 탐색(이분 탐색) 알고리즘은 정렬되어 있는 리스트에서 탐색 범위를 절반씩 좁혀가며 데이터를 탐색하는 방법이다.이진 탐색은 배열 내부의 데이터가 정렬되어 있어야만 사용할 수 있는

velog.io

정렬되어있는 리스트에서 탐색범위를 절반씩 좁혀가며 데이터를 탐색하는 방법

배열 내부의 데이터가 정렬되어 있어야만 사용할 수 있는 알고리즘

 

시간복잡도는 O(logN) -> 여기서 log는 log₂

단계마다 탐색 범위를 반으로(÷2) 나누는 것과 동일하므로 위 시간 복잡도를 가지게 된다.

 

<1.재귀함수로 구현한 이진탐색>

# 재귀 함수로 구현한 이진 탐색
def binary_search(array, target, start, end):
    if start > end:
        return None
    mid = (start + end) // 2

    # 원하는 값 찾은 경우 인덱스 반환
    if array[mid] == target:
        return mid
    # 원하는 값이 중간점의 값보다 작은 경우 왼쪽 부분(절반의 왼쪽 부분) 확인
    elif array[mid] > target:
        return binary_search(array, target, start, mid - 1)
    # 원하는 값이 중간점의 값보다 큰 경우 오른쪽 부분(절반의 오른쪽 부분) 확인
    else:
        return binary_search(array, target, mid + 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 is None:
    print('원소가 존재 X')
else:
    print(result + 1)

>>> 4

# sample input
# 10 7
# 1 3 5 7 9 11 13 15 17 19

 

 

<2.반복문으로 구현한 이진탐색>

# 반복문으로 구현한 이진 탐색
def binary_search(array, target, start, end):
    while start <= end:
        mid = (start + end) // 2

        # 원하는 값 찾은 경우 인덱스 반환
        if array[mid] == target:
            return mid
        # 원하는 값이 중간점의 값보다 작은 경우 왼쪽 부분(절반의 왼쪽 부분) 확인
        elif array[mid] > target:
            end = mid - 1
        # 원하는 값이 중간점의 값보다 큰 경우 오른쪽 부분(절반의 오른쪽 부분) 확인
        else:
            start = mid + 1

    return None


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

result = binary_search(array, target, 0, n - 1)
if result is None:
    print('원소가 존재 X')
else:
    print(result + 1)
    
>>> 4

# sample input
# 10 7
# 1 3 5 7 9 11 13 15 17 19
728x90

'CS > 자료구조 & 알고리즘' 카테고리의 다른 글

스택과 힙의 차이 (메모리구조)  (0) 2024.01.09
List / Dictionary(C++에서의 map) / Set  (0) 2023.12.16
우선순위 큐  (0) 2023.12.16
레드블랙트리  (0) 2023.12.16
map과 hashMap차이  (0) 2023.12.16