[Codevs 1230]元素查找(手写哈希表)
来源:互联网 发布:淘宝延长收货怎么操作 编辑:程序博客网 时间:2024/06/04 23:30
题目连接:http://codevs.cn/problem/1230/
说白了就是要我们自己手写一个哈希表的数据结构来实现添加和查找功能,map也能直接过(我第一次写就是用map骗AC的)
提一下个人理解的哈希表的实现(下面说的是线性寻址法),如果有误还请各位大神不吝指教
用一个数组模拟哈希表,函数f(x)=数字x在哈希表中出现的下标的最小可能值,一般f(x)=x mod t,t就是哈希表的长度
下面就是一个哈希表的示例,如果遍历哈希表时指针走出了哈希表的终点,就进入起点重新遍历
对于每次向哈希表中添加一个数x,从下标f(x)开始查找,以上文所说的遍历方式查找,直到找到装有x这个数的哈希表元素,返回查找成功(哈希表中有x这个数)。如果遍历过程中遇到了空的哈希表的一个元素就返回查找失败(哈希表中没有x这个数)。
插入元素的过程类似于查找,向哈希表中插入数字x时,首先从下标f(x)开始查找,直到找到第一个为0的哈希表元素,将数字x插入进去。
下面是此题代码:
#include <iostream>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <algorithm>#define MAXN 1000008#define MOD 1000007using namespace std;int hashTable[MAXN];void update(int x) //将数字x加入哈希表{ int num=x; x%=MOD; while(1) { if(!hashTable[x]) { hashTable[x]=num; return; } if(hashTable[x]!=num) { x++; if(x==MAXN) x=0; } else return; }}bool query(int x) //查找哈希表中是否有数字x{ bool found=false; int num=x; x%=MOD; while(1) { if(!hashTable[x]) return false; if(hashTable[x]!=num) { x++; if(x==MAXN) x=0; } else return true; }}int main(){ int n,m,x; scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) { scanf("%d",&x); update(x+1); } for(int i=1;i<=m;i++) { scanf("%d",&x); if(query(x+1)) printf("YES\n"); else printf("NO\n"); } return 0;}
0 0
- [Codevs 1230]元素查找(手写哈希表)
- 【CODEVS 1230】元素查找 哈希表
- CODEVS 1230 元素查找
- CODEVS 1230元素查找
- CODEVS 1230 元素查找
- 【codevs 1230】元素查找
- CODEVS 1230 元素查找
- CODEVS 1230 元素查找
- codevs 1230 元素查找(hash)
- codevs 1230 元素查找 二分
- 【codevs 1230】元素查找 splay……
- codevs 1230 元素查找(hash)
- codevs 1230_元素查找_hash
- 1230 元素查找
- 手写二分查找
- 手写BST插入查找删除
- 【codevs】1729 单词查找树
- 查找元素
- CSS页面布局基础4——元素可见性、溢出和元素重叠问题
- BEGINNING SHAREPOINT® 2013 DEVELOPMENT 第9章节--客户端对象模型和REST APIs概览 REST和ODATA
- 第二章线性表知识导图
- sql中的split方法
- 用C实现链表的初始化,以及在表头插入节点,以及遍历整个列表
- [Codevs 1230]元素查找(手写哈希表)
- MsSqlServer
- C语言中函数和指针的参数传递
- AS3中的数组与js中数组的区别
- 反序输出一个int型数组中所有数组元素(数字或字符)的值
- spring中的scope详解
- 微信联合登录全攻略,早期测试用户的详尽经验总结!
- 递归函数与栈的变化
- 凤凰网魔漫相机成名史