对于hash的主要思想:hash主要是以空间来换取时间,所以hash往往在时间上具有很大的优势!
这里主要总结针对字符串和大数据整理几个hash常用的方法:
线性探针法:
对于线性探针法,主要处理一些大数据比较方便,使用线性探针可以压缩存储数据!即一段内存里面存储更多的数据。线性探针法的效率更存储空间的大少成正相关,空间越大所花时间查找效率越低!
模板:
struct node
{
int val; //权值
bool f; //是否存储
}a[N];
int xianxin(int v)
{
int p=v % MAX;
if(p < 0) p+=MAX;
while(a[p].f && a[p].val!=v) p=(p+1)%MAX;
return p;
//p为索引
}
字符串成整数法:
对于字符串映射,很多时候可以考虑到用map,对于大整数同样也是如此。但是map的容量有限,很容易就爆了,或者超出预定的内存!这时可以先使用ELFHASH法。一旦将字符串变成整数,接下来一切好办。
ELF模板:
inline int ELFhash(char *key)
{
unsigned long h = 0;
unsigned long g;
while( *key )
{
h =( h<< 4) + *key++;
g = h & 0xf0000000L;
if( g ) h ^= g >> 24;
h &= ~g;
}
return h;
}
/* 解释:*/
//将一个字符串的数组中的每个元素依次按前四位与上一个元素的低四位相与,
//组成一个长整形,如果长整的高四位大于零,
//那么就将它折回再与长整的低四位相异或,
//这样最后得到的长整对HASH表长取余,得到在HASH中的位置。
PS:对于hash函数其实有很多种类,以后见到,再做补充!