存储结构:
开放寻址法
添加:从第k个开始,找到第一个非空(坑位)
查找:从第k个开始,如果当前坑位有人且不是x,看下一个坑位;若没有人,说明x不存在
删除:做一个特殊标记
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 200010;
const int null = 0xefefefef;
int n, x;
string op;
int h[N];
int find(int x)
{
int k = (x % N + N) % N;
int i;
for (i = k; h[i] != null && h[i] != x; i ++)
{
if (i == N)
i = 0;
}
return i;
}
int main()
{
memset(h, 0xef, sizeof h);
cin >> n;
while (n -- )
{
cin >> op >> x;
if (op == "I")
{
h[find(x)] = x;
}
else
{
if (h[find(x)] != null)
cout << "Yes" << endl;
else
cout << "No" << endl;
}
}
return 0;
}
拉链法
解决冲突的方法:
h(11) = 3
h(23) = 3
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 100003;
int h[N], e[N], ne[N], idx;
string op;
int n, k;
void insert(int x)
{
int k = (x % N + N) % N;
e[idx] = x;
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()
{
memset(h, -1, sizeof h);
cin >> n;
while (n -- )
{
cin >> op >> k;
if (op == "I")
insert(k);
else{
if (find(k)) cout << "Yes" << endl;
else cout << "No" << endl;
}
}
}
字符串哈希方式
将字符串看成一个p进制的数
①不能映射成0
②如果不存在冲突
已知从1到l - 1, 从1到R的哈希值,求l到r的哈希值
需要对齐?
区间和公式 h[l,r]=h[r]−h[l−1]×Pr−l+1
区间和公式的理解: ABCDE 与 ABC 的前三个字符值是一样,只差两位,
乘上 P2 把 ABC 变为 ABC00,再用 ABCDE - ABC00 得到 DE 的哈希值。