정렬된 배열에서 탐색 범위를 절반씩 줄여가며 값을 찾는 알고리즘임.
def binary_search(arr, target):
left, right = 0, len(arr) - 1
while left <= right:
mid = (left + right) // 2
if arr[mid] == target:
return mid
elif arr[mid] < target:
left = mid + 1
else:
right = mid - 1
return -1
문제를 쪼개고 → 해결하고 → 합치는 방식
대표 예시:


인접 요소 비교 후 swap
가장 단순, 성능 최악
시간복잡도: O(N²)



분할 → 정렬 → 병합
안정 정렬
시간복잡도: O(N log N)



퀵 정렬의 핵심은 partition(분할 방식)임
대표적으로 2가지가 있음
def lomuto_partition(arr, low, high):
pivot = arr[high]
i = low
for j in range(low, high):
if arr[j] < pivot:
arr[i], arr[j] = arr[j], arr[i]
i += 1
arr[i], arr[high] = arr[high], arr[i]
return i
특징:
def hoare_partition(arr, low, high):
pivot = arr[low]
left = low - 1
right = high + 1
while True:
left += 1
while arr[left] < pivot:
left += 1
right -= 1
while arr[right] > pivot:
right -= 1
if left >= right:
return right
arr[left], arr[right] = arr[right], arr[left]
특징:
정리:
| 방식 | 장점 | 단점 |
|---|---|---|
| Lomuto | 구현 쉬움 | swap 많음 |
| Hoare | 성능 좋음 | 구현 어려움 |
(생략 없이 그대로 유지 가능 — 핵심은 뒤 Redis 파트라 간결 유지)
핵심:
Redis 사용 사례:
*2
$3
GET
$3
key
| 항목 | RESP | HTTP |
|---|---|---|
| 목적 | DB 통신 | 웹 통신 |
| 구조 | 매우 단순 | 헤더 + 바디 |
| 파싱 비용 | 낮음 | 높음 |
| 상태 코드 | 없음 | 있음 |
| 텍스트 크기 | 작음 | 큼 |
파싱이 매우 빠름
→ 단순한 구조 (*, $, CRLF)
네트워크 비용 절감
→ HTTP보다 데이터 크기 작음
상태 없음 (stateless)
→ 빠른 요청/응답 가능
구현이 쉬움
→ 직접 Redis 서버 만들 때 유리
핵심 요약:
RESP는 "속도를 위해 극단적으로 단순화된 프로토콜"
예:
SET key value EX 60
→ 60초 뒤 자동 삭제
Redis 내부에서는 크게 2가지 방식 사용
def get(key):
if key in store:
if expired(key):
delete(key)
return None
return store[key]
장점:
단점:
def cleanup():
for key in random_keys():
if expired(key):
delete(key)
장점:
단점:
→ 두 가지 혼합
(구조 유지, 핵심만 정리)