판다꼬마 2022. 6. 28. 20:44
728x90

순차 탐색

리스트 안에 있는 특정한 데이터를 찾기 위해 앞에서부터 데이터를 하나씩 차례대로 확인하는 방법

 

1. 첫 번째 데이터를 확인한다. 9는 찾으려는 8과 같지 않다. 다음 데이터로 이동

2. 두 번째 데이터를 확인한다. 5는 찾으련는 8과 같지 않다. 다음 데이터로 이동

3. 세 번재 데이터를 확인한다. 8은 찾으려는 8과 같다. 탐색 종료

 

순차 탐색 코드

# 순차 탐색 소스코드 구현
def sequential_search(n, target, array):
    # 각 원소를 하나씩 확인하며
    for i in range(n):
        # 현재의 원소가 찾고자 하는 원소와 동일한 경우
        if array[i] == target:
            return i + 1 # 현재의 위치 반환 (인덱스는 0부터 시작하므로 1 더하기)
    return -1 # 원소를 찾지 못한 경우 -1 반환

print("생성할 원소 개수를 입력한 다음 한 칸 띄고 찾을 문자열을 입력하세요.")
input_data = input().split()
n = int(input_data[0]) # 원소의 개수
target = input_data[1] # 찾고자 하는 문자열

print("앞서 적은 원소 개수만큼 문자열을 입력하세요. 구분은 띄어쓰기 한 칸으로 합니다.")  
array = input().split()

# 순차 탐색 수행 결과 출력
print(sequential_search(n, target, array))

 

순차 탐색은 데이터 정렬 여부와 상관없이 가장 앞에 있는 원소부터 하나씩 확인해야 한다는 점이 특징이다.

데이터 개수가 N개 일 때 최대 N번의 비교 연산이 필요하므로 순차 탐색의 최악의 경우 시간 복잡도는 O(N)이다.

 

 

이진 탐색

이진 탐색은 배열 내부의 데이터가 정렬되어 있어야 사용 가능하다.

이진 탐색은 변수 3가지를 사용하는데, 탐색하는 범위의 시작점, 끝점, 중간점을 사용한다.

찾으려는 데이터와 중간점 위치에 있는 데이터를 반복적으로 비교해 데이터를 찾는다.

 

중간은 4.5인데 소수점을 버려 4이다.

찾으려는 데이터 4와 중간점 데이터 8을 비교한다.

4가 8보다 작으므로 중간점 이후의 데이터는 확인할 필요가 없다.

 

 

2는 찾으려는 데이터 4보다 작으므로 값이 2 이하는 데이터는 확인을 할 필요가 없다.

시작점을 [2]로 변경

 

중간점[2]는 찾으려는 데이터 4와 같다.

탐색 종료

재귀 함수로 구현한 이진 탐색 코드

# 이진 탐색 소스코드 구현 (재귀 함수)
def binary_search(array, target, start, end):
    if start > end:
        return None
    mid = (start + end) // 2
    # 찾은 경우 중간점 인덱스 반환
    if array[mid] == target:
        return mid
    # 중간점의 값보다 찾고자 하는 값이 작은 경우 왼쪽 확인
    elif array[mid] > target:
        return binary_search(array, target, start, mid - 1)
    # 중간점의 값보다 찾고자 하는 값이 큰 경우 오른쪽 확인
    else:
        return binary_search(array, target, mid + 1, end)

# n(원소의 개수)과 target(찾고자 하는 값)을 입력 받기
n, target = list(map(int, input().split()))
# 전체 원소 입력 받기
array = list(map(int, input().split()))

# 이진 탐색 수행 결과 출력
result = binary_search(array, target, 0, n - 1)
if result == None:
    print("원소가 존재하지 않습니다.")
else:
    print(result + 1)

반복문으로 구현한 이진 탐색 코드

# 이진 탐색 소스코드 구현 (반복문)
def binary_search(array, target, start, end):
    while start <= end:
        mid = (start + end) // 2
        # 찾은 경우 중간점 인덱스 반환
        if array[mid] == target:
            return mid
        # 중간점의 값보다 찾고자 하는 값이 작은 경우 왼쪽 확인
        elif array[mid] > target:
            end = mid - 1
        # 중간점의 값보다 찾고자 하는 값이 큰 경우 오른쪽 확인
        else:
            start = mid + 1
    return None

# n(원소의 개수)과 target(찾고자 하는 값)을 입력 받기
n, target = list(map(int, input().split()))
# 전체 원소 입력 받기
array = list(map(int, input().split()))

# 이진 탐색 수행 결과 출력
result = binary_search(array, target, 0, n - 1)
if result == None:
    print("원소가 존재하지 않습니다.")
else:
    print(result + 1)

 

 

이진 탐색 시간 복잡도

이진 탐색은 한 번 확인할 때마다 확인하는 원소의 개수가 절반으로 줄어든다.

그래서 시간 복잡도는 O(logN)

 

 

728x90