复习数据结构知识,用数组模拟哈希表。核心code根据算法很好写,主要是memset等处理要注意。
想法:后期看算法思想
一、开放定址法
算法思想:找要存储的位置,遇到冲突往后找,直到找到位置k。
核心代码:
int find(int x) //输入:x数值
{
int k = (x % N + N) % N; //存在负数,所以后面 +完N 再modN
while (a[k] != null && a[k] != x) k = (k + 1) % N;
return k; //k表示查找的位置,也可以为要插入的位置(一个意思)
}
完整:
#include<iostream>
#include <cstring>
using namespace std;
const int N = 2e5 + 3, null = 0x3f3f3f3f, M = 2e5;
int a[N];
//开放寻址法
int find(int x)
{
int k = (x % N + N) % N;
while (a[k] != null && a[k] != x) k = (k + 1) % N;
return k;
}
int main()
{
int n;
cin >> n;
memset(a, 0x3f, sizeof a);
while(n--)
{
char ch;
int x;
cin >> ch >> x;
if (ch == 'I') a[find(x)] = x;
else if (ch == 'Q')
{
if (a[find(x)] != null) cout << "Yes" <<endl;
else cout << "No" << endl;
}
}
return 0;
}
二、拉链法
算法思想:在每个数组槽的下面拉一个链表(可以用数组模拟),类似邻接表
核心code:
//拉链法
void insert(int x)
{
int k = (x % N + N) % N;
e[ids] = x;
ne[ids] = h[k];
h[k] = ids++;
}
int query(int x)
{
int k = (x % N + N) % N;
for(int i = h[k]; i != -1; i = ne[i])
{
if (e[i] == x)
return 1;
}
return 0;
}
完整:
#include<iostream>
#include <cstring>
using namespace std;
const int N = 1e5 + 3;
int h[N], e[N], ne[N], ids;
//拉链法
void insert(int x)
{
int k = (x % N + N) % N;
e[ids] = x;
ne[ids] = h[k];
h[k] = ids++;
}
int query(int x)
{
int 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--)
{
char ch;int x;
cin >> ch >> x;
if (ch == 'I') insert(x);
else
{
if (query(x)) cout << "Yes" << endl;
else cout << "No" << endl;
}
}
return 0;
}
复习:(求i之后的第一个素数,如:2e5后的第一个素数2e5+3)
for(int i = M;;i++)
{
bool flag = true;
for (int j = 2; j * j <= i; j++)
{
if (i % j == 0)
{
flag = false;
break;
}
}
if (flag)
{
cout<<i;
break;
}
}