哈希表容易造成冲突,为了避免冲突:
1.尽可能的让出来的下标符合均匀分布。
2.负载因子的调节
负载因子=哈希表中的数据个数/数组的长度
- 负载因子越少,冲突率越低
- 把数组长度变大
- 事先规定好一个阙值,来控制size
一般情况下来讲,哈希表主要涉及两种办法
1.线性探测(主要是考试出题)
求成功的平均查找长度和失败的平均查找长度
代码实现开散列
public class Hash {
private static class Node{
private int key;
private int value;
Node next;
public Node(int key,int value){
this.key=key;
this.value=value;
}
}
private Node[] array;
private int size;
private static final double LOAD_FACTOR=0.75;
public int getKey(int key){
int index=key%array.length;
Node head=array[index];
for(Node cur=head;cur!=null;cur=cur.next){
if(cur.key==key){
return cur.value;
}
}
return -1;
}
public int put(int key,int value){
int index=key%array.length;
for(Node cur=array[index];cur!=null;cur=cur.next){
if(cur.key==key){ // 存在结点值,直接修改
int oldValue=cur.value;
cur.value=value;
return oldValue;
}
Node node=new Node(key,value);
node.next=array[index];
array[index]=node; //不存在,新建一个结点使用头插法
size++;
if(loadFactor()>=LOAD_FACTOR){
resize();
}
}
}
private void resize() {
Node[] newArray= new Node [array.length*2];
for(int i=0;i<array.length;i++){
Node next;
for(Node cur=array[i];cur!=null;cur=next){
next=cur.next;
int index=cur.key%newArray.length;
cur.next=newArray[index];
newArray[index]=cur; // 这里是一个头插
}
}
array=newArray;
}
private double loadFactor() {
return size*1.0/array.length;
}
}