解決散清單沖突的第一種方法通常叫做分離連接配接法,其做法是将散列到同一個值得所有元素保留到一個表中。我們可以使用标準庫的實作方法。如果空間很緊,則更可取的方法是避免使用它們(因為這些表是雙向連結的并且浪費空間)
下面給出一個例子:
package hash;
}
}
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();
}