7. 순차 탐색과 이진탐색
2024. 10. 23. 12:40ㆍ파이썬(python)의 알고리즘
#1. 순차탐색(Sequential Search)**
* 탐색은 여러 데이터 중에서 원하는 데이터를 찾아내는 것을 의미
* 순차 탐색 : 데이터가 담겨 있는 앞에서부터 하나씩 비교해서 원하는 데이터를 찾는 방법
* 최악의 경우 리스트 길이가 n일떄 n번 비교해야함
from random import randint
data_list = list()
for num in range(10):
data_list.append(randint(1, 100))
data_list
-->
[92, 66, 32, 49, 50, 12, 58, 58, 88, 87]
def sequencial(data_list, search_data):
for index in range(len(data_list)):
if data_list[index] == search_data:
return index
return -1
sequencial(data_list, 10) #찾으면 index, 찾지 못하면 -1
-->
-1
# 2. 이진 탐색(Binary Search)**
* 탐색할 자료를 둘로 나누어 해당 데이터가 있을만한 곳을 탐색하는 방법
#2-1. 분할 정복 알고리즘과 이진 탐색
* 분할 정복 알고리즘
* 문제를 하나 또는 둘 이상으로 나눔
* 나눠진 문제가 충분히 적고, 해결이 가능하다면 해결하고, 그렇지 않다면 다시 나눔
* 이진탐색
* 리스트를 두개의 서브 리스트로 나눔
* 검색할 숫자가 중간값보다 작으면 앞부분의 서브 리스트에서 검색할 숫자를 찾음
* 검색할 숫자가 중간값보다 크면 뒷부분의 서브 리스트에서 검색할 숫자를 찾음
##2-2 알고리즘 구현하기
* 이진 탐색은 데이터가 정렬되어있는 상태에서 진행
* 데이터가 [2,3,8,12,20]일때
* binary_search(data_list, find_data) 함수를 만듦
* data_list :데이터가 담긴 리스트
* find_data : 찾는숫자
* data_list의 중간값을 find data와 비교해서
* find_data가 data_list의 중간값 보다 작다면, 맨앞부터 data_list의 중간값까지에서 find_data를 찾기
* find_data가 data_list의 중간값보다 크다면, data_list의 중간부터 맨끝까지 find_data를 찾기
* 그렇지 않다면 data_list의 중간값은 find_data인경우
def binary_search(data, search):
print(data)
if len(data) == 1 and search == data[0]:
return True
if len(data) == 1 and search != data[0]:
return False
if len(data) == 0:
return False
medium = len(data) // 2
if search == data[medium]:
return True
else:
if search > data[medium]:
return binary_search(data[medium+1:], search)
else:
return binary_search(data[:medium], search)
import random
data_list = random.sample(range(100), 10)
data_list
-->
[38, 82, 95, 41, 89, 11, 18, 40, 65, 58]
data_list.sort()
data_list
-->
[11, 18, 38, 40, 41, 58, 65, 82, 89, 95]
binary_search(data_list, 60)
-->
[11, 18, 38, 40, 41, 58, 65, 82, 89, 95]
[65, 82, 89, 95]
[65, 82]
[65]
False
728x90
LIST
'파이썬(python)의 알고리즘' 카테고리의 다른 글
9. 너비우선 탐색 (0) | 2024.10.23 |
---|---|
8. 그래프(Graph) (2) | 2024.10.23 |
7. 순차 탐색과 이진탐색 (1) | 2024.10.23 |
6. 병합정렬(Merge sort) (0) | 2024.10.23 |
5. 퀵정렬(Quick sort) (1) | 2024.10.23 |