一个散列函数能够将转化为数组索引。散列算法的第二步是碰撞处理,也就是处理两个或者多个散列值的情况。一种直接的方法是将大小为M的数组的每一个元素指向一条链表,链表中的每个节点都存储了散列值为该元素的索引的键值对,这种方法称为拉链法,因为发生冲突的元素都被存储在链表之中,这个方法的基本思想就是选择足够大的M,使得所有链表都尽可能短以保证查找的高效。查找分为两步:首先根据散列值找到对应的链表,然后沿着链表顺序查找相应的键。
struct Node
{
int key;
int value;
Node *next;
Node(int _key,int _value)
{
key=_key;
value=_value;
}
};
class chainingHash
{
private:
int length;
Node **node;
public:
chainingHash(int n)
{this.length=n;
**node=new Node*[n];
}
void put(int key,int value)
{
//key到hash值的转化,这里不具体写
int n=hash(key);
Node *p=node[n];
while(p->next==null)
p++;
p->next=new Node(key,value);
}
int get(int key)
{
int n=hash(key);
Node *p=node[n];
while(p->next==null)
{
if(p->key==key)
{return p->value;
break;
}
p++;
}
return -1;//表示没找到
}
}