一、写在前面

哈希表(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);
     ;i<=n;++i)
     {
         int x;
         scanf("%d",&x);
         insert(x);
     }
     ;i<=m;++i)
     {
         int x;
         scanf("%d",&x);
         if(find(x))printf("YES");
         else       printf("NO");
         printf("\n");
     }
     ;
 } 

CodeVs1230 元素查找

弱弱地说一句,本蒟蒻码字也不容易,转载请注明出处http://www.cnblogs.com/Maki-Nishikino/p/5999356.html

【哈希表】CodeVs1230元素查找的更多相关文章

  1. codevs1230 元素查找

    1230 元素查找  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题解       题目描述 Description 给出n个正整数,然后有m个询问,每 ...

  2. 【哈希表】CODEVS1230 元素查找

    #include<cstdio> #include<vector> using namespace std; typedef vector<int>::iterat ...

  3. 理解Golang哈希表Map的元素

    目录 概述 哈希函数 冲突解决 初始化 结构体 字面量 运行时 操作 访问 写入 扩容 删除 总结 在上一节中我们介绍了 数组和切片的实现原理,这一节会介绍 Golang 中的另一个集合元素 - 哈希 ...

  4. 查找-&gt;动态查找表-&gt;哈希表

    文字描述 哈希表定义 在前面讨论的各种查找算法中,都是建立在“比较”的基础上.记录的关键字和记录在结构中的相对位置不存在确定的关系,查找的效率依赖于查找过程中所进行的比较次数.而理想的情况是希望不经过 ...

  5. 【ZZ】详解哈希表的查找

    详解哈希表的查找 https://mp.weixin.qq.com/s/j2j9gS62L-mmOH4p89OTKQ 详解哈希表的查找 2018-03-01 算法与数据结构 来自:静默虚空 http: ...

  6. Java基础知识强化之集合框架笔记75:哈希表

    1. 哈希表数据结构(数组): 2. 哈希表确定元素是否相同: (1)判断的是两个元素的哈希值是否相同                     如果相同,再判断两个对象内容是否相同 (2)判断哈希值相 ...

  7. C#中哈希表与List的比较

    简单概念 在c#中,List是顺序线性表(非链表),用一组地址连续的存储单元依次存储数据元素的线性结构. 哈希表也叫散列表,是一种通过把关键码值映射到表中一个位置来访问记录的数据结构.c#中的哈希表有 ...

  8. 数据结构 链式哈希表(Hash Table)的接口定义与实现分析(完整代码)

    链式哈希表的接口定义 关于哈希表与链式哈希表的描述可以参阅:http://www.cnblogs.com/idreamo/p/7990860.html 链式哈希表的操作与属性有:初始化.销毁.插入元素 ...

  9. 开地址哈希表(Hash Table)的接口定义与实现分析

    开地址哈希函数的接口定义 基本的操作包括:初始化开地址哈希表.销毁开地址哈希表.插入元素.删除元素.查找元素.获取元素个数. 各种操作的定义如下: ohtbl_init int ohtbl_init ...

随机推荐

  1. 【bzoj1588】 HNOI2002—营业额统计

    http://www.lydsy.com/JudgeOnline/problem.php?id=1588 (题目链接) 题意 给出一个序列,对于每一个数,找出之前与它相差最小的数,两者相减取绝对值加入 ...

  2. DataTable排序的一般方法

    一.重生法dstaset.Tables.Add(dt)dataset.Tables(0).DefaultView.Sort = "id desc" 二.直接法dv = New Da ...

  3. php取整的几种方法

    php取整的几种方式. floor 舍去法取整 语法格式:float floor ( float value )返回不大于value 的下一个整数,将value 的小数部分舍去取整.floor() 返 ...

  4. 通过并行 提高批量审核PDF性能

    上一篇文章提到了 通过 iTextSharp 实现PDF 审核盖章 ,如果当需要一次审核大批量的PDF我们如何来提高程序的性能呢? 下面我们通过并行计算来提升性能. 首先是一个审核PDF的方法 pub ...

  5. C# WinForm中实现CheckBox全选反选功能

    今天一群里有人问到这个功能,其实应该挺简单,但提问题的人问题的出发点并没有描述清楚.因此,一个简简单单的需求,就引起了群内热烈的讨论.下面看看这个功能如何去实现,先上效果: 下面直接上代码,请不要在意 ...

  6. C# 文件上传(可以多文件上传)

    一.前端搭建 1.前端用到js:uploadify(下载地址:http://www.uploadify.com/download/).layer (下载地址:http://layer.layui.co ...

  7. Echarts数据可视化series-heatmap热力图,开发全解+完美注释

    全栈工程师开发手册 (作者:栾鹏) Echarts数据可视化开发代码注释全解 Echarts数据可视化开发参数配置全解 6大公共组件详解(点击进入): title详解. tooltip详解.toolb ...

  8. Java进阶(三)Java安全通信:HTTPS与SSL

    通过一个系统,接触到了Java安全机制,故作一小节,供朋友们参考学习. 1. HTTPS概念 1)简介 HTTPS(全称:Hypertext Transfer Protocol over Secure ...

  9. 在Bootstrap开发框架中使用dataTable直接录入表格行数据

    在Winform开发的时候,我们很多时候可以利用表格控件来直接录入数据,不过在Web上较少看到,其实也可以利用dataTable对象处理直接录入表格行数据,这个可以提高数据的录入方便,特别是在一些简单 ...

  10. wordpress使用阿里云邮件推送服务实现发送邮件

    之前用腾迅云时,配置了wordpress是可以使用邮件服务的,然而到了阿里云,却无法使用了,有人说是因为阿里云关了25端口,但腾迅好像也关了. 百度看看有没有其他方法,最终让我找到个方法,可惜不是很完 ...