散列表的分離連接法

解決散列表衝突的第一種方法通常叫做分離連接法,其做法是將散列到同一個值得所有元素保留到一個表中。我們可以使用標準庫的實現方法。如果空間很緊,則更可取的方法是避免使用它們(因爲這些表是雙向鏈接的並且浪費空間)
下面給出一個例子:
package hash;

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{

    }
}

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();
}

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章