AcWing 840. 模拟散列表(散列hash)

Posted MangataTS

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AcWing 840. 模拟散列表(散列hash)相关的知识,希望对你有一定的参考价值。

题目连接

https://www.acwing.com/problem/content/description/842/

思路

使用开放寻址法,思路大概是这样我们讲要查询的数模上一个大于n的质数,然后这表示它呗映射到了哪个坑位,如果这个坑位有人的话,那么我们就往下走(假设这些坑位是一个环状),因为我们的坑位数是大于我们要映射的数的,所以不会死循环,这个算法的期望复杂度是O(1)的,但是随着我们映射关系的增加这个常数会变得很大的

代码

#include<bits/stdc++.h>
using namespace std;
//----------------自定义部分----------------
#define ll long long
#define mod 1000000007
#define endl "\\n"
#define PII pair<int,int>

int dx[4]=0,-1,0,1,dy[4]=-1,0,1,0;

ll ksm(ll a,ll b) 
	ll ans = 1;
	for(;b;b>>=1LL) 
		if(b & 1) ans = ans * a % mod;
		a = a * a % mod;
	
	return ans;


ll lowbit(ll x)return -x & x;

const int N = 200003;
//----------------自定义部分----------------
int n,m,q,a[N],null=0x3f3f3f3f;

int find(int x)
	int t = (x%N+N)%N;
	while(a[t] != null && a[t] != x)
		t=(t+1)%N;
	
	return t;


int main()

	std::ios::sync_with_stdio(false);
	std::cin.tie(nullptr);
	std::cout.tie(nullptr);
	cin>>n;
	memset(a,0x3f,sizeof a);
	string op;
	int x;
	for(int i = 1;i <= n; ++i) 
		cin>>op>>x;
		int t = find(x);
		if(op == "I") a[t] = x;
		else
			if(a[t] == x) cout<<"Yes"<<endl;
			else cout<<"No"<<endl;
		
	
	return 0;

以上是关于AcWing 840. 模拟散列表(散列hash)的主要内容,如果未能解决你的问题,请参考以下文章

840. 模拟散列表

散列表常见散列函数及处理冲突的方法

Algorithms - Data Structure - Perfect Hashing - 完全散列

Algorithms - Data Structure - Perfect Hashing - 完全散列

hash算法原理详解

C语言手撕一个Hash表(HashTable)