【哈希表】CodeVs1230元素查找
一、写在前面
哈希表(Hash Table),又称散列表,是一种可以快速处理插入和查询操作的数据结构。哈希表体现着函数映射的思想,它将数据与其存储位置通过某种函数联系起来,其在查询时的高效性也体现在这里。换言之,我们建立一个函数关系(称之为散列函数):data—>address,将数据和其存储位置关联;查询时,我们只需要根据我们建立的函数关系就能通过data查询到address。
可见,散列函数的建立直接影响着哈希表的效率。当我们的散列函数建立得足够优时,哈希表在插入和查询上的时间复杂度都能被降为O(1)。常用的建立散列函数的方法有如下几种:
1、直接寻址法:直接取数据或数据的某种线性函数作为散列函数;
2、平方取中法:对数据平方,取其中间几位作为散列函数;
3、折叠法:将数据拆开成几部分,再重新组合;
4、除留取余法:用数据对一个大质数取模,将余数作为散列函数。
本篇blog采用除留取余法建立散列函数。
显然,由于函数是一种允许多个自变量对应同一应变量的关系,在插入和查询时,存储位置的冲突便不可避免。当发生冲突时,我们通常用以下两种方法解决:
1、错位法:即当正在读入的数据与以前已经插入表中的数据冲突时,我们从发生冲突的存储位置开始向某个方向寻找一个空存储位置,将当前读入的数据插入其中;
2、拉链法:结合链表的思想,将所有相互发生冲突的数据拉成一条链。
哈希表的优点很明显,就是它在插入和查询室常数级别的时间复杂度。然而它的缺点也很明显,包括无法存储相同的元素,无法排序,而且极占用空间。所以想要熟练运用哈希表也不是一件容易的事情,下面我们不妨看一道模板题。
二、题目
Description
给出n个正整数,然后有m个询问,每个询问一个整数,询问该整数是否在n个正整数中出现过。
Input Description
第一行两个整数 n 和m。
第二行n个正整数(1<=n<= 100000)
第三行m个整数(1<=m<=100000)
Output Description
一共m行,若出现则输出YES,否则输出NO
Sample Input
4 2
2 1 3 4
1 9
Sample Output
YES
NO
Data Size & Hint
所有数据都不超过10^8
附上原题链接→_→|1230 元素查找|CODEVS,算法爱好者社区
三、代码实现
#include<stdio.h>
#define MAX 100010
#define p 10000007
int n,m;
struct node
{
int next;
int data;
};
int st[p],cnt;
node tab[MAX];
int ans;
int getHashAddress(int x){return x%p;}//散列函数
void insert(int x)//插入元素
{
int address=getHashAddress(x);
for(int i=st[address];i;i=tab[i].next)//判断元素是否在表中
if(tab[i].data==x)return;
tab[++cnt].next=st[address];//拉链
st[address]=cnt;
tab[cnt].data=x;
}
bool find(int x)//查询元素
{
int address=getHashAddress(x);
for(int i=st[address];i;i=tab[i].next)
if(tab[i].data==x)return true;
return false;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;++i)
{
int x;
scanf("%d",&x);
insert(x);
}
for(int i=;i<=m;++i)
{
int x;
scanf("%d",&x);
if(find(x))printf("YES");
else printf("NO");
printf("\n");
}
return ;
}
CodeVs1230 元素查找
弱弱地说一句,本蒟蒻码字也不容易,转载请注明出处http://www.cnblogs.com/Maki-Nishikino/p/5999356.html
【哈希表】CodeVs1230元素查找的更多相关文章
- codevs1230 元素查找
1230 元素查找 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 题目描述 Description 给出n个正整数,然后有m个询问,每 ...
- codevs1230元素查找(hash)
1230 元素查找 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 给出n个正整数,然后有m个询问,每个询问一个 ...
- 【哈希表】CODEVS1230 元素查找
#include<cstdio> #include<vector> using namespace std; typedef vector<int>::iterat ...
- 理解Golang哈希表Map的元素
目录 概述 哈希函数 冲突解决 初始化 结构体 字面量 运行时 操作 访问 写入 扩容 删除 总结 在上一节中我们介绍了 数组和切片的实现原理,这一节会介绍 Golang 中的另一个集合元素 - 哈希 ...
- 查找->动态查找表->哈希表
文字描述 哈希表定义 在前面讨论的各种查找算法中,都是建立在“比较”的基础上.记录的关键字和记录在结构中的相对位置不存在确定的关系,查找的效率依赖于查找过程中所进行的比较次数.而理想的情况是希望不经过 ...
- 【ZZ】详解哈希表的查找
详解哈希表的查找 https://mp.weixin.qq.com/s/j2j9gS62L-mmOH4p89OTKQ 详解哈希表的查找 2018-03-01 算法与数据结构 来自:静默虚空 http: ...
- SDUT 3377 数据结构实验之查找五:平方之哈希表
数据结构实验之查找五:平方之哈希表 Time Limit: 400MS Memory Limit: 65536KB Submit Statistic Problem Description 给定的一组 ...
- SDUT-3377_数据结构实验之查找五:平方之哈希表
数据结构实验之查找五:平方之哈希表 Time Limit: 400 ms Memory Limit: 65536 KiB Problem Description 给定的一组无重复数据的正整数,根据给定 ...
- Java基础知识强化之集合框架笔记75:哈希表
1. 哈希表数据结构(数组): 2. 哈希表确定元素是否相同: (1)判断的是两个元素的哈希值是否相同 如果相同,再判断两个对象内容是否相同 (2)判断哈希值相 ...
随机推荐
- 《Linux及安全》实践3.2
Login程序破解 一.掌握基本的汇编指令机器码 nop=空指令( 机器码90) JNE = 如果不相等就跳转机器码75) JE = 如果相等就跳转机器码74) JMP = 无条件跳转机器码EB) C ...
- 查看apache、linux、kernel、nginx等版本
查看apache版本 /usr/sbin/apachectl -v httpd -v 安装目录,使用apachectl -v 查看mysql版本 mysql –help | grep Distri ...
- SpringMVC原理解析-DispatcherServlet初始化以及请求处理过程
- Android四大组件之Activity
实验内容 了解Activity的四个状态 Activity的生命周期 启动另外一个Activity 实验要求 编码实现观察Activity的生命周期函数执行过程 编码实现启动另外一个Activity ...
- 闲说HeartBeat心跳包和TCP协议的KeepAlive机制
很多应用层协议都有HeartBeat机制,通常是客户端每隔一小段时间向服务器发送一个数据包,通知服务器自己仍然在线,并传输一些可能必要的数据.使用心跳包的典型协议是IM,比如QQ/MSN/飞信等协议. ...
- JAVA静态代码审查之checkstyle
技术总监来巡查,刚巧前段时间遇到了一个问题还没解决,就拉着大牛开问.结果,问题是解决了,还附带了另一个问题,或是要求出来,没啥技术含量,但是很麻烦的一个东西:代码格式. 之前我写代码,因为屏幕比较小, ...
- 关于ssh_copy_id脚本解析
[oldgirl@module ~]$ more /usr/bin/ssh-copy-id #!/bin/sh # Shell script to install your public key on ...
- ASPX开发基础
ASP.NET:.net开发网站应用程序的技术总称,分为WebForm和MVC 表单元素: 文本类:(1)<input type=“text”/> 文本框 (2)<input typ ...
- c++减法高精度算法
c++高精度算法,对于新手来说还是一大挑战,只要克服它,你就开启了编程的新篇章,算法. 我发的这个代码并不是很好,占用内存很多而且运行时间很长(不超过0.02秒),但是很好理解,很适合新手 高精算法的 ...
- SetSysColors 修改系统颜色
首先我们来看一下SetSysColors函数的原型: BOOL WINAPI SetSysColors( __in int cElements, //要改变的对象的数量 __in const INT* ...