TSet Numbers;
Numbers.Add(10);
Numbers.Add(20);
Numbers.Add(10); // 무시됨 (중복)
bool Has = Numbers.Contains(20); // O(1) - 매우 빠름
Hash 배열:
TArray<int32> 타입TSparseArray (데이터 저장소):
Value: 실제 저장할 값HashNextId: 다음 요소의 인덱스 (체이닝용)HashIndex: 어느 버킷에 속하는지template
class TSet
{
TArray Hash; // 버킷
TSparseArray Elements; // 데이터
struct FSetElement
{
ElementType Value;
int32 HashNextId; // 체이닝
int32 HashIndex; // 소속 버킷
};
};

HashNextId가 다음 요소의 인덱스를 저장해시 체이닝과의 관계
Data 배열:
TArray<FElement> 타입AllocationFlags:
TBitArray<> 타입Free List:
FirstFreeIndex: 첫 번째 빈 칸 위치class TSparseArray
{
TArray Data; // 실제 데이터
TBitArray<> AllocationFlags; // 사용 중 인지 (비트)
int32 NumFreeIndices; // 빈 칸 개수
int32 FirstFreeIndex; // 첫 빈 칸
};
| 방식 | 설명 | 언리얼 사용 여부 | 장점 | 단점 |
|---|---|---|---|---|
| Separate Chaining | 체인으로 연결 | TSet/TMap | 삭제 쉬움, Load Factor 높아도 됨 | 포인터/인덱스 저장 필요 |
| Open Addressing | 다른 빈 칸 찾기 | X | 메모리 효율 | 삭제 복잡, 클러스터링 |
| 선형 탐사 | 순차적으로 찾기 | X | 구현 간단 | 클러스터링 심함 |
| 이중 해싱 | 두 번째 해시 함수 | X | 클러스터링 적음 | 해시 함수 2개 필요 |
| 특성 | TSet | TMap |
|---|---|---|
| 저장 내용 | 값만 | 키-값 쌍 |
| 해시 키 | 값 자체 | 키만 |
| 중복 | 값 중복 불가 | 키 중복 불가, 값은 가능 |
| 검색 | Contains(값) | Find(키) 또는 [키] |
| 사용 예시 | 중복 제거, 집합 연산 | 딕셔너리, 빠른 조회 |
| 코드 예시 | TSet<int32> IDs; | TMap<int32, FString> Names; |