공부/알고리즘

hash key 관련

하이원 2020. 12. 1. 16:34

다양한 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