Binary Search
Sequential Search
리스트 안에 있는 특정한 데이터를 찾기 위해 앞에서부터 데이터를 하나씩 차례대로 확인하는 방법
def sequential_search(n, target, array):
for i in range(n):
if array[i] == target:
return i + 1
순차 탐색은 데이터 정렬 여부와 상관없이 가장 앞에 있는 원소부터 하나씩 확인해야 하므로 데이터의 개수가 N개일 때 최대 N번의 비교 연산이 필요하다.
따라서 순차 탐색의 시간 복잡도는 \(O(N)\)이다.
Binary Search
이진 탐색은 데이터가 정렬되어 있어야만 사용할 수 있으며, 탐색 범위를 절반씩 좁혀가며 데이터를 탐색한다.
- 시작점
- 끝점
- 중간점
이진 탐색은 위치를 나타내는 3개의 변수를 사용하며, 찾으려는 데이터와 중간점 위치에 있는 데이터를 반복적으로 비교하여 원하는 데이터를 찾는다.
이진 탐색은 한 번 확인할 때마다 확인하는 원소의 개수가 절반씩 줄어든다는 점에서 시간 복잡도가 \(O(logN)\)이다.
재귀 함수로 구현
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)
반복문으로 구현
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
Tree
트리 자료구조는 노드와 노드의 연결로 표현된 그래프 자료구조의 일종으로, 데이터베이스 시스템이나 파일 시스템과 같은 곳에서 많은 양의 데이터를 관리하기 위한 목적으로 사용한다.
Tree의 특징
- 트리는 부모 노드와 자식 노드의 관계로 표현된다.
- 트리의 최상단 노드를 루트 노드라고 한다.
- 트리의 최하단 노드를 단말 노드라고 한다.
- 트리에서 일부를 떼어내도 트리 구조이며, 이를 서브 트리라고 한다.
- 트리는 파일 시스템과 같이 계층적이고 정렬된 데이터를 다루기에 적합하다.
Binary Search Tree
왼쪽 자식 노드 < 부모 노드 < 오른쪽 자식 노드
가 성립하는 트리로 효율적인 탐색이 가능하다.
데이터 입력
이진 탐색 문제는 입력 데이터가 많거나 탐색 범위가 매우 넓은 편으로, 데이터를 입력받을 때 input()
함수를 사용하면 시간 초과가 발생할 수 있다.
입력 데이터가 많을 경우에는 sys
라이브러리의 readline()
함수를 이용하면 시간 초과를 피할 수 있다.
import sys
input_data = sys.stdin.readline().rstrip()
sys
라이브러리를 사용할 때는 한 줄을 입력받고 나서 rstrip()
함수를 꼭 호출해야 한다.
readline()으로
입력하면 엔터가 줄 바꿈 기호로 입력되어 이 공백 문자를 제거하기 위함이다.
'Algorithm' 카테고리의 다른 글
[Algorithm] 최단경로 알고리즘 - 다익스트라, 플로이드 워셜 (Python) (0) | 2023.01.26 |
---|---|
[Algorithm] Sorting - 버블, 선택, 삽입, 병합, 퀵 정렬 (Python) (0) | 2023.01.26 |
[Algorithm] DFS & BFS (0) | 2023.01.26 |
[Algorithm] Greedy (0) | 2023.01.26 |
[Algorithm] Prime number - 에라토스테네스의 체 (0) | 2022.10.20 |