本题考查
二次探查
思路
只要弄明白什么是二次探察就很简单
二次探察:
二尺探查属于开放定址法,开放定址法与二次探察一般公式如下:
注意,一般新建哈希表都会指定哈希表的长度,并且该长度最好是质数
注意,判断质数的函数循环一定是for(int i = 2 ; i <= Math.sqrt(num) ; i++)
不是for(int i = 2 ; i < Math.sqrt(num) + 1; i++)
代码
import java.util.Scanner;
public class Main {
static boolean isPrime(int num) {
if(num < 2) return false;
for(int i = 2 ; i <= Math.sqrt(num) ; i++)
if(num % i == 0)
return false;
return true;
}
static int getPrime(int size) {
while(!isPrime(size)) size++;
return size;
}
static int hash(int key, int d, int size) {
return (key + d*d) % size;
}
public static void main(String[] args) {
Scanner scaner = new Scanner(System.in);
int size = getPrime(scaner.nextInt());
int round = scaner.nextInt();
int check = scaner.nextInt();
int[] hashTable = new int[size];
for (int i = 0; i < round; i++) {
int temp = scaner.nextInt();
for(int d = 0 ; d <= size ; d++) {
if(hashTable[hash(temp, d, size)] == 0) {
hashTable[hash(temp, d, size)] = temp;
break;
}
if(d == size) System.out.println(temp+" cannot be inserted.");
}
}
int totalTime = 0;
for (int i = 0; i < check; i++) {
int temp = scaner.nextInt();
for(int d = 0 ; d <= size ; d++) {
totalTime++;
if(hashTable[hash(temp, d, size)] == temp || hashTable[hash(temp, d, size)] == 0)
break;
}
}
scaner.close();
System.out.println(String.format("%.1f", (float)totalTime/check));
}
}