해시 충돌이란 무엇이며 그것이 발생하는 원인과 해결하기 위한 다양한 방법들 중, 체이닝을 설명하세요.
해시 충돌: 두 개 이상의 아이템이 동일한 저장공간에 지정되는 현상입니다.
이는 해시 함수의 특정상 제한된 크기의 해시 테이블에 무한한 수의 가능한 키들을 매핑해야 하기 때문에 발생합니다. 즉, 다양한 키들이 동일한 해시 값을 가질 수 있기 때문에 충돌이 발생합니다.
체이닝: 각 버킷에 연결 리스트(linked list)를 사용하여 여러 키-값 쌍을 저장하는 방법입니다.
체이닝 장점: 해시 테이블의 크기에 영향을 받지 않고, 일정한 성능을 유지할 수 있다.
체이닝 단점: 연결 리스트를 위한 추가 메모리가 필요하다. 연결 리스트가 길어지면, 해시
테이블의 값을 찾는데 시간이 많이 소요될 수 있다.
아래 코드는 분할 정복을 활용하여 병합 정렬(머지 소트)을 구현하는 코드 입니다. 비어있는
merge 함수를 구현해 보세요.
def merge_sort(arr):
if len(arr) <= 1:
return arr
mid = len(arr) // 2
left = merge_sort(arr[:mid])
right = merge_sort(arr[mid:])
return merge(left, right)
### 답안 ###
def merge(left, right):
result = []
i, j = 0, 0 # 두 배열의 인덱스
while i < len(left) and j < len(right):
if left[i] <= right[j]:
result.append(left[i])
i += 1 # 인덱스 증가
else:
result.append(right[j])
j += 1 # 인덱스 증가
# 남은 요소 추가(해당부분 추가)
result.extend(left[i:])
result.extend(right[j:])
return result
from typing import Any
class FixedQueue:
def __init__(self, capacity: int) -> None:
self.no = 0 # 현재 데이터 개수
self.front = 0 # 맨 앞 원소 커서
self.rear = 0 # 맨 끝 원소 커서
self.capacity = capacity # 큐의 크기
self.que = [None] * capacity # 큐의 본체
def __len__(self) -> int:
return self.no
def is_empty(self) -> bool:
return self.no <= 0
def is_full(self) -> bool:
return self.no >= self.capacity
### 답안 ###
def enque(self, x: Any) -> None:
if self.is_full():
return
self.que[self.rear] = x
self.rear += 1
self.no += 1
if self.rear == self.capacity:
self.rear = 0
# 데이터를 큐에서 삭제
def deque(self) -> None:
if self.is_empty():
return
x = self.que[self.front]
self.front += 1
self.no -= 1
if self.front == self.capacity:
self.front = 0
return x
캐시 메모리는 이러한 지역성 원리를 활용하여 자주 사용되거나 연속적으로 사용될
가능성이 높은 데이터를 미리 캐시에 저장합니다. 이로 인해 CPU는 필요한 데이터를
캐시에서 빠르게 찾을 수 있습니다.