- 1. 题目
- 2. 读题(需要重点注意的东西)
- 3. 解法
- 4. 可能有帮助的前置习题
- 5. 所用到的数据结构与算法思想
- 6. 总结
思路:开放寻址法
3. 解法注:
find(int x)的作用是:
如果x在哈希表中存在,那么返回x在哈希表中的位置;
如果x在哈希表中不存在,那么应该返回它应该在哈希表中存储的位置。
---------------------------------------------------解法---------------------------------------------------
#include#include using namespace std; const int N = 200003, null = 0x3f3f3f3f; int h[N]; // h表示的就是哈希表 int find(int x) { // 为什么要模N加N后再模N? // 为的是将余数变成正数 int t = (x % N + N) % N; while (h[t] != null && h[t] != x) { t ++ ; if (t == N) t = 0; // 到结尾后自动循环到开头 } return t; // 如果这个位置为空,返回它;如果这个位置就是x,返回它 } int main() { // memset函数在#include 头文件中 memset(h, 0x3f, sizeof h); // 对哈希表初始化 int n; scanf("%d", &n); while (n -- ) { char op[2]; int x; scanf("%s%d", op, &x); if (*op == 'I') h[find(x)] = x; else { if (h[find(x)] == null) puts("No"); else puts("Yes"); } } return 0; }
可能存在的问题
- 为什么N取200003
一般要开给定长度的2~3倍,这样几乎不会产生冲突。 - 0x3f3f3f3f是什么意思?
0x3f3f3f3f是一个16进制数,转换成10进制为1061109567,它是一个大于10^9 的数,在题目中一般限制数的范围在-10^9 到 正的10^9,因此它可以当成无穷大来使用。 - memset(h, 0x3f, sizeof h);该函数的作用是对哈希表初始化,在头文件#include< cstring >中。
哈希表的开放寻址法存储,用数组实现的模板题,推荐完全背下来。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)