1 분 소요

순차 탐색 알고리즘

def sequential_search(A, key, low, high):
    for i in range(low, high + 1):  # i: low, low + 1, ...high
        if A[i] == key:             # 탐색 성공하면
            return i                # 인덱스 반환
    return -1                       # 탐색에 실패하면 -1 반환

순차 탐색의 특징

  • 탐색의 정의를 직접 사용하는 알고리즘으로 간단하고 구현하기 쉽다
  • 효율적이지는 않다. 탐색 성능은 최선의 경우 $O(1)$이고 최악이나 평균적인 경우가 $O(n)$ 인데, 최선의 경우는 큰 의미가 없다
  • 테이블이 정렬되어 있지 않다면 순차 탐색 이외에 별다른 대안은 없다

순차 탐색을 개선하는 방법?

자기 구성 순차 탐색

  • 탐색이 진행될 때마다 자주 사용되는 레코드를 앞쪽으로 옮기는 방법
  • 리스트를 재구성하여 탐색의 효율을 끌어올리려는 것
맨 앞으로 보내기 (move to front)
  • 탐색에 성공한 레코드를 리스트의 맨 앞으로 보내는 방법
  • 리스트의 맨앞으로 보내면서 모든 레코드들이 뒤로 한칸씩 밀림
  • 연결 구조에선 훨씬 효율적으로 처리 가능 $O(1)$
  • 한번 탐색된 레코드가 바로 이어서 다시 탐색될 가능성이 많은 응용에만 사용해야 함
교환하기 (transpose)
  • 탐색되면 위치를 바로 앞의 레코드와 교환
  • 자주 탐색되는 레코드는 점진적으로 앞으로 이동
def sequential_search_transpose(A, key, low , high):
    for i in range(low, high + 1):
        if A[i] == key:
            if i > low:                # 맨 처음 요소가 아니면
                A[i] , A[i-1] = A[i-1], A[i] # 교환하기 (transpose)
                i = i -1               # 한 칸 앞으로 왔음
            return i                   # 탐색에 성공하면 키 값의 인덱스 반환
    return -1                          # 탐색에 실패하면 -1 반환

댓글남기기