题目:
哈希查找
标准输入输出
题目描述:
实现哈希查找。要求根据给定的哈希函数进行存储,并查找相应元素的存储位置。本题目使用的哈希函数为除留取余法,即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
代码:
采用开放寻址法,线性探测
不理解开放寻址法的可以看一下我的博客:模拟散列表(哈希表的两种方法)
import java.util.Scanner;public class Xingyuxingxi {public static void main(String[] args){Scanner sc=new Scanner(System.in);int a= sc.nextInt();while(a--!=0) {int m = sc.nextInt();int[] c = new int[m];int[] g = new int[m];int n = 0;for (int i = 0; i < m; i++) {c[i] = sc.nextInt();int k = c[i] % m ;//注意是key%m即可while (g[k] != c[i] && g[k] != 0) {k++;if (k == m) k = 0;}g[k] = c[i];}int d = sc.nextInt();int xb=0;for (int i = 0; i <m; i++) {System.out.print(g[i] + " ");if (g[i] == d) {xb = i;}}System.out.println();System.out.println(xb);}}
}