1. 배열(Array)

1.1. Time Complexity

ArraySearchBestAverageWorst
UnsortedLinear Search
SortedBinary Search
SortedInterpolation Search
  • Binary Search의 Best Case는 탐색의 관점에서 , 탐색 차수의 관점에서

  • Interpolation Search는 직선 형태의 균등 분포에서 , 불균등 분포에서

  • Insert/Delete:

1.2. Features

  • 연속된 메모리 공간에 저장됨
    • Random Access(임의 접근): 빠른 인덱스 접근 가능
    • → 메모리 접근 패턴이 일정해 캐시 친화적
  • (동적 배열 제외) 크기 고정
    • → 메모리 낭비 가능성
    • → 삽입/삭제 시 데이터 이동 발생 (삽입/삭제가 빈번하면 부적합)

1.3. Applications

  • 기본적인 자료구조 구현
  • 다차원 데이터 처리
  • 인덱스 접근을 활용하는 비디오 프레임 버퍼
  • 자주 변경되지 않는 정적 데이터 저장

2. 배열의 탐색

  • 탐색: 테이블(레코드의 집합)에서 원하는 탐색키를 가진 레코드를 찾는 작업

  • 테이블 구성 방법: 배열, BST, 해시 테이블 등

    • 테이블 구조에 따라 탐색·삽입·삭제 성능이 달라짐
  • 순차 탐색(선형 탐색): 일렬로 늘어선 레코드를 앞에서부터 순차적으로 비교하며 탐색

    • 배열이나 연결 리스트로 구성
  • 동작: 배열의 left부터 right까지 순서대로 탐색키와 비교

    • 같으면 성공(인덱스 반환), 끝까지 없으면 실패(-1 반환)
    • 시간 복잡도: 최선 O(1), 평균/최악 O(n)
    • 분석: 비효율적이지만, 비정렬 테이블이라면 별다른 대안은 없음
for (int i = left; i <= right; i++)
	if (A[i] == key) {
		// if (i != left) { i -= int; swap(A[i], A[i+1])} // 교환 전략
		return i;
	]
return -1;
  • 개선 - 자기 구성 순차 탐색: 자주 탐색되는 레코드를 테이블의 앞쪽으로 옮겨 탐색 효율 증가
    • move to front: 찾은 레코드를 맨 앞으로 이동
    • transpose: 찾은 레코드를 한 칸씩 앞쪽으로 교환
    • count-based: 탐색 횟수 집계 후 빈도 순으로 재배치
int binary_search(int A[]. int key, int low, int high) {
	while (low <= high) {
		int mid = (low + high) / 2;
		if (key == A[mid]) return mid; // 탐색키와 레코드가 같으면 반환
		else if (key < A[mid]) high = mid - 1; // 레코드가 크면 왼쪽으로
		else low = mid + 1; // 레코드가 작으면 오른쪽으로
	}
	return -1;
}
  • 이진 탐색: 정렬된 배열에서 가운데 요소와 비교하여 탐색 범위를 절반씩 줄여 나가는 방법

    • 구현: 재귀(recursive) 또는 반복(iterative) 구조
  • 분석

    • 삽입/삭제: O(n), 탐색: O(log n) (매 단계마다 범위를 절반으로 축소)
    • 삽입/삭제가 빈번하면 AVL 트리
    • 탐색 연산만 주로 처리하면 효율적

  • 보간 탐색(Interpolation Search)
    • 탐색키가 존재할 위치를 예측하여 탐색하는 방법
    • 래코드의 키값과 탐색키의 비율을 고려해 탐색 위치 계산