java 散列表(hash表)哈希表 基本构造

哈希表存储分为  分离链接法 和 开放地址法

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

}

猜你喜欢

转载自blog.csdn.net/lilisiyang___/article/details/90142676