3.1 배열에서 요소 찾기 문제 - 선형 검색 사용
문제: 숫자 배열이 주어집니다. 선형 검색을 사용하여 주어진 숫자의 인덱스를 찾아야 합니다. 숫자를 찾을 수 없으면 -1을 반환하세요.
예시:
def linear_search(arr, target):
for index, element in enumerate(arr):
if element == target:
return index
return -1
# 사용 예제:
arr = [4, 2, 7, 1, 9, 3]
target = 7
result = linear_search(arr, target)
print(f"요소 {target}는 인덱스 {result}에서 발견됨") # 출력: 요소 7는 인덱스 2에서 발견됨
# 배열에 없는 요소의 사용 예제:
target = 5
result = linear_search(arr, target)
print(f"요소 {target}는 인덱스 {result}에서 발견됨") # 출력: 요소 5는 인덱스 -1에서 발견됨
설명:
linear_search
함수는 배열 arr의 각 요소를 순회하며target
과 비교합니다.- 요소가 발견되면 해당 인덱스를 반환합니다.
- 모든 요소를 검사하고 찾지 못하면 함수는 -1을 반환합니다.
단계별 실행:
- 배열
[4, 2, 7, 1, 9, 3]
와 찾고자 하는 값7
. - 검색 시작: 첫 번째 요소(4)와 7 비교 — 일치하지 않음.
- 다음 요소로 이동
(2)
— 일치하지 않음. - 다음 요소로 이동
(7)
— 일치. - 인덱스
2
반환.
3.2 정렬된 배열에서 요소 찾기 문제 - 이진 검색 사용
문제: 정렬된 숫자 배열이 주어집니다. 이진 검색을 사용하여 주어진 숫자의 인덱스를 찾아야 합니다. 숫자를 찾을 수 없으면 -1을 반환하세요.
예시:
def binary_search(arr, target):
left, right = 0, len(arr) - 1
while left <= right:
mid = (left + right) // 2
if arr[mid] == target:
return mid
elif arr[mid] < target:
left = mid + 1
else:
right = mid - 1
return -1
# 사용 예제:
sorted_array = [1, 3, 5, 7, 9, 11, 13]
target = 7
result = binary_search(sorted_array, target)
print(f"요소 {target}는 인덱스 {result}에서 발견됨") # 출력: 요소 7는 인덱스 3에서 발견됨
# 배열에 없는 요소의 사용 예제:
target = 6
result = binary_search(sorted_array, target)
print(f"요소 {target}는 인덱스 {result}에서 발견됨") # 출력: 요소 6는 인덱스 -1에서 발견됨
설명:
binary_search
함수는 두 개의 포인터(left와 right)를 사용하여arr
배열에서 검색 범위를 추적합니다.- 각 반복의 중간 요소를 찾아
target
과 비교합니다. - 중간 요소가
target
과 같으면 해당 인덱스를 반환합니다. target
이 중간 요소보다 작으면 검색은 배열의 왼쪽 절반에서 계속됩니다.target
이 중간 요소보다 크면 검색은 배열의 오른쪽 절반에서 계속됩니다.- 경계가 교차하고 요소를 찾지 못하면 -1을 반환합니다.
단계별 실행:
- 정렬된 배열
[1, 3, 5, 7, 9, 11, 13]
와 찾고자 하는 값7
. - 검색 초기 경계:
left = 0
,right = 6
. - 중간 요소 찾기:
mid = (0 + 6) // 2 = 3
. - 중간 요소
(7)
과target (7)
비교 — 일치. - 인덱스
3
반환.
3.3 다양한 문제에 적합한 검색 알고리즘 선택 및 비교
선형 및 이진 검색 비교:
특징 | 선형 검색 | 이진 검색 |
---|---|---|
시간 복잡도 | O(n) | O(log n) |
데이터 요구 사항 | 사전 정렬 필요 없음 | 정렬된 배열 필요 |
구현의 용이함 | 매우 간단함 | 더 복잡함 |
효율성 | 큰 배열에서 덜 효율적임 | 큰 배열에서 매우 효율적임 |
적합한 알고리즘 선택하기
선형 검색:
- 데이터가 정렬되지 않았을 때 사용됨.
- 작은 배열 또는 리스트에 적합함.
- 요소 수가 적고 실행 시간이 중요하지 않을 때 적용됨.
이진 검색:
- 데이터가 정렬되었을 때 적용됨.
- 검색 속도가 중요한 큰 배열에 이상적임.
동일한 데이터셋에서 자주 검색이 필요할 때
(데이터를 미리 정렬할 수 있음) 효율적임.
3.4 학습 내용을 위한 실습 문제
문제 1: 선형 검색
숫자 배열이 주어집니다. 선형 검색을 사용하여 주어진 숫자의 인덱스를 찾는 함수를 작성하세요. 함수는 발견된 요소의 인덱스나 요소를 찾을 수 없을 경우 -1을 반환해야 합니다.
예시:
def linear_search(arr, target):
for index, element in enumerate(arr):
if element == target:
return index
return -1
# 사용 예제:
arr = [4, 2, 7, 1, 9, 3]
target = 7
result = linear_search(arr, target)
print(f"요소 {target}는 인덱스 {result}에서 발견됨") # 출력: 요소 7는 인덱스 2에서 발견됨
# 추가 테스트:
assert linear_search(arr, 9) == 4
assert linear_search(arr, 5) == -1
문제 2: 이진 검색
정렬된 숫자 배열이 주어집니다. 이진 검색을 사용하여 주어진 숫자의 인덱스를 찾는 함수를 작성하세요. 함수는 발견된 요소의 인덱스나 요소를 찾을 수 없을 경우 -1을 반환해야 합니다.
예시:
def binary_search(arr, target):
left, right = 0, len(arr) - 1
while left <= right:
mid = (left + right) // 2
if arr[mid] == target:
return mid
elif arr[mid] < target:
left = mid + 1
else:
right = mid - 1
return -1
# 사용 예제:
sorted_array = [1, 3, 5, 7, 9, 11, 13]
target = 7
result = binary_search(sorted_array, target)
print(f"요소 {target}는 인덱스 {result}에서 발견됨") # 출력: 요소 7는 인덱스 3에서 발견됨
# 추가 테스트:
assert binary_search(sorted_array, 1) == 0
assert binary_search(sorted_array, 13) == 6
assert binary_search(sorted_array, 6) == -1
문제 3: 선형 및 이진 검색 비교
숫자 배열이 주어집니다. 주어진 숫자를 찾기 위해 두 개의 함수를 작성하세요: 하나는 선형 검색을 사용하고, 다른 하나는 이진 검색을 사용합니다. 두 함수의 성능을 큰 배열에서 비교하세요.
예시:
import time
import random
# 선형 검색
def linear_search(arr, target):
for index, element in enumerate(arr):
if element == target:
return index
return -1
# 이진 검색
def binary_search(arr, target):
left, right = 0, len(arr) - 1
while left <= right:
mid = (left + right) // 2
if arr[mid] == target:
return mid
elif arr[mid] < target:
left = mid + 1
else:
right = mid - 1
return -1
# 큰 배열 생성
large_array = [random.randint(0, 1000000) for _ in range(1000000)]
sorted_large_array = sorted(large_array)
target = random.choice(large_array)
# 성능 비교
start_time = time.time()
linear_search(large_array, target)
print(f"선형 검색에 걸린 시간: {time.time() - start_time:.6f} 초")
start_time = time.time()
binary_search(sorted_large_array, target)
print(f"이진 검색에 걸린 시간: {time.time() - start_time:.6f} 초")
GO TO FULL VERSION