一、基于拉链法的散列表
1. 拉链法:将大小为M的数组中每个元素指向一个链表,链表中的每个结点都存储了散列值为该元素的索引的键值对。
(就像从数组中拉出来的一条链一样~发生冲突的元素都被存储在链表中了!)
2. 基本思想
- 选择足够大的M,使得所有链表都尽可能地短,以保证高效地查找。
- 查找分两步:首先根据散列值hash(key)找到对应的链表st[hash(key)],然后沿着链表顺序查找相应的键st[hash(key)].get(key)。
3. 实现
(1)无序链表的实现
public class SequentialSearchST<Key, Value> {
private Node first; //链表首结点(如果有一个无序链表,我们就可以得到它的首结点)
//链表中结点的定义
private class Node{
Key key;
Value val;
Node next;
public Node(Key key, Value val, Node next){
this.key=key;
this.val=val;
this.next=next;
}
}
//获取指定键值为key的结点的值
public Value get(Key key){
for(Node x=first; x!=null; x=x.next){
if(key.equals(x.key))
return x.val ;
}
return null;
}
//查找给定的键,找到则更新其值,否则在表中新建结点
public void put(Key key, Value val){
for(Node x=first; x!=null; x=x.next){
if(key.equals(x.key)){
x.val=val; //命中,更新其值
return;
}