해시 테이블(Hash table)을 사용 하다 보면 충돌이 빈번하게 발생하게 되는데
테이블의 사이즈만 잘 구하더라도 충돌을 최소화 하여 테이블을 효율적으로 사용 할 수 있습니다.
방법
2의 제곱수에서 가장 거리가 먼 소수를 이용하여 테이블 크기를 구하면 됩니다.
소스 코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | #include <stdio.h> int primeNumArr[10000]; int cur = 0; // 소수 구하기 void makePrimeNum() { primeNumArr[cur++] = 1; int j; for (int i = 1; i < 100000; i++) { for (j = 2; j <= i; j++) { if (i % j == 0) { break; } } if (i == j) { primeNumArr[cur++] = i; } } printf("primeNumArr size : %d \n", cur); } // 2의 제곱 구하기 int exponentiation(int num) { int value = 2; for (int i = 0; i < num-1; i++) { value *= 2; } return value; } int main() { makePrimeNum(); for (int i = 3; i < 15; i++) { int num1 = exponentiation(i); int num2 = exponentiation(i+1); int num3 = num1 + (num1 / 2); int tableSize; for (int j = 0; j <= cur; j++) { if (num3 < primeNumArr[j]) { tableSize = primeNumArr[j]; break; } } printf("2의%d승 / 2의%d승 사이의 테이블 크기 : %d \n", i, i + 1, tableSize); } return 0; } | cs |
출력
출력 값으로 테이블의 크기로 잡고 사용 해보면 충돌을 최소화 하여 사용 할 수 있습니다.
물론 해시 테이블에 들어가는 Key값에 따라서 달라질 수 도 있겠지만,
문자열을 자릿수를 접어서 키를 사용하는 경우에는 충돌이 최소화 됩니다.
(문자열 자릿수 접는 것 : 문자 열의 문자들을 아스키 코드 값으로 변경하여 덧셈 한 것)
'알고리즘 > 알고리즘' 카테고리의 다른 글
LCS(Longest Common Subsequence) 알고리즘 C언어 (0) | 2018.07.29 |
---|---|
C언어 문자열 함수 strcpy strlen strcmp 구현 (0) | 2018.07.21 |
C언어 소수 구하기 (2) | 2018.07.17 |
꼬리 재귀 최적화 (0) | 2018.07.10 |
C 언어 순열 알고리즘 (0) | 2018.07.09 |