模拟散列表(哈希表实现)

原题链接:840. 模拟散列表 - AcWing题库

拉链法

#include 
#include 
using namespace std;
const int N = 100003;
int h[N], e[N], ne[N],idx;  // e[N]表示当前节点存储的值,ne[N]表示下一个节点的位置,h[N]表示
void insert(int x)
{
	int k = (x % N + N) % N;  // 哈希函数
	ne[idx] = h[k];
	h[k] = idx++;
}
bool find(int x){
	int k = (x % N + N) % N;
	for (int i = h[k]; i != -1; i = ne[i])
		if (e[i] == x)	return true;
	return false;
}
int main()
{
	int n;
	scanf("%d", &n);
	memset(h, -1, sizeof h);
	while (n--)
	{
		char op[2];
		int x;
		scanf("%s%d",op, &x);
		if (*op == 'I') insert(x);
		else
		{
			if (find(x)) puts("Yes");
			else puts("No");
		}
	}
	return 0;
}

开放寻址法 

#include
#include
using namespace std;
const int N = 200003, null = 0x3f3f3f;
int h[N];
int find(int x)
{
	int k = (x % N + N) % N;
	while (h[k] != null && h[k] != x)
	{
		k++;
		if (k == N) k = 0;
	}
	return k;
}
int main()
{
	int n;
	scanf("%d", &n);
	memset(h, 0x3f, sizeof h);
	while (n--)
	{
		char op[2];
		int x;
		scanf("%s%d",op, &x);
		int k = find(x);
		if (*op == 'I') h[k] = x;
		else
		{
			if (h[k]!=null) puts("Yes");
			else puts("No");
		}
	}
	return 0;
}

你可能感兴趣的:(数据结构与算法,散列表,数据结构)