Skip to content

Commit a14c432

Browse files
committed
Hash - double hashing
1 parent 4740a3f commit a14c432

File tree

1 file changed

+50
-0
lines changed

1 file changed

+50
-0
lines changed

hash/double_hasing.ts

+50
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
/**
2+
* * 이중해시법 (double hasing)
3+
* * 이중해시법은 해시함수를 2개를 가지고 있다.
4+
* * 만약 첫번째 해시함수의 결과에서 충돌이 발생하면 두번째 해시함수와 첫번째 해시함수의 값을 더해서
5+
* * 새로운 테이블 주소를 얻어낸다.
6+
*
7+
* * 다음 테이블 주소 계산식
8+
* * h'(k) = C - (k mod C)
9+
* * h(k) -> h(k) + h'(k) -> h(k) + 2h'(k) -> h(k) + 3h'(k) -> h(k) + 4h'(k)
10+
*
11+
* * 여기서 포인트는 테이블의 주소가 소수여야 된다는 점이다.
12+
* * 소수가 아닐 경우, 순환해서 같은 키 값들만을 탐색하기 때문이다.
13+
* * 에를 들어서, 테이블의 크기가 6, C=5, 키값이 13라고 해보자. 이를 계속 나눈 나머지는 다음과 같다.
14+
* * 1, 3, 5, 1, 3, 5
15+
* * 이런 특성때문에 테이블 주소는 소수이다.
16+
*/
17+
18+
const hashTableSize = 10;
19+
const hashTable = Array(hashTableSize).fill(null);
20+
21+
function hash1(key: number) {
22+
return key % hashTableSize;
23+
}
24+
25+
function hash2(key: number) {
26+
return 5 - (key % 5);
27+
}
28+
29+
function doubleHasingAdd(key: number, value: number) {
30+
const hashValue = hash1(key);
31+
let i = hashValue;
32+
let inc = hash2(key);
33+
while (hashTable[i]) {
34+
if (hashTable[i] === value) {
35+
console.log("중복");
36+
return;
37+
}
38+
39+
i = (i + inc) % hashTableSize;
40+
41+
if (hashValue === i) {
42+
console.log("테이블 가득참");
43+
return;
44+
}
45+
}
46+
47+
hashTable[i] = value;
48+
}
49+
50+
export {};

0 commit comments

Comments
 (0)