哈希表(模板)

840. 模拟散列表 - AcWing题库

拉链法:

#include<bits/stdc++.h>
using namespace std;

const int N=1e5+3;//取第一个大于范围的质数,冲突最小

int h[N],idx,e[N],ne[N];//h存储下标,e存储值,ne[]指向头节点 
int d[N];


void insert(int x)
{   int k;
	k=(x%N+N)%N;//求模(要考虑负数)
	e[idx]=x;//赋值
	ne[idx]=h[k];//指向头节点,头插法 
	h[k]=idx++;//头节点变成idx  
	 
	 
}


bool find(int x)
{   int k;
	 k=(x%N+N)%N;
	 
	for(int i=h[k];i!=-1;i=ne[i]) 
	{
		if(e[i]==x) 
		{
		 return 1;
		 
		 
    	}
	    	
	 } 
	return 0;
	 
	 
} 



int  main()
{   
  int n;
  cin>>n;
  memset(h,-1,sizeof h);
  while(n--)
  {
  	string op;
  	int x;
  	cin>>op>>x;
  	if(op=="I")
  	{
  	  insert(x);	
	}
	else 
	{
		if(find(x)==1) cout<<"Yes"<<endl;
		else cout<<"No"<<endl;
	}
  }
  
}

开放寻址法:

#include<bits/stdc++.h>
using namespace std;

const int N=2e5+3;//取第一个大于范围的质数,冲突最小(开两倍)

int h[N];
int null=0x3f3f3f3f;

int find(int x)
{
    int k=(x%N+N)%N;
    while(h[k]!=null && h[k]!=x)//找到x所在位置或者如果想要插入应在的位置
    {
        k++;
        if(k==N)//如果到头就从头开始遍历 
        k=0;
    }
    return k;
}

int  main()
{   
  int n;
  cin>>n;
  memset(h,0x3f,sizeof h);
  while(n--)
  {
      string op;
      int x;
      cin>>op>>x;
      int k=find(x);
      if(op=="I")
      {
          h[k]=x;
      }
      else
      {
          if(h[k]==x )
          cout<<"Yes"<<endl;
          else cout<<"No"<<endl;
      }
  }
  
  
}

  • 9
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值