Skip to content

Commit eac29f8

Browse files
committed
hash.md 파일추가
1 parent 3a840c5 commit eac29f8

File tree

1 file changed

+161
-0
lines changed

1 file changed

+161
-0
lines changed

JooKangSan/[week4]hash/Hash.md

Lines changed: 161 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,161 @@
1+
# JavaScript Hash(Map) Algorithm
2+
3+
## 1. 해시(Hash)란?
4+
키-값 쌍으로 데이터를 저장하는 자료구조로, 빠른 데이터 검색을 지원합니다.
5+
6+
### 기본 특성
7+
- 고유한 키를 통해 값에 접근
8+
- 상수 시간 O(1)의 검색 복잡도
9+
- 충돌 처리 메커니즘 필요
10+
11+
## 2. 자바스크립트에서 해시 구현 방법
12+
13+
### 2.1 객체를 사용한 기본 구현
14+
```javascript
15+
// 기본적인 객체 사용
16+
const hash = {};
17+
18+
// 데이터 추가
19+
hash['key'] = 'value';
20+
21+
// 데이터 접근
22+
console.log(hash['key']); // 'value'
23+
24+
// 데이터 삭제
25+
delete hash['key'];
26+
27+
// 키 존재 확인
28+
console.log('key' in hash);
29+
```
30+
31+
### 2.2 Map 객체 사용
32+
```javascript
33+
// Map 객체 생성
34+
const hashMap = new Map();
35+
36+
// 데이터 추가
37+
hashMap.set('key', 'value');
38+
39+
// 데이터 접근
40+
console.log(hashMap.get('key')); // 'value'
41+
42+
// 데이터 삭제
43+
hashMap.delete('key');
44+
45+
// 키 존재 확인
46+
console.log(hashMap.has('key'));
47+
```
48+
49+
## 3. 해시의 주요 활용 사례
50+
51+
### 3.1 빈도수 계산
52+
```javascript
53+
function countFrequency(arr) {
54+
const frequency = {};
55+
56+
for(const item of arr) {
57+
frequency[item] = (frequency[item] || 0) + 1;
58+
}
59+
60+
return frequency;
61+
}
62+
63+
// 사용 예시
64+
const arr = ['a', 'b', 'a', 'c', 'b', 'a'];
65+
console.log(countFrequency(arr)); // { a: 3, b: 2, c: 1 }
66+
```
67+
68+
### 3.2 중복 제거
69+
```javascript
70+
function removeDuplicates(arr) {
71+
const hash = {};
72+
const result = [];
73+
74+
for(const item of arr) {
75+
if(!hash[item]) {
76+
hash[item] = true;
77+
result.push(item);
78+
}
79+
}
80+
81+
return result;
82+
}
83+
84+
// 사용 예시
85+
console.log(removeDuplicates([1, 2, 2, 3, 3, 3])); // [1, 2, 3]
86+
```
87+
88+
### 3.3 Two Sum 문제
89+
```javascript
90+
function findTwoSum(nums, target) {
91+
const hash = {};
92+
93+
for(let i = 0; i < nums.length; i++) {
94+
const complement = target - nums[i];
95+
96+
if(complement in hash) {
97+
return [hash[complement], i];
98+
}
99+
100+
hash[nums[i]] = i;
101+
}
102+
103+
return null;
104+
}
105+
106+
// 사용 예시
107+
console.log(findTwoSum([2, 7, 11, 15], 9)); // [0, 1]
108+
```
109+
110+
## 4. 성능 고려사항
111+
112+
### 4.1 시간 복잡도
113+
- 삽입: O(1)
114+
- 삭제: O(1)
115+
- 검색: O(1)
116+
- 충돌이 많은 경우: O(n)
117+
118+
### 4.2 공간 복잡도
119+
- O(n), 여기서 n은 저장된 키-값 쌍의 수
120+
121+
### 4.3 주의사항
122+
1. 해시 충돌 처리
123+
- 체이닝
124+
- 개방 주소법
125+
126+
2. 메모리 사용
127+
- 적절한 초기 크기 설정
128+
- 동적 크기 조정
129+
130+
3. 키 선택
131+
- 고른 분포의 해시값
132+
- 효율적인 해시 함수
133+
134+
## 5. Map vs Object 비교
135+
136+
### 5.1 Map의 장점
137+
- 키로 모든 타입 사용 가능
138+
- 순서 보장
139+
- 크기를 쉽게 알 수 있음
140+
- 순회가 더 편리함
141+
142+
### 5.2 Object의 장점
143+
- 리터럴 문법 지원
144+
- JSON과의 호환성
145+
- 프로토타입 체인
146+
- 더 적은 메모리 사용
147+
148+
### 5.3 사용 예시
149+
```javascript
150+
// Map
151+
const map = new Map();
152+
map.set(1, 'one');
153+
map.set({}, 'object');
154+
map.set(() => {}, 'function');
155+
156+
// Object
157+
const obj = {
158+
1: 'one',
159+
'key': 'value'
160+
};
161+
```

0 commit comments

Comments
 (0)