다양한 hash key 생성법
- 나열된 숫자들의 제곱의 합
(10 8 23 93 21 42 이렇게있을때 멍청하게 다계산하지말고 누적합을 쓴다)
- 영문 앞3개의 26승의 합
- 소문자를 ULL로 5비트씩 할당해서 key
- bit 처리가 가능한 경우 16bit, 20bit 씩 키로 처리하는것도 가능
같은모양 찾는 해쉬
- 연결된 선 cnt
- 좌상, 우하 의 가상 사각형의 x,y
- 좌상 4개, 우상, 4개 등의 패턴 (0101, 0011 같은)
- 블럭의 왼쪽, 오른쪽, 위, 아래의 블럭여부를 체크해서 (1,2,4,8)을 더해주는 형태로 갯수를 세는 패턴
시험장에서 주는 기본해쉬함수를 응용해도 된다.
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 | //reference unsigned long hash(const char *str) { unsigned long hash = 5381; int c; while (c = *str++) { hash = (((hash << 5) + hash) + c) % MAX_TABLE; } return hash % MAX_TABLE; } // 문자열 앞 4개만 사용 int get_head_key(char *name) { unsigned int sum = 5381; for (int i = 0; i < 4; i++) { sum = sum * 33 + name[i]; } return sum % 50000; } //해쉬함수 큰 숫자일경우 이렇게 해보자 int hashFunc(unsigned int key) { // unsigned int니 특정수를 곱하고 size 홀수로 나눠줌 key *= 77; key *= 527; return key % 17008863; } //15bit를 합쳐서 int hashFunc2(int(*bp)[20]) { int sum = 0; for (int y = 0; y < 3; y++) { for (int x = 0; x < 5; x++) { sum = (sum << 1) | bp[y][x]; } } return sum; } | cs |
'공부 > 알고리즘' 카테고리의 다른 글
정렬(sort) 관련 (0) | 2020.12.09 |
---|---|
부분합 문제 (0) | 2020.12.07 |
기본 dfs, bfs (0) | 2020.12.01 |
구간트리 (최대, 최소) (0) | 2020.12.01 |
DLL + hash 2개 (0) | 2020.11.28 |