컴퓨터 과학(CS)/알고리즘

선형 검색, 이진 검색

Bentist 2021. 12. 27. 16:01

참고: 누구나 자료 구조와 알고리즘 2장,

모두를 위한 컴퓨터 과학(데이비드말란 교수님) 강의

 

1장에서는 배열이나 집합처럼 매우 유사해 보이는 두 자료 구조라도 효율성이 크게 다를 수 있음을 보았다.

 

2장에서는 어떤 자료 구조를 이미 결정했더라도 효율성에 영향을 미칠 수 있는 알고리즘에 대해 살펴본다.

알고리즘이란 단순히 어떤 문제를 풀어내기 위한 명령어 집합이다.

새 알고리즘을 분석하기 위해 자료 구조 하나를 살펴보자.

 

2.1. 정렬된 배열

정렬된 배열(ordered array)은 값이 항상 순서대로 있어야 한다. 일반 배열이 [8, 17, 3, 202] 일 때, 정렬된 배열은 [3, 17, 80, 202]라 할 수 있다. 정렬된 배열의 강력함은 검색 연산에서 드러난다.

 

전형적인 배열의 특정 값을 찾으려면 원하는 값을 찾을 때까지 왼쪽에서 오른쪽으로 한 번에 한 셀씩 확인하는 방법을 선형 검색 알고리즘 또는 순차 검색 알고리즘이라 불렀다. 선형 검색 알고리즘은 정확하지만 아주 효율적이지 못한 방법입니다. 자료가 정렬되어 있지 않거나, 그 어떤 정보도 없어 하나씩 찾아야 하는 경우에 유용합니다.

# 위키피디아 예시

def sequentialSearch(array, value):
	for i in range(len(array)):
		if array[i] == value:
			return i
	return False

[17, 3, 75, 80, 202]이라는 일반적인 배열에서 22라는 값을 찾으려면 22가 배열 어디든 있을 수 있으므로 모든 원소를 하나도 빠짐없이 검색해야 했다. 그러나 정렬된 배열 [3, 17, 75, 80, 202]에서 22를 찾는다고 하자. 75에 도달하면 더이상 22가 오른쪽에 있을 수 없으므로 바로 검색을 중단할 수 있다.

하지만 선형 검색보다 훨씬 뛰어난 알고리즘이 있다. 정렬된 배열이 전형적인 배열보다 크게 두드러진 장점은 이진 검색이라는 알고리즘을 쓸 수 있다는 점이다.

 

2.3. 이진 검색

오름차순으로 정렬된 리스트에서 특정한 값의 위치를 찾는 알고리즘이다. 배열중간의 인덱스 값부터 시작하여, 찾고자 하는 값의 대소를 비교하여 탐색의 범위를 반으로 줄여나가는 방식이다.

def binary_search(data, search_value):
    start_index = 0				# 시작점 인덱스
    end_index = len(data)-1			# 끝점 인덱스
    
    while start_index <= end_index:
        mid = (start_index+end_index)//2        # //연산자는 나눗셈 후 소수점 이하를 버리고 몫만 구한다.
        if data[mid] == search_value:
            return mid
        elif data[mid] > search_value:
            end_index = mid-1
        elif data[mid] < search_value:
            start_index = mid+1
            
    # 시작점과 끝점 인덱스가 같아질 때까지 찾는 값이 없으면, None 반환        
    return None