日撸代码300行学习笔记 Day 42

1.哈希表

哈希表又称为散列表,是根据关键值(key)来直接进行访问的数据结构。最大的特点也就是以空间换时间,这也代表着需要大量的存储空间。

1.1构造方法

常见的构造方法有好几种,例如:

1.1.1直接定址法:

这个方法就像直接用散列函数,例如y=a*x+b,其适合关键字的分布基本连续的情况,如果不连续的话,空位就会较多,会造成空间的浪费。

1.1.2 除留余数法:

这个是最常见最常用的方法,假定散列表表长为m,取一个不大于m但最接近于m的质数p,散列函数为H(key)= key % p

1.1.3 数字分析法:

设关键字是r进制数,而r个数码在各位上出现的频率不一定相同,可能在某些位上分布均匀一些,每种数码出现的机会均等;而某些位上分布不均匀,只有某几种数码经常出现,此时应选取数码分布较为均匀的若干位作为散列地址。这种方法适用于已知的关键字集合。

1.1.4 平方取中法:

这种方法是取关键字的平方值的中间几位作为散列地址,举个例子,例如身份证号这种。这种方法得到的散列地址与关键字的每位都有关系,因此散列地址分布的比较均匀。其适用于关键字的每位取值都不够均匀或者小于散列地址所需的位数。

1.2处理冲突的方法

1.2.1 开放地址法

开放地址法,顾名思义,就是向出现冲突的同义词,开放周围其他空余的地址。其中开放地址法中常见三种处理方法,线性探测法,平方探测法,再散列法。

线性探测法是直接往后面找空余的单元。

平方探测法是加的常数为0^{^{2}},1^{^{2}},-1^{^{2}},2^{^{2}},-2^{^{2}}······k^{^{2}},-k^{^{2}},依次往后加。

再散列法是需要两个散列函数,当通过第一个散列函数得到的地址发生冲突时,这里用第二个散列函数计算该关键词的地址增量。

1.2.2拉链法

俗称链接法,顾名思义。其主要适用于经常进行插入和删除的情况。

2.代码

public String hashSearch(int paraKey) {
		int tempPosition = paraKey % length;
		while (data[tempPosition] != null) {
			if (data[tempPosition].key == paraKey) {
				return data[tempPosition].content;
			} // Of if
			System.out.println("Not this one for " + paraKey);
			tempPosition = (tempPosition + 1) % length;
		} // Of while

		return "null";
	}// Of hashSearch

	/**
	 *********************
	 * Test the method.
	 *********************
	 */
	public static void hashSearchTest() {
		int[] tempUnsortedKeys = { 16, 33, 38, 69, 57, 95, 86 };
		String[] tempContents = { "if", "then", "else", "switch", "case", "for", "while" };
		DataArray tempDataArray = new DataArray(tempUnsortedKeys, tempContents, 19);

		System.out.println(tempDataArray);

		System.out.println("Search result of 95 is: " + tempDataArray.hashSearch(95));
		System.out.println("Search result of 38 is: " + tempDataArray.hashSearch(38));
		System.out.println("Search result of 57 is: " + tempDataArray.hashSearch(57));
		System.out.println("Search result of 4 is: " + tempDataArray.hashSearch(4));
	}// Of hashSearchTest

	/**
	 *********************
	 * The entrance of the program.
	 * 
	 * @param args Not used now.
	 *********************
	 */
	public static void main(String args[]) {
		System.out.println("\r\n-------hashSearchTest-------");
		hashSearchTest();
	}// Of main

3.总结

哈希表在考研初试的时候就有一个大题,当时我把线性探测法和平方探测法记反了,直接错了整个大题,记忆犹新,在这上面吃了大亏。今天做的哈希表是用的除留余数法和线性探测法。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值