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 开放地址法
开放地址法,顾名思义,就是向出现冲突的同义词,开放周围其他空余的地址。其中开放地址法中常见三种处理方法,线性探测法,平方探测法,再散列法。
线性探测法是直接往后面找空余的单元。
平方探测法是加的常数为······,依次往后加。
再散列法是需要两个散列函数,当通过第一个散列函数得到的地址发生冲突时,这里用第二个散列函数计算该关键词的地址增量。
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.总结
哈希表在考研初试的时候就有一个大题,当时我把线性探测法和平方探测法记反了,直接错了整个大题,记忆犹新,在这上面吃了大亏。今天做的哈希表是用的除留余数法和线性探测法。