1233: 散列查找
时间限制: 1 Sec 内存限制: 128 MB
提交: 92 解决: 20
[提交] [状态] [讨论版] [命题人:外部导入]
题目描述
这个问题的任务很简单:在散列表中插入一系列不同的正整数,并输出数字在散列表中的位置。
散列函数定义为:H(key) = (key + di2) % TSize(di = 0, 1, …… , TSize - 1), TSize表示散列表的最大大小,采用了二次探测法来处理冲突。
输入
第一行包含两个正整数m(m <= 1009)和n(n <= m), 分别表示散列表的大小和要输入的数字个数,保证m是一个素数。接下来n行每行一个不同的正整数x(x <= 10000),表示要插入散列表的数。
输出
输出共n行,每行一个数字表示在散列表中的位置(下标从0开始), 如果无法插入就输出"-1"。
样例输入 Copy
5 4 10 6 4 15
样例输出 Copy
0 1 4 -1
import java.util.Scanner;
//1233
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int m = scanner.nextInt(); // 散列表的大小
int n = scanner.nextInt(); // 要输入的数字个数
int[] hashTable = new int[m]; // 散列表
for (int i = 0; i < m; i++) {
hashTable[i] = -1; // 初始化散列表,-1 表示空位置
}
for (int i = 0; i < n; i++) {
int x = scanner.nextInt(); // 输入要插入散列表的数
int index = insertIntoHashTable(hashTable, x, m);
System.out.println(index);
}
}
// 散列函数
private static int hashFunction(int key, int di, int tSize) {
return (key + di * di) % tSize;
}
// 插入元素到散列表
private static int insertIntoHashTable(int[] hashTable, int key, int tSize) {
for (int i = 0; i < tSize; i++) {
int index = hashFunction(key, i, tSize);
if (hashTable[index] == -1) {
hashTable[index] = key;
return index;
}
}
return -1;
}
}