순차 탐색
순차 탐색(Sequential Search)이란 리스트 안에 있는 특정한 데이터를 찾기 위해 앞에서부터 데이터를 하나씩 차례대로 확인하는 방법이다.
보통 정렬되지 않은 리스트에서 데이터를 찾아야 할 때 사용한다. 리스트 내에 데이터가 아무리 많아도 시간만 충분하다면 항상 원하는 원소를 찾을 수 있다는 장점이 있다.
#순차 탐색 코드 def sequentail_search(n,target,array): #각 원소를 하나씩 확인하며 for i in range(n): #현재의 원소가 찾고자 하는 원소가 동일한 경우 if array[i] == target: return i+1 #현재의 위치 변환(인덱스는 0부터 시작하므로 1더하기) print('생성할 원소 개수를 입력한 다음 한 칸 띄고 찾을 문자열을 입력하세요.') input_data = input().split() n = int(input_data[0]) #원소의 개수 target = input_data[1] #찾고자 하는 문자열 print('앞서 적은 원소 개수만큼 문자열을 입력하세요. 구분은 띄어쓰기 한 칸으로 합니다.') array = input().split() #순차 탐색 수형결과 출력 print(sequentail_search(n,target,array))
순차 탐색은 데이터 정렬 여부와 상관없이 가장 앞에 있는 원소부터 하나씩 확인해야 한다는 점이 특징이다. 따라서 데이터의 개수가 N개일 때 최대 N번의 비교 연산이 필요하므로 최악의 경우 시작 복잡도는 O(N)이다.
이진 탐색
이진 탐색 (Binary Search)은 배열 내부의 데이터가 정렬되어 있어야만 사용할 수 있는 알고리즘이다. 데이터가 무작위일 때는 사용할 수 없지만, 이미 정렬되어 있다면 매우 빠르게 데이터를 찾을 수 있다는 특징이 있다. 이진 탐색은 탐색 범위를 절반씩 좁혀가며 데이터를 탐색하는 특징이 있다.
#이진탐색 :반으로 쪼개면서 탐색하기 #이진탐색 구현 (재귀 함수) 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 #중간점 값보다 찾고자 하는 값이 작은 경우 왼쪽 확인 if 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)이다. 절반씩 데이터를 줄어들도록 만든다는 점은 퀵 정렬과 공통점이 있다.
코딩 테스트에서 이용할 경우가 많은 이진 탐색이다. 탐색 범위가 2.000만을 넘어가면 이진 탐색을 활용해서 풀어보도록 하자.
광고
광고
'알고리즘' 카테고리의 다른 글
[BOJ/백준] 10816 숫자 카드 2 (0) | 2020.11.19 |
---|---|
[BOJ/백준]1920번 수 찾기 (0) | 2020.11.17 |
[백준/BOJ] 2108번 통계학 (0) | 2020.11.16 |
[이코테]계수정렬 (0) | 2020.11.16 |
[이코테]정렬알고리즘의 개요 (0) | 2020.11.15 |