Post

⚡ 알고리즘 - 이진 탐색, 해시 탐색, BST

⚡ 알고리즘 - 이진 탐색, 해시 탐색, BST

▫️ 개념

  • 정렬된 배열에서 중간값과 찾는 값을 비교하여 탐색 범위를 절반씩 줄여가며 원하는 값을 찾는 알고리즘

▫️ 시간 복잡도

  • 평균, 최악: O(log n)
  • 공간 복잡도: O(1)

▫️ 특징

  • 배열이 반드시 정렬되어 있어야 함
  • 빠른 탐색 속도

▫️ 예제 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class BinarySearch {
	public static int binarySearch(int[] arr, int target) {
		int left = 0, right = arr.length - 1;
		
		while (left <= right) {
			int mid = left + (right - left) / 2;
			
			if (arr[mid] == target) return mid;
			else if (arr[mid] < target) left = mid + 1;
			else right = mid - 1;
		}
		
		return -1; // 못 찾았을 때
	}
	
	public static void main(String[] args) {
		int[] arr = {1, 2, 3, 6, 8, 10};
		System.out.println(binarySearch(arr, 6)); // 3
	}
}

🔹 해시 탐색(Hash)

▫️ 개념

  • 키를 해시 함수에 입력해 고유한 인덱스를 계산하고, 해당 위치에 값을 저장 또는 검색하는 탐색 방법

▫️ 시간 복잡도

  • 평균: O(1)
  • 최악: O(n) (해시 충돌 발생 시)

▫️ 특징

  • 빠른 삽입 및 검색 가능
  • 충돌 처리 방법 (체이닝, 오픈 어드레싱 등) 필요

▫️ 예제 코드

1
2
3
4
5
6
7
8
9
10
11
12
import java.util.HashMap;

public class HashSearch {
	public static void main(String[] args) {
		HashMap<String, Integer> map = new HashMap<>();
		map.put("apple", 5);
		map.put("banana", 3);
		
		System.out.println(map.get("apple")); // 5
		System.out.println(map.get("grape")); // null
	}
}

🔹 트리 기반 탐색 (Binary Search Tree, BST)

▫️ 개념

  • 이진 탐색 트리(BST)는 왼쪽 서브트리에 작은 값, 오른쪽 서브트리에 큰 값이 위치하는 이진 트리 구조에서 값을 탐색하는 방법

▫️ 시간 복잡도

  • 평균: O(log n)
  • 최악: O(n) (트리가 한쪽으로 치우친 경우)

▫️ 특징

  • 정렬된 데이터의 효율적 탐색, 삽입, 삭제 가능
  • 균형 트리 (AVL, Red-Black Tree) 사용 시 최악 성능 개선

▫️ 예제 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
class Node {
	int key;
	Node left, right;
	Node(int item) {
		key = item;
		left = right = null;
	}
}

public class BST {
	Node root;
	
	public void insert(int key) {
		root = insertRec(root, key);
	}
	
	private Node insertRec(Node root, int key) {
		if (root == null) {
			root = new Node(key);
			return root;
		}
		if (key < root.key) root.left = insertRec(root.left, key);
		else if (key > root.key) root.right = insertRec(root.right, key);
		return root;
	}
	
	public boolean search(int key) {
		return searchRec(root, key);
	}
	
	private boolean searchRec(Node root, int key) {
		if (root == null) return false;
		if (root.key == key) return true;
		if (key < root.key) return searchRec(root.left, key);
		return searchRec(root.right, key);
	}
	
	public static void main(String[] args) {
		BST tree = new BST();
		tree.insert(50);
		tree.insert(30);
		tree.insert(70);
		System.out.println(tree.search(30)); // true
		System.out.println(tree.search(90)); // false
	}
}

🔹 비교

알고리즘평균 시간 복잡도최악 시간 복잡도공간 복잡도특징
이진 탐색O(log n)O(log n)O(1)정렬된 배열에서만 사용 가능, 빠른 탐색
해시 탐색O(1)O(n)O(n)빠른 삽입/검색, 해시 충돌 처리 필요
트리 탐색 (BST)O(log n)O(n)O(n)정렬 데이터 탐색 가능, 균형 트리로 성능 개선 가능
This post is licensed under CC BY 4.0 by the author.