散列
散列常指散列表的实现。散列是一种用于以常数平均时间执行插入、删除和查找的技术。
如果对于一个表,当一个元素被插入时与一个已经存插入的元素散列到相同的值,那么久产生一个冲突,解决这个冲突的算法有好多种,下面讨论最简单的两种:分离链表法和开放定址法。
分离链表法
分离链表法的通常解决方法是将散列到同一个值得所有元素保留到一个表中。
如图,对于10个长度的表,使用数据的大小对10取余,决定在表中的位置,当余数相同时放在链表中。
代码实现:
package structures;
import java.util.LinkedList;
import java.util.List;
/**
* 分离链接法
* @param <T>
*/
public class SeparateChainingHashTable<T> {
private static final int DEFAULT_TABLE_SIZE=10;
private List<T> [] theLists;
private int currentSize;
public void insert(T element){
List<T> thisIndexList = this.theLists[myHash(element)];
if(!thisIndexList.contains(element)){
thisIndexList.add(element);
if(++currentSize>theLists.length){
rehash();//扩充表
}
}
}
private void rehash() {
List<T>[] oldList = this.theLists;
this.theLists = new List[nextPrime(2*theLists.length)];
for (int i = 0; i <theLists.length ; i++) {
this.theLists[i] = new LinkedList<T>();
}
currentSize = 0;
for (int i = 0; i < oldList.length; i++