如果采用链地址法来存储元素的话,如果哈希表有M个地址,如果要想放入哈希表的元素为N。
问题:
那么此时每个地址就能存储M/N个元素。此时它们的哈希值是冲突的。
如果每个地址都存储的是链表:O(N/M)
如果每个地址是平衡树:O(log(N/M))
怎么改进为O(1)呢?使用动态内存分配,内存谁着N的改变而自适应。
和静态数组一样,固定地址空间是不合理的需要resize。
解决思路:
1.平均每个地址承载的元素多过一定长度,就扩容。
2.平均每个地址承载的元素少过一定程度,就缩容。
动态空间的实现:
import java.util.Map;
import java.util.TreeMap;
public class HashTable<K, V> {
//上界
private static final int upperTol = 10;
//下界
private static final int lowerTol = 2;
//初试容量
private static final int initCapacity = 7;
private TreeMap<K, V>[] hashtable;
private int size;
private int M;
public HashTable(int M){
this.M = M;
size = 0;
hashtable = new TreeMap[M];
for(int i = 0 ; i < M ; i ++){
hashtable[i] = new TreeMap<>();
}
}
public HashTable(){
this(initCapacity);
}
private int hash(K key){
return (key.hashCode() & 0x7fffffff) % M;