拉链法
开放寻址法采用hash函数找到在hash数组中对应的位置,如果该位置上有值,并且这个值不是寻址的值,则出现冲突碰撞,需要解决冲突方案,该算法采用链表的形式,一直往下拉
开放寻址法
开放寻址法采用hash函数找到在hash数组中对应的位置,如果该位置上有值,并且这个值不是寻址的值,则出现冲突碰撞,需要解决冲突方案,该算法采用简单的向右继续寻址来解决问题。
拉链法
import java.util.Scanner;
public class Main {
//N:操作数量 , h[N]:拉链数组 , e[N]:地址为N的数值 , ne[N]:地址为N的下一个节点地址,index:节点地址
static int N=100003; static int index=1;
static int []h=new int[N];
static int []e=new int[N]; static int []ne=new int[N];
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n= sc.nextInt();
while (n-->0) {
String s=sc.next();
int c=sc.nextInt();
if(s.equals("I")){
insert(c);
}else {
if(query(c)){
System.out.println("Yes");
}else System.out.println("No");
}
}
}
private static void insert(int x) {
int n=(x%N+N)%N; //+N余N是为了防止取余的结果为负数
e[index]=x;
ne[index]=h[n];
h[n]=index++;
}
private static boolean query(int x) {
int n=(x%N+N)%N;
for(int i=h[n];i!=0;i=ne[i]){
if(e[i]==x) return true;
}
return false;
}
}
开放寻址法
import java.util.*;
public class Main{
private static int N = 200003;
//因为要用null标识节点空,所以类型为Integer
private static Integer[] a = new Integer[N];
public static int find(int x){
int k = (x % N + N) % N;
//别忘了第二个已存在的条件
while(a[k] != null && a[k] != x){
k++;
if(k == N){
k = 0;
}
}
return k;
}
public static void main(String[] args){
//先将所有位置设为null,标识为空
Arrays.fill(a,null);
Scanner scanner = new Scanner(System.in);
int m = scanner.nextInt();
while(m-- > 0){
String opt = scanner.next();
int x = scanner.nextInt();
if("I".equals(opt)){
a[find(x)] = x;
}else{
//这是比较的是a[find(x)]
System.out.println(a[find(x)] == null ? "No" : "Yes");
}
}
}
}
感谢你能看完,希望对你有帮助 ,如有错误欢迎指正,码字不易,给个赞呗