탐색 알고리즘, 시간복잡도 파이썬
2022. 3. 19. 15:55ㆍPython
선형 탐색법
def findIndexLinear(array, condition):
for i in range(len(array)):
if array[i] == condition:
return i
# 최선의 경우 - 한번의 탐색으로 해결
findIndexLinear([2,4,5,1,6], 2)
# 최악의 경우 - 배열의 크기만큼 탐색으로 해결
print(findIndexLinear([2,4,5,1,6], 6))
시간복잡도 = O(n)
** 데이터 수가 많아지면 효율이 굉장히 안좋아짐
정렬되지 않은 데이터에 자주 사용
이진 탐색법
def findIndexBinary(array, target):
start = 0
end = len(array)-1
mid = (start+end)//2
while end - start >= 0:
if array[mid] == target:
return 1
elif array[mid] <= target:
start = mid + 1
else:
end = mid - 1
mid = (start+end)//2
return -1
# 찾는 결과가 없을 때, -1을 리턴
print(findIndexBinary([1, 2, 5, 3, 6], 5))
시간복잡도 = O(logN)
** 선형 탐색법과 비교하면 더 빠르다. (상황에 따라서는 선형이 더 빠를수도 있음 - 요소가 앞에있을 경우)
평균적으로 빠를 뿐, 항상 빠른것은 아님.
정렬된 데이터에 자주 사용
해시 탐색법
arrayA = [12,25,36,20,30,8,42]
# 앞에서 배운 2개의 검색 알고리즘(선형 탐색, 이진 탐색)은
# 배열의 요소를 데이터 수만큼 준비하면 충분했지만,
# 해시 탐색법은 이와 달리 저장하는 데이터의 1.5~2배를 준비해야 합니다.
arrayB = [0] * 11
# 저장할 요소의 배열을 순회하면서
for i in range(len(arrayA)):
#저장할 공간(첨자)를 계산
temp = arrayA[i] % 11;
# 저장할 공간에 데이터가 있으면
if arrayB[temp] != 0:
# 데이터가 없는 공간을 찾을때까지
while arrayB[temp] != 0:
# temp를 증가, 하지만 배열의 크기가 11이므로,
# 인덱스가 10을 넘으면(배열의 크기를 넘으면 안되기에) 0으로 변경합니다.
print(temp)
if temp < len(arrayB)-1:
temp += 1
else:
temp = 0
print(temp)
# 데이터가 없는 공간을 찾으면 저장합니다.
arrayB[temp] = arrayA[i]
# 저장할 공간에 데이터가 없으면
else:
# 데이터가 없는 공간을 찾으면 저장합니다.
arrayB[temp] = arrayA[i]
print(arrayB)
# 저장한 데이터와 찾을 요소를 Argument로 넣어줍니다.
def findHashData(array, target):
# 저장할 공간에 데이터가 있어서 +1해준 경우를 제외하고는
# 첨자 = 저장할데이터 % 저장할 배열의 크기입니다..
uniqueValue = target % len(array);
# 찾고자 하는 값이 맞을 경우가 나올때까지
while array[uniqueValue] != target:
# 결과가 원하는 값이 아니면, (저장할데이터+1) % 저장할 배열의 크기
uniqueValue = (uniqueValue+1) % len(array)
return uniqueValue
print(findHashData(arrayB, 42))
# => '저장 위치는 0번째 요소입니다.'
시간복잡도 = O(1) * 해시 충돌이 일어날경우 O(n)
기존의 탐색보다 어렵지만, 검색속도는 빠르다.
파이썬에는 이미 딕셔너리로 해시를 구현 한 상태이다.
'Python' 카테고리의 다른 글
[코딩테스트] 함수 count (0) | 2022.01.21 |
---|---|
4. Python 자료형-2 (0) | 2021.01.12 |
3. Python 자료형-1 (0) | 2021.01.06 |
2. Python 설치하기 (0) | 2021.01.04 |
1. Python 시작하기 (0) | 2021.01.04 |