散列
散列的定义与整数散列
散列是常用的算法思想之一。即用空间换取时间的想法。
例如:在N={8,3,7,6,2}中是否出现过M={7,4,2},如果采用遍历复杂度则是O(MN),将N用一个bool型数组hashTable[100010]存储起来,其中hashTable[x]==true,则表示整数x在N个数中出现过。
最后查询的数,直接通过hashTable数组判断出每个数是否出现过。
直接把输入的数作为数组的下标来对这个数的性质进行统计
↑这种方法很使用
散列
散列(hash),“将元素通过一个函数转换为整数,使得该整数可以唯一地代表这个元素。”其中把这个转换函数称为散列函数H。也就是说,元素在转换前为key,转换后就是一个整数H(key)。
- 除留余数法:把key除一个数mod得到的余数作为hash值的方法。H(key) = key % mod;
- 解决冲突:
会有两个不同的数,他们的hash值H(key1)和H(key2)是相同的,key1把表中位置为H(key1)的单元占据了,key2便不能再使用这个位置了。这种情况叫做冲突
解决冲突:1.线性探查法(Linear Probing)2.平方探查法(Quadratic Probing)
字符串hash
字符串hash:将一个字符串S映射为一个整数,使得该整数可以尽可能唯一的代表字符串。
##########################################字符串hash的代码#################################################
#include<cstdio>
const int maxn = 100;
char S[maxn][5],temp[5];
int hashTable[26*26*26+10];
int hashFunc(char S[],int len)
{
int id = 0;
for(int i = 0;i < len;i++)
{
id = id*26 + (S[i]-'A');
}
return id;
}