您的位置:首页 > 编程语言 > Java开发

java 数组实现哈希表的构建,查找,插入,删除

2016-06-07 22:23 627 查看
以下代码以数组存储方式实现了哈希表的创建,查找,插入,删除等操作,哈希函数采用除留余数法,使用开放定址法中的线性探查法处理冲突

public class HashSearch {
/*使用数组实现hashtable的创建,查找,插入,删除*/

class Node{    //结点内部类表示hashtable中存储的元素
int key;   //数据域
boolean delflag;  //在删除时使用,作为删除标志
int times;  //比较次数
public Node(int data){
key=data;
delflag=false;
times=0;
}
}

public int Collision(int d,int hashsize){
/*线性探查法处理冲突,hashsize表示HashTable的大小*/
return (d+1)%hashsize;
}

public int HashFunc(int key,int hashsize){
/*采用除留余数法构造哈希函数*/
return key%hashsize;
}

/*hashtable的查找*/
public int Hashsearch(Node[]HashTable,int x){
/*HashTable为哈希表数组,x为待查找的元素*/
/*找到,则返回哈希地址;没找到返回负的哈希地址*/
int addr;
int hashsize=HashTable.length;
addr=HashFunc(x,hashsize);   //获得哈希地址
while(HashTable[addr]!=null && HashTable[addr].key!=x){
addr=Collision(addr,hashsize);  //没找到,处理冲突
}

if(HashTable[addr]!=null && HashTable[addr].key==x)    //查找成功
return addr;
else return -addr;    //查找失败

}

/*哈希表的插入*/
public int HashInsert(Node[]HashTable,int x){
int addr;
addr=Hashsearch(HashTable,x);  //在哈希表中查找
if(addr>0) return 0;  //找到则不必插入
HashTable[-addr]=new Node(x);   //没找到,则插入
HashTable[-addr].times=1;  //设置比较次数
return 1;   //插入成功

}

/*哈希表的创建*/
public void CreateHash(Node[]HashTable,int items[]){
/*利用所给关键字的序列items,创建哈希表,n为关键字的个数*/
int hashsize=HashTable.length;
int n=items.length;
int i;
for(i=0;i<hashsize;i++){   //初始化哈希表
HashTable[i]=null;
}

for(i=0;i<n;i++){
HashInsert(HashTable,items[i]);   //依次向哈希表中插入元素
}
}

/*哈希表的删除*/
public int HashDelete(Node[]HashTable,int x){
int addr;
addr=Hashsearch(HashTable, x);   //查找数据元素
if(addr>0){
HashTable[addr].delflag=true;   //找到,则设置删除标记为true
return 1;
}
return 0;
}

/*哈希表的显示*/
public void Displayhash(Node[]HashTable){
int i,hashsize=HashTable.length;
System.out.print("哈希表\n哈希地址:");
for(i=0;i<hashsize;i++){
System.out.print(i+"   ");
}
System.out.print("\n关键字:   ");
for(i=0;i<hashsize;i++){
if(HashTable[i]!=null && HashTable[i].delflag==false){
if(HashTable[i].key<10)
System.out.print(HashTable[i].key+"   ");
else System.out.print(HashTable[i].key+"  ");

}
else System.out.print(","+"   ");
}
}

public static void main(String[] args) {
int []items=new int[]{15,59,22,34,7,78};
Node[] HashTable=new Node[7];
HashSearch hs=new HashSearch();
hs.CreateHash(HashTable, items);
hs.Displayhash(HashTable);
int addr;
addr=hs.Hashsearch(HashTable, 59);
System.out.println("\n"+addr);
hs.HashDelete(HashTable, 34);
hs.Displayhash(HashTable);

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: