一、前言:
这是怀化学院的:Java数据结构中的一道难度中等的一道编程题(此方法为博主自己研究,问题基本解决,若有bug欢迎下方评论提出意见,我会第一时间改进代码,谢谢!) 后面其他编程题只要我写完,并成功实现,会陆续更新,记得三连哈哈! 所有答案供参考,不是标准答案,是博主自己研究的写法。(这一个题书上也有现成的代码,重要的是理解它的算法原理!)
二、题目要求如下:
(第 1 题) 哈希查找(难度系数75)
哈希查找
标准输入输出
题目描述:
实现哈希查找。要求根据给定的哈希函数进行存储,并查找相应元素的存储位置。本题目使用的哈希函数为除留取余法,即H(key)=key%m,其中m为存储空间,冲突处理方法采用开放定址法中的线性探测再散列,即Hi=(H(key)+i)/%m,0<=i<=m-1。
输入:
输入包含若干个测试用例,第一行为测试用例个数。每个测试用例占3行,第一个为元素个数m,第二行为m个元素值,即需要进行散列存储的元素个数,同时也是存储空间个数(空间位置从0开始存储),第三行为需要查找的元素。
输出:
对每一测试用例,分别用两行输出,第一行输出所有的元素,要求按存储地址从0开始输出,用空格隔开,第二行输出需要查找的元素在数组中的位置,即对应数组中的下标。
输入样例:
1
5
2 4 1 7 9
7
输出样例:
9 1 2 7 4
3
三、代码实现: (代码的做题原理全部在代码注释中,若还有疑问也可以翻书关于哈希查找的内容)
补充:建议写这到题的同志一定要去了解Java《数据结构》书中的哈希表、哈希函数、以及哈希冲突等等东西,不然会有点找不着头脑的感觉!
(1)全部放在一个Main类里面去实现该题的所有要求:
package com.fs.search01;import java.util.Scanner;public class HashTable {public static void main(String[] args) {Scanner sc =new Scanner(System.in);int k =sc.nextInt(); //需要测试的总次数while (k>0){int m=sc.nextInt(); //本次测试的元素个数int []data = new int[m];int []hashtable = new int[m]; //存算出来的每个数字对于的哈希函数值:依次放入哈希表里的for(int i=0;i<m;i++){data[i]=sc.nextInt();//输入各个元素//题目要求采用的是哈希函数是取余法int num=0; //这个作用是解决产生的哈希冲突//首先用题目中给的哈希函数:除留取余法( H(key)=key%m )来计算每个数的哈希函数值//但是要解决哈希冲突的问题,就要加一个值// 此处就是解决哈希冲突(采用开放定址法中的线性探测再散列,即Hi=(H(key)+i)/%m,0<=i<=m-1)while(hashtable[(data[i]+num)%m]!=0){ //这里的作用就是:判断当前数算出的哈希值所处的位置:在原有的哈希表里是否已经存放了:其它与它相等哈希值的数,等于0就是代表哈希表当前位置还是初始化的0值num++;}//如果前面while满足,那就是要换哈希表里的其他位置,就要加一个1再取余去算是否在哈希表中还有元素占用了位置,若没有就直接放进哈希表对应的位置hashtable[(data[i]+num)%m]=data[i];}int value=sc.nextInt(); //输入要查的数的值//打印哈希表里从下标0开始的所有元素,和记录它要查的值与哈希表的相等的时候的下标int index = 0;for(int j=0;j<m;j++){System.out.print(hashtable[j]+" ");if(hashtable[j]==value){index=j; //找到要查找的元素下标}}System.out.println();System.out.print(index);k--;}}
}
四、不同情况的代码测试运行结果:
<1>首先是题目中的测试输入样例:(最好手打输入测试,直接复制可能格式问题导致报错!)
<2>其他测试: