哈希表,又叫散列表,它可以提供快速的插入查找操作,对于大规模数据的查找时间空间效率会很高。哈希表构造方式有多种,其中取余法在比赛中最常用。

如果读入很多值非常大的数,让你判断一些数是否出现过。如果用桶来记录,空间开不了那么大。如果排序后来查,时间效率又低。但可以通过hash优化解决这个问题。

取余法简单地说,就是给每个数mod一个合适的值X,得到的余数放在数组中下标与其一致的位置,由于X不会很大,且余数不会超过数X,数组的大小在0..X-1范围内,不会超空间,如果查某个数,将这个数mod X后在直接在数组中找到。

但是这样一些不同数据会出现在同一个地址上,比如说X=5,13 mod X=3,18 mod 5=3,这两个数(13,18)便产生了冲突。

为了解决冲突,可以使用挂链的形式,将冲突数据像挂链一样挂在同一位置,将13放在5的位置,将18挂在13后面,如果要查18,先18 mod 5=3 找到3的位置,先看3位置挂链上的第一个数是13,不等于18,继续往后面找,直到找到18,如果找不到,说明没有出现,按要求输出即可。我们可以发现,这样的存储方式很像(或者就是)链表的存储方式,所以我们可以使用链表来处理“挂链”的部分。这样查找的问题就解决了。

经分析可以得知,hash表查找时间最好为O(1),最差为O(n),由于O(n)情况对于比赛的数据一般不会出现,如果选择了合适的X值,时间效率会非常好。

如何选择X值呢,通常是选一个较大但不会使数组超空间的质数。

具体实现:

初始化

typehash=^node;node=recorddx:int64;next:hash;end;        

View Code

插入操作

procedure put(x:int64);
var q:hash;xx:int64;
beginxx:=x mod maxn;//maxn就是那个适当的正整数Xnew(q);q^.dx:=x; q^.next:=a[xx];a[xx]:=q;
end;          

View Code

查找操作

function find(x:int64):boolean;
var p:hash;
beginxx:=x mod maxn;new(p);p:=a[xx];while p<>nil dobeginif p^.dx=x then exit(true);p:=p^.next;end;exit(false);
end;          

View Code

转载于:https://www.cnblogs.com/qtyytq/p/4265759.html

哈希表的实现(取余法)相关推荐

  1. 哈希表除留取余法的桶个数为什么是质数

    可先科普下质数的概念:质数,也就是素数,就是指一个大于1的自然数,约数(因数)只有1和它自己,否则叫合数. 除留取余,就是哈希函数将关键字被某个不大于哈希表长m的数p除后所得余数为哈希地址.这是最常用 ...

  2. 哈希--直接定值法和除留取余法

    1. 哈希是一种算法,哈希表是用哈希算法构造出来的一种数据结构 2. 哈希算方法的几种方法 直接定值法 这里有一个例题,就是我们想判断某一字符串中,某一个字符出现的个数,我们可以使用哈希的思想,就是可 ...

  3. (C++)1022 D进制的A+B 除基取余法将10进制数换成给定进制数

    #include<cstdio> //除基取余法 const int M = 30;int main(){long long a,b,c;int D,ans[M+2];scanf(&quo ...

  4. 【数据结构】人名查询哈希表设计(链地址法)

    文章目录 核心代码 链表节点定义 链地址法处理冲突 查询函数 完整代码下载 核心代码 哈希表使用「链地址法」解决地址冲突的方式,其数据结构就采用 数组+链表 ,数组的每一个元素都是一个链表节点,当地址 ...

  5. 进制转换之十进制转换为D进制——整数部分除基取余法

    将十进制x转换为D进制的y: [方法]:整数采用"除基取余法",小数采用"乘基取整法" [推导]:以三位D进制为例,假设y的各位是a1a2a3 y = a 1 ...

  6. (C++)除基取余法:将十进制数转化为Q进制数

    所谓基,就是指将要转换成的进制Q. 除基取余的意思就是:每次将待转换数除以Q,然后将得到的余数作为低位存储,而商则继续除以Q并重复上面的操作,直至商0时,将所有位从高到低输出就可以得到Q进制数. 代码 ...

  7. 十进制转二进制(除2取余法)

    转载链接: https://baike.baidu.com/item/%E5%8D%81%E8%BF%9B%E5%88%B6%E8%BD%AC%E4%BA%8C%E8%BF%9B%E5%88%B6

  8. 什么是哈希,哈希表,哈希函数,哈希碰撞?

    什么是哈希? 比方我有个原始值,S=["老铁双击666",'感谢老铁送的飞机'], 通过某种算法(比如java的hasecode(获得变量的物理地址))得到的666这个就是&quo ...

  9. 哈希表(闭散列、拉链法--哈希桶)

    哈希表,也称散列表,是一种通过key值来直接访问在内存中的存储的数据结构.它通过一个关键值的函数(被称为散列函数)将所需的数据映射到表中的位置来访问数据. 关于哈希表,主要为以下几个方面: 一.哈希表 ...

最新文章

  1. BZOJ3123: [Sdoi2013]森林
  2. 字符串暴力匹配算法+思路分析
  3. pytorch dataset读取数据流程_高效 PyTorch :如何消除训练瓶颈
  4. 创建自定义主机头的网站集
  5. CentOS安装zip及用法
  6. 天下数据服务器搭建网站,王者天下架设教程1-服务端配置.doc
  7. UTF-8转码GBK
  8. mysql完全卸载教程(图文详细)
  9. Scan2CAD pro中文版
  10. 分区助手扩大c盘后自动修复_分区助手怎么扩大C盘?分区助手扩大C盘的方法
  11. WARNING: We noticed you're using the `useBuiltIns` option without declaring a core-js version.
  12. 初识 PS CS6(十三)___用快速选择工具择图
  13. 计算机自动执行的条件是,电脑中winsat.exe进程总会自动运行的解决方法
  14. 小品演员小沈阳爆笑语录
  15. Redis(持久化、主从复制、主从切换、twemproxy、redis集群)
  16. Warframe Rank考核
  17. 第21章、系统设定工具(网络与打印机)与硬件侦测
  18. 蚂蚁课堂 - springboot入门(非常详细)讲解人:(余胜军)
  19. ROS分布式多机通信
  20. web项目图片/文件保存方式

热门文章

  1. 静态程序分析chapter3 - 数据流分析详述(Reaching Definitions、Live Variables、Available Expressions Analysis)
  2. 敲诈勒索比特币不断,企业用户如何防“山寨”钓鱼邮件
  3. Hadoop SequnceFile.Writer 压缩模式及压缩库浅析
  4. F# 4.0于全平台发布
  5. android MAT使用
  6. HTTPD(三)--HTTP2.4.9编译安装
  7. Android Scroller完全解析,关于Scroller你所需知道的一切
  8. jsp与servlet之间页面跳转及参数传递实例
  9. AOP的两种实现方式
  10. 后台开发经典书籍--大型分布式网站架构设计与实践