탐색 조건에 주목하는 항목(검색 조건에 따라 key가 결정)
예시)
탐색 조건: 털 색이 흰 색인 고양이를 찾습니다.
key: 털 색탐색 조건: 나이가 1개월 이상 3개월 미만인 새끼 고양이를 찾습니다.
key: 나이
키를 어떻게 배치하고 구조화하는 지에 따라 선형 탐색, 이진 탐색, 해시 탐색으로 나뉨
for
문)검색할 값을 찾지 못하고 배열의 맨 끝을 지나간 경우 (검색 실패)
e.g. 배열 [3,5,1,8,2]에서 8 찾기
검색할 값과 같은 원소를 찾은 경우 (검색 성공)
-e.g. 배열 [3,5,1,8,2]에서 9 찾기
from typing import Any, Sequence
def linear_search(seq: Sequence, target: Any) -> int:
for i in range(len(seq)):
if seq[i] == target: # key와 target이 같다면
return i # 인덱스 반환(검색 성공)
return -1 # 검색 실패
print(linear_search([6,4,3,2,1,2,8],2))
print(linear_search([6,4,3,2,1,2,8],5))
3
-1
for
문/ while
문을 사용from typing import Any, Sequence
def binary_search_iter(seq: Sequence, target: Any) -> int:
left = 0 # 시퀀스의 첫 인덱스
right = len(seq) - 1 # 시퀀스의 마지막 인덱스
while left <= right: # 검색 대상이 하나라도 남아있으면 반복
mid = (left + right) // 2
if seq[mid] == target:
return mid # 검색 성공
elif seq[mid] > target: # target이 mid 왼쪽에 있으면
right = mid - 1 # 검색 범위를 왼쪽 절반으로 좁힘
else: # target이 mid 오른쪽에 있으면
left = mid + 1 # 검색 범위를 오른쪽 절반으로 좁힘
return -1
nums = sorted([6,4,3,2,1,7,8])
print(binary_search_iter(nums, 3))
print(binary_search_iter(nums, 5))
2
-1
def binary_search_recursive(seq: Sequence, target: Any) -> int:
def recur(left, right): # 앞서 정의한 함수 내에서만 호출 가능
if left > right:
return -1
mid = (left + right) // 2
if seq[mid] == target: # target 발견
return mid
elif seq[mid] > target: # target이 중앙 단어 기준 왼쪽에 있을 때
return recur(left, mid-1) # 검색 범위 축소하여 재탐색
else: # target이 중앙 단어 기준 오른쪽에 있을 때
return recur(mid+1, right) # 검색 범위 축소하여 재탐색
return recur(0, len(seq)-1) # 재귀호출 이용하여 반복 효과
nums = sorted([6,4,3,2,1,7,8])
print(binary_search_recursive(nums, 3))
print(binary_search_recursive(nums, 5))
2
-1
binary_search_recursive()
함수는 recur()
함수를 이용하여 탐색 수행recur()
함수는 left
와 right
사이에서 target
의 위치를 리턴하는 재귀함수left
: 탐색 시작 인덱스right
: 탐색 종료 인덱스O(): 한 번 탐색할 때마다 탐색범위가 절반으로 감소한다.
N = 8일 때, 중앙값와 타깃의 비교(= O())가 3(= )번 일어남
= 3
2 x 2 x 2 = 8
2를 세 번 곱하면 8이 되고
8을 2로 세 번 나누면 1이된다.
즉, 중앙값과 타깃 비교를 데이터가 하나만 남을 때까지(= 중앙값과 타깃이 일치할 때까지) 반복한다면 최악의 경우 번 반복하게 된다.
실무에서는 실제 측정 시간이 더 쓸모 있는 듯하다.
위키백과 감자
CJ THE MARKET 해쉬브라운 냉동감자 1.2kg