File tree 1 file changed +50
-0
lines changed
1 file changed +50
-0
lines changed Original file line number Diff line number Diff line change
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 { } ;
You can’t perform that action at this time.
0 commit comments