CodeGym /행동 /Python SELF KO /선형 및 이진 검색 문제 예시

선형 및 이진 검색 문제 예시

Python SELF KO
레벨 53 , 레슨 2
사용 가능

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을 반환합니다.

단계별 실행:

  1. 배열 [4, 2, 7, 1, 9, 3]와 찾고자 하는 값 7.
  2. 검색 시작: 첫 번째 요소(4)와 7 비교 — 일치하지 않음.
  3. 다음 요소로 이동 (2) — 일치하지 않음.
  4. 다음 요소로 이동 (7) — 일치.
  5. 인덱스 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. 정렬된 배열 [1, 3, 5, 7, 9, 11, 13]와 찾고자 하는 값 7.
  2. 검색 초기 경계: left = 0, right = 6.
  3. 중간 요소 찾기: mid = (0 + 6) // 2 = 3.
  4. 중간 요소 (7)target (7) 비교 — 일치.
  5. 인덱스 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} 초")
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION