카테고리 없음

이진탐색

redeyes 2022. 7. 4. 12:50

 

# 이진탐색

class BinarySearch:
    def __init__(self, target):
        self.target = target

    def is_existing_target_number_binary(self, array: any) -> bool:
        len_array = len(array)
        min_index = 0
        max_index = len_array - 1
        start_index_num = (max_index + min_index) // 2

        while max_index >= min_index:
            # print(start_index_num)
            if array[start_index_num] == self.target:
                return True
            elif array[start_index_num] > self.target:
                max_index = start_index_num - 1
            else:
                min_index = start_index_num + 1
            start_index_num = (max_index + min_index) // 2

        return False

    def is_existing_target_number_sequential(self, array: any) -> bool:
        array.sort(reverse=True)
        for x in array:
            if x == self.target:
                return True
        return False

반드시 정렬이 되어있을때 사용가능 하다.

 

시간 복잡도

 총 숫자가 1~N 까지라고 한다면,
1번 탐색하면 반절이 줄어드니 N/2 개가 남습니다.
2번 탐색하면 반절이 줄어드니 N/4 = N/2^2 개가 남습니다.
3번 탐색하면 반절이 줄어드니 N/8 = N/2^3 개가 남습니다. ....
k번 탐색하면 반절이 줄어드니 N/2^k 개가 남습니다.

이 때, 이분탐색을 열심히 시도해서 딱 1개만 남았다고 가정을 해보겠습니다.
이걸 수식으로 표현하면, N/2^k = 1 입니다. 즉, k = log_2{N} 횟수를 시도하면 정답을 찾을 수 있습니다!

결론적으로 이분탐색을 위해서는 시간 복잡도가 O(logN) 만큼 걸린다.
라고 말할 수 있습니다.


Q. 여기서 왜 log_2N 이 아니라 logN 인가요?

A. 상수는 무시해도 되기 때문에 표기하기 쉽도록 logN 으로 부르기로 약속!


순차탐색의 경우와 이진탐색의 경우 차이

37을 찾을 때 걸린 스텝차이

 

'''
이진 탐색 과 일반탐색 시간 비교
'''
import time
now = time.time()
finding_numbers = list(range(100000000))

finding_numbers.sort()

binary_search = BinarySearch(2)
end = time.time()
print("리스트 생성시간 : ",end-now)
print("지금 : ",time.time())
now = time.time()
result = binary_search.is_existing_target_number_binary(finding_numbers)
end = time.time()
print("이진탐색 풀이 시간 : ",end-now)
print("지금 : ",time.time())
now = time.time()
result_2 = binary_search.is_existing_target_number_sequential(finding_numbers)
end = time.time()
print("순차탐색 풀이 시간",end-now)
print("지금 : ",time.time())
print(result,"vs",result_2)