实现哈希表查找(除留余数法)

哈希表也称散列表,查找有两种方式,比较式查找和计算式查找,而计算式查找则通过哈希表来实现。给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f(key)为哈希(Hash) 函数;更通俗来说,哈希表通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这里用除留余数法来构造哈希表和开放地址法中的线性探测再散列来处理不同关键字通过哈希函数映射到同一地址的冲突。 
        1、除留余数法:取关键字被某个不大于散列表表长m的数p除后所得的余数为散列地址。即 H(key) = key MOD p,p<=m。 
        2、线性探测再散列:Hi=(H(key) + di) MOD m,i=1,2,…,k(k<=m-1),其中H(key)为散列函数,m为散列表长,di=1,2,3,…,m-1
今日感觉不是很熟悉了,就写了一下,就动手写了一遍,代码如下:

/**
 * 哈希表查找(除留余数法)
 * @author calm
 *
 */
public class HashTable {
	static int key[]={47,7,29,11,16,22,92,3,8,22};
	static int N=key.length;	//散列表长度
	static int ht[]=new int[N];
	public static void main(String[] args) {
		for (int i = 0; i < ht.length; i++) {
			ht[i]=-1;	//初始化,可根据实际情况初始化
		}
	//	System.out.println(N);
		System.out.print("散列地址:	");
		for (int i = 0; i < ht.length; i++) {
			System.out.print(i+"	");
		}
		
		for (int i = 0; i < key.length; i++) {
			hashSearch(ht,N,key[i]);
		}
		
		System.out.println();
		System.out.print("关键码:	");
		for (int i = 0; i < ht.length; i++) {
			System.out.print(ht[i]+"	");
		}
		
	}
	//散列表下标
	static int h(int v){
		return v%N;
	}
	
	static int hashSearch(int ht[],int len,int k){
		int j=h(k);
		if (ht[j]==k) {//查找成功
			return j;
		}else if(ht[j]==-1){//该位置为空,插入,返回
			ht[j]=k;
			return j;
		}
		int i=(j+1)%N;
		while (ht[i]!=-1&&i!=j) {//循环遍历散列表
			if(ht[i]==k){
				return i;
			}else {
				i=(++i)%N;
			}
		}
		if (i==j) {//遍历散列表一遍,没找到,满
			System.err.println("哈希表溢出!");
		}else {
			ht[i]=k;
			return i;
		}
		return 0;
	}
	
}


  • 0
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值