哈希表存储分为 分离链接法 和 开放地址法
一
1.1分离链接法:每个数据对应一个哈希值,设置一个哈希值数组,每个数组元素为同一个哈希值的数据所构成的单链表的头节点。
二
开放地址法:一个哈希值数组,若当前哈希值元素无数据存储,则将数据存入,,若当前哈希值数组元素有数据存入了(产生冲突,需解决),则移到下一元素,直到遇到没有数据存入的哈希值数组元素,存入(即下列方法1),类推循环。
开放地址法需要解决冲突:
1.线性探测法:后移:F(i)=i;后移找到当前冲突结点之后的第一个未冲突节点,存入
2.平方探测法:后移:F(i)=i^2(类似线性探测)。查找i=1次未成功,后移当前冲突节点+i*i处,若无数据则插入,类推
3.双 散 列:后移F(i)=R - ( X mod R ),R为小于TableSize的素数,X为当前冲突的要插入的数据
4.再 散 列:在线性探测法上,若超过一半空间都被插入数据(或者遇到了冲突等,不唯一),再申请一个之前二倍大的散列表,把原数据在插入新散列表。
package P1;
class ArrHash{
int arrhash[];
int count=0;
public ArrHash() {
arrhash=new int[10];
for(int i=0;i<10;i++) {
arrhash[i]=-1;
}
}
//线性探测法
public void hash(int d) {
count++;
int h=d%10;
if(arrhash[h]==-1) {
arrhash[h]=d;
}else {
for(;arrhash[h]!=-1;) {
h=(h+1)%10;//根据循环链表,x=(x+1)%maxsize可以在到达最后一个节点时
} // i从maxsize回到0
arrhash[h]=d;
}
}
//平方探测法
public void hash1(int d) {
count++;
int h=d%10;
if(arrhash[h]==-1) {
arrhash[h]=d;
}else {
int i=1;
while(true) {
i=i*i;//控制后移几位
if(arrhash[(h+i)%10]==-1) {//若后移几位为-1,则将“那位”赋值d
arrhash[(h+i)%10]=d;
break;
}else {
i++;
}
}
}
}
public void show() {
for(int i=0;i<10;i++) {
System.out.print(i+":"+arrhash[i]+" , ");
}
System.out.println();
}
}
public class Main {
public static void main(String[] args) {
ArrHash H=new ArrHash();
H.hash(89);
H.hash(18);
H.hash(49);
H.hash(58);
H.hash(69);
H.show();
ArrHash H1=new ArrHash();
H1.hash1(89);
H1.hash1(18);
H1.hash1(49);
H1.hash1(58);
H1.hash1(69);
H1.show();
}
}