欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

散列表分离链接法

程序员文章站 2024-03-22 08:45:04
...
/*
 *分离链接散列表类架构
 */
 public class SeparateChainingHashTable<AnyType>{
	 private static final int DEFAULT_TABLE_SIZE=101;
	 private List<AnyType>[] theLists;
	 private int currentSize;
	 public SeparateChainingHashTable(){
		 this.SeparateChainingHashTable(DEFAULT_TABLE_SIZE);
	 }
	 public SeparateChainingHashTable(Int size){
		 theLists=new LinkedList[nextPrime(theLists.length)];
		 for(int i=0;i<theLists.length;i++){
			 theLists[i]=new LinkedList<AnyType>();
		 }
	 }
	 /*
	  *插入元素
	  * @param x is the item to insert
	  */
	 public void insert(AnyType x){
		 List<AnyType> list=theLists[myhash(x)];
		 if(!list.contains(x)){
			 list.add(x);
		 
		 if(++curentSize>theLists.length){
			 rehash();
		 }	
		 }		 
	 }
	 /*
	  * @param x is the item to remove
	  */
	 public void remove(AnyType x){
		 List<AnyType> list=theLists[myhash(x)];
		 if(list.contains(x){
			 list.remove(x);
			 currentSize--;
		 }
	 }
	 public boolean contains(AnyType x){
		 List<AnyType> list=theLists[myhash(x)];
		 return list.contains(x);
	 }
	 public void makeEmpty(){
		 for(int i=0;i<theLists.length;i++){
			 theLists[i].clear();
		 }
		 curentSize=0;
	 }
	 /*
	  * 散列
	  * @return hash值
	  */
	 private int myhash(AnyType x){
		 int hashVal=x.hashCode();//应当是关键字求值
		 hashVal%=theLists.length;
		 if(hashVal<0){
			 hashVal+=theLists.length;
		 }
		 return hashVal;
	 }
	 /*
	  *分离链接散列法再散列
	  */
	 private void rehash(){
		 List<AnyType>[]oldLists=theLists;
		 theLists=new List<AnyType>[nextPrime(2*oldLists.length)];
		 for(int j=0;j<oldLists.length;j++){
			 theLists[i]=new ArrayList<AnyType>();
		 }
		 currentSize=0;
		 for(int i=0;i<oldLists.length;i++){
			 for(int j=0;j<oldLists[i].size;j++){
				 insert(oldLists[i].get(j))
			 }
		 }
	 }
	 private static int nextPrime(int n){
		 while(!isPrime(n)){
			 ++n;
		 }
		 return n;
	 }
	 private static boolean isPrime(int n){
		 for(int i=2;i<sqrt(n);i++){
			 int k=n%i;
			 if(k==0){
				 return false;
			 }
		 }
		 return true;
	 }
 }