散列基础
思想:将元素通过一个函数转换成整数,这个元素可以是字符串等。常见的散列函数有直接定址法(恒等变换或是线性变换)、除留余数法等。当然冲突无法避免,映射成整数的时候,总会有元素落在相同的位置上,处理冲突的办法有线性探查法、平方探查法等。用STL模板库里的map函数可以不用自己解决冲突。
字符串hash
思想:把字符变成数字,再用进制转换,三位字符串由大写字母组成的话,先把字母映射到26个数,再用26进制,把字符串处理成一个数,并且这个hashTable的长度不能少于26*26*26.
题目
代码:
#include<string.h>
#include<stdio.h>
int hashTable[2000][2000] = { 0 };
int a[200] = { 0 };
int main() {
int m;
scanf("%d",&m);
while (m--) {
memset(hashTable, 0, sizeof(hashTable));
memset(a, 0, sizeof(a));
int n;
scanf("%d", &n);
int max = 0;
for (int i = 1; i <= n; i++) {
scanf("%d", &a[i]);
if (a[i] >= max)max = a[i];
hashTable[0][a[i]] = 1;
}
int max_g = 0;
for (int i = 1; i <= n; i++) {
int x;
scanf("%d", &x);
if (x >= max_g)max_g = x;
hashTable[x][a[i]]++;
hashTable[x][0] = 1;
}
for (int i = 1; i <= max_g; i++) {
if (hashTable[i][0] == 0) continue;
printf("%d={", i);
for (int j = 1; j <= max; j++) {
if (hashTable[0][j] == 0) continue;
printf("%d=%d", j, hashTable[i][j]);
if (j != max) printf(",");
}
printf("}\n");
}
}
return 0;
}