哈希函数思想在查找中是非常重要的一个思想。在数据结构中我们学习的都只是一些简单的函数
比如:
相加取余
相乘取余
相除取余
。。。。
哈希函数在查找中可以在O(1)时间中查找到数据的位置。
哈希函数的关键在于函数的选取 , 然而不管选择怎么样的函数 , 一般都会存在冲突 , 但是如果函数选取得得当,那么冲突就会减小。
poj 3349是一题简单的hash题
我们选取的函数是:
相加取余数
sort(b , b+6 ); x = 0; for(j = 0; j < 6; j++) x = (x*10 + b[j])%maxn;
代码:
#include <iostream> #include <string.h> #include <stdio.h> #include <algorithm> using namespace std; #define maxn 137373 int ha[maxn] , next1[maxn]; int n; int ya[maxn][6]; void init() { memset(ha , -1 , sizeof(ha)); memset(next1 , -1 , sizeof(next1)); } bool make1(int s , int t) { int i , a = 0, j , k; int begin1[6]; for(i = 0; i < 6; i++) if(ya[t][i] == ya[s][0]) begin1[a++] = i; for(k = 0; k < a; k++) { j = begin1[k]; for(i = 0; i < 6; i++) { if(ya[s][i] == ya[t][j]) { j += 1; j = j==6?0:j; } else break; } if(i >= 6) return true; j = begin1[k]; for(i = 0; i < 6; i++) { if(ya[s][i] == ya[t][j]) { j -= 1; j = j<0?5:j; } else break; } if(i >= 6) return true; } return false; } bool check(int s , int x) { int i ; if(ha[x] == -1) { ha[x] = s; return false; } for(i = ha[x] ; i != -1; i = next1[i]) { if(make1(s , i)) return true; } next1[s] = ha[x]; ha[x] = s; return false; } int main() { while(scanf("%d" , &n) != EOF) { init(); int i , j , b[6]; int x; bool bz = false; for(i = 0; i < n; i++) { for(j = 0; j < 6; j++) { scanf("%d" , &ya[i][j]); b[j] = ya[i][j]; } if(bz) continue; sort(b , b+6 ); x = 0; for(j = 0; j < 6; j++) x = (x*10 + b[j])%maxn; bz = check( i , x); } if(bz) printf("Twin snowflakes found.\n"); else printf("No two snowflakes are alike.\n"); } return 0; } /* 2 1 2 3 4 5 6 5 6 1 2 3 4 */
这个题目的Status中看到有人在1000ms内就A了的 , 不知道他们的哈希函数是怎么选取的
poj 3349 hash的运用
时间: 2024-10-24 13:03:07