기초 탐색 알고리즘: 선형 탐색과 이진 탐색

2024-10-25 16:55:22 | 조회수 76


기초 탐색 알고리즘: 선형 탐색과 이진 탐색

탐색 알고리즘은 데이터 내에서 특정 값을 찾는 과정을 효율적으로 수행하는 알고리즘입니다. 탐색 알고리즘은 데이터 구조와 크기에 따라 적절한 방법을 선택하여 성능을 극대화할 수 있습니다. 이 글에서는 선형 탐색이진 탐색의 개념과 구현 방법을 배웁니다.

1. 선형 탐색 (Linear Search)

선형 탐색은 리스트의 첫 번째 요소부터 시작하여 원하는 값을 찾을 때까지 순차적으로 비교하는 탐색 방식입니다. 데이터가 정렬되지 않았거나, 크기가 작은 경우에 유용합니다.

작동 원리

  • 리스트의 첫 번째 요소부터 시작해 끝까지 원하는 값과 비교합니다.
  • 값이 발견되면 탐색을 종료하고 위치를 반환합니다.
  • 값이 발견되지 않으면 리스트의 모든 요소를 확인한 후 탐색이 종료됩니다.

시간 복잡도

선형 탐색의 시간 복잡도는 $$O(N)$$입니다. 탐색하려는 값이 리스트의 마지막에 있을 경우 모든 요소를 검사해야 하므로, 데이터가 클수록 비효율적입니다.

Python 코드 예제:
def linear_search(arr, target):
    # 리스트의 각 요소를 순차적으로 검사합니다
    for i in range(len(arr)):
        # 찾고자 하는 값이 발견되면 해당 인덱스를 반환합니다
        if arr[i] == target:
            return i  # 값이 있는 위치 반환
    return -1  # 값이 리스트에 없을 경우 -1 반환

# 예제 사용
arr = [10, 20, 30, 40, 50]
target = 30
print(linear_search(arr, target))  # 출력: 2
                

설명: linear_search 함수는 리스트의 각 요소를 순차적으로 검사하여 target 값을 찾습니다. 값을 찾으면 해당 인덱스를 반환하고, 값이 없으면 -1을 반환하여 탐색 결과를 알려줍니다.

2. 이진 탐색 (Binary Search)

이진 탐색은 데이터가 정렬된 상태에서만 사용할 수 있는 효율적인 탐색 알고리즘입니다. 중간 요소와 비교하여 탐색 범위를 절반으로 줄여나가는 방식으로, 빠른 속도를 자랑합니다.

작동 원리

  • 리스트의 중간 요소를 확인하여, 찾고자 하는 값과 비교합니다.
  • 찾고자 하는 값이 중간 값보다 작으면 왼쪽 절반에서 다시 탐색을 시작합니다.
  • 찾고자 하는 값이 중간 값보다 크면 오른쪽 절반에서 다시 탐색을 시작합니다.
  • 이 과정을 값이 발견되거나, 탐색 범위가 사라질 때까지 반복합니다.

시간 복잡도

이진 탐색의 시간 복잡도는 $$O(\log N)$$입니다. 각 단계에서 탐색 범위를 절반으로 줄이기 때문에 데이터가 클수록 선형 탐색에 비해 훨씬 효율적입니다.

Python 코드 예제:
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:
            right = mid - 1

        # 중간 값보다 찾고자 하는 값이 큰 경우, 왼쪽 절반을 제거하고 탐색 범위를 줄입니다
        else:
            left = mid + 1

    return -1  # 값이 리스트에 없을 경우 -1 반환

# 예제 사용
arr = [10, 20, 30, 40, 50]
target = 30
print(binary_search(arr, target))  # 출력: 2
                

설명: binary_search 함수는 정렬된 리스트에서 중간 요소와 target 값을 비교하여 탐색 범위를 점차 줄여 나갑니다. target 값을 찾으면 해당 인덱스를 반환하고, 값이 없으면 -1을 반환합니다.

선형 탐색과 이진 탐색의 비교

두 탐색 알고리즘은 데이터의 구조와 크기에 따라 선택이 달라질 수 있습니다. 다음은 선형 탐색과 이진 탐색의 차이점을 비교한 표입니다.

특성 선형 탐색 이진 탐색
시간 복잡도 (평균) $$O(N)$$ $$O(\log N)$$
정렬된 데이터 필요성 필요 없음 필수
데이터 크기에 따른 효율성 작은 데이터에 적합 큰 데이터에 적합

비교 요약: 선형 탐색은 데이터가 정렬되지 않았거나 크기가 작은 경우 적합합니다. 반면 이진 탐색은 정렬된 데이터에서만 사용할 수 있지만, 큰 데이터에서 매우 효율적인 성능을 보입니다.

이번 글에서는 선형 탐색이진 탐색의 기본 개념, 구현 방법, 그리고 두 알고리즘의 차이점을 학습했습니다. 탐색 알고리즘을 잘 이해하고, 데이터 구조에 맞는 효율적인 알고리즘을 선택하여 문제를 해결해 보세요.


기초 탐색 알고리즘: 선형 탐색과 이진 탐색 - 알고리즘닷컴 19 개의 글