解決散列表衝突的第一種方法一般叫作分離鏈接法,其作法是將散列到同一個值得全部元素保留到一個表中。咱們能夠使用標準庫的實現方法。若是空間很緊,則更可取的方法是避免使用它們(由於這些表是雙向連接的而且浪費空間)
下面給出一個例子:
package hash;java
import java.util.LinkedList;
import java.util.List;
import java.util.Iterator;
import java.util.Random;數組
public class SeprateChainingHashTable<AnyType> {
private static final int DEFAULT_TABLE_SIZE=10;//默認容量
private List<AnyType>[] theLists;//散列表的數組
private int currentSize;//當前數據個數
public SeprateChainingHashTable(){
this(DEFAULT_TABLE_SIZE);
}
public SeprateChainingHashTable(int size) {
// TODO Auto-generated constructor stub
theLists = new LinkedList[nextPrime(size)];
for (int i = 0; i < theLists.length; i++) {
theLists[i] = new LinkedList<AnyType>();
}
}
public void makeEmpty() {
for(List<AnyType>list:theLists){
list.clear();
}
currentSize=0;
}
public boolean contains(AnyType x){
List<AnyType> whichList =theLists[myhash(x)];
return whichList.contains(x);
}
public void insert(AnyType x) {
List<AnyType> whichList = theLists[myhash(x)];
if (!whichList.contains(x)) {
whichList.add(x);
if (++currentSize > theLists.length) {
rehash();
}
} else {
}
}
public void remove(AnyType x){
List<AnyType> whichList = theLists[myhash(x)];
if(whichList.contains(x)){
whichList.remove(x);
currentSize--;
}else{dom
} } private int myhash(AnyType x) { // TODO Auto-generated method stub int hashVal=x.hashCode(); hashVal%=theLists.length; if(hashVal<0){ hashVal+=theLists.length; } return hashVal; } private void rehash() { // TODO Auto-generated method stub List<AnyType>[] oldLists=theLists; theLists=new List[nextPrime(2*theLists.length)]; for(int j=0;j<theLists.length;j++){ theLists[j]=new LinkedList<AnyType>(); } currentSize =0; for(int i=0;i<oldLists.length;i++){ for(AnyType item:oldLists[i]){ insert(item); } } } private static boolean isPrime(int num){ if(num==2||num==3){ return true; } if(num==1||num%2==0){ return false; } for(int i=3;i*i<=num;i+=2){ if(num%i==0){ return false; } } return true; } private int nextPrime(int num) { // TODO Auto-generated method stub if(num==0||num==1||num==2){ return 2; } if(num%2==0){ num++; } while (!isPrime(num)) { num+=2; } return num; } public void printTable(){ for(int i=0;i<theLists.length;i++){ System.out.println("---------"); Iterator iterator=theLists[i].iterator(); while(iterator.hasNext()){ System.out.print(iterator.next()+""); } System.out.println(); } } public static void main(String[] args){ Random random=new Random(); SeprateChainingHashTable<Integer> hashTable=new SeprateChainingHashTable<Integer>(); for(int i=0;i<30;i++){ hashTable.insert(random.nextInt(30)); } hashTable.printTable(); }
}ide