Hash 哈希(上)
Hash 哈希(上)
简介
Hash,又称散列,它通过对数据进行计算,得出该数据的对应位置,使得数据和存放位置相对应,从而完成高效的查找。
Hash函数的构造
取余法
用关键字\(k\)除以\(M\),取余数作为地址。
\]
经验上\(P\)可以为\(k\)的取值可能数的1~2倍范围内的素数或\(k\)的取值可能数本身。
这类函数主要用于整数。
乘积取整法
用关键字\(k\)乘一个在\((0,1)\)中的实数\(A\)(最好是无理数),取其小数部分,乘\(M\)并取整,作为地址。
\]
经验上\(A\)可以为\(\dfrac{\sqrt{5}-1}{2}\)。
这类函数主要用于小数。
其他方法
- 自身函数:取\(k\)的某个线性函数值作为地址。
\]
- 平方取中法:将\(k\)平方后取中间几位作为地址。
- 折叠法:将\(k\)分成位数相等的几段,但最后一段可以不同,最后相加作为地址。
冲突的处理
大部分的散列表无法避免冲突(废话) 。因此需要一些数据结构来解决这些冲突。
挂链法
顾名思义,当出现冲突时,用链表将这两个关键字连起来。看看代码有点像向量存图:
const int array_size=1e5+5;//数组大小
vector<int>lis[array_size];
void get_hash(int key)//加入一个值为key的元素
{
int buc=f(key);
lis[buc].push_back(key);
}
bool check(int key)//查找一个元素是否存在于Hash表中
{
int buc=f(key);
for(int i=0;i<lis[buc].size();i++)
if(lis[buc][i]==key)
return true;
return false;
}
在键值均匀分布的前提下,挂链法操作的时间复杂度为\(O(n\texttt{length}(\texttt{Hash table}))\)。
开放定址法
这种方法将所有元素直接存于散列表中,因此散列表大小不能小于元素个数。开放定址法中有一个特殊的函数\(H(x,k)\),指明如果前\(k\)次访问失败,下一次应访问哪一个位置。这个函数有三种构造方式:
线性探查法
\]
二次探查法
\]
双哈希法
这种方法需要引入一个新的\(Hash\)函数\(newh(x)\):
\]
其中线性探查法有最优的缓存访问与计算消耗,二次探查法次之,双哈希法最劣。不过双哈希法的概率相等,能够避免“聚集”,即大量\(Hash\)值接近的情况。
三种方法代码类似:
const int array_size=1e5+5;//数组大小
int val[array_size];
int H(int buc,int opercnt){…}//上文提到的函数
void get_hash(int key)//加入元素操作
{
int buc=f(key,array_size);
while(val[buc]!=key&&val[buc])
buc=(buc==array_size-1?0:buc+1);
val[buc]=key;
}
bool check(int key)//查询元素操作
{
int buc=f(key,array_size),opercnt=0;
while(val[buc]!=key&&val[buc])
buc=H(buc,opercnt++);
return val[buc]==key;
}
在键值均匀分布的前提下,开放定址法时间复杂度为\(O(\texttt{length(Hash table)/(length(Hash table)}-n))\)
结语
以上是一些Hash的常用方法,限于篇幅这里仅提到了数值的哈希。
Hash还有更多的骚操作应用,如字符串哈希,排列哈希,树或图的哈希,Hash哈希(下)会提到的(光速逃
\]
Hash 哈希(上)的更多相关文章
- 上传图片用图片文件的对象hash哈希值判断图片是否一样,避免重复提交相同的图片到服务器中
上传图片用图片文件的对象hash哈希值判断图片是否一样,避免重复提交相同的图片到服务器中 前端:要用到一个插件,点击下载 <!DOCTYPE html> <html xmlns=&q ...
- hash 哈希查找复杂度为什么这么低?
hash 哈希查找复杂度为什么这么低? (2017-06-23 21:20:36) 转载▼ 分类: c from: 作者:jillzhang 出处:http://jillzhang.cnblogs ...
- Hash哈希(一)
Hash哈希(一) 哈希是大家比较常见一个词语,在编程中也经常用到,但是大多数人都是知其然而不知其所以然,再加上这几天想写一个一致性哈希算法,突然想想对哈希也不是很清楚,所以,抽点时间总结下Hash知 ...
- redis:hash哈希类型的操作
1. hash哈希类型的操作 1.1. hset key field value 语法:hset key field value 作用:把key中field域的值设为value 注:如果没有field ...
- 第二百九十六节,python操作redis缓存-Hash哈希类型,可以理解为字典类型
第二百九十六节,python操作redis缓存-Hash哈希类型,可以理解为字典类型 Hash操作,redis中Hash在内存中的存储格式如下图: hset(name, key, value)name ...
- Hash哈希(二)一致性Hash(C++实现)
一致性Hash 一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法,设计目标是为了解决因特网中的热点(Hot spot)问题,经常用于分布式.负载均衡等. 原理 一致哈希是 ...
- Hash(哈希)
一.基本概念 Hash,一般翻译做"散列",也有直接音译为"哈希"的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的 ...
- Redis[三] @Hash 哈希
Redis的哈希值是字符串字段和字符串值之间的映射,所以他们是表示对象的完美数据类型 在Redis中的哈希值,可存储超过400十亿键值对. redis 提供了2套操纵 一种是批量 一种是非批量 假设需 ...
- python hash 哈希值
自增知识点 1,哈希 什么是可哈希(hashable)? 简要的说可哈希的数据类型,即不可变的数据结构(字符串str.元组tuple.对象集objects). 哈希有啥作用? 它是一个将大体量数据转化 ...
随机推荐
- Linux系统编程—信号集操作函数
先来回顾一下未决信号集是怎么回事. 信号从产生到抵达目的地,叫作信号递达.而信号从产生到递达的中间状态,叫作信号的未决状态.产生未决状态的原因有可能是信号受到阻塞了,也就是信号屏蔽字(或称阻塞信号集, ...
- Espruino似乎和Arduino一样
参考:https://baike.baidu.com/item/Espruino Espruino 编辑 锁定 讨论 Espruino 是一个微处理器的 JavaScript 解释器,我们用它来创 ...
- 跟我一起学Redis之五种基本类型及其应用场景举例(干了6个小时)
前言 来啦,老弟?来啦,上一篇就当唠唠嗑,接下来就开始进行实操撸命令,计划是先整体单纯说说Redis的各种用法和应用,最后再结合代码归纳总结. Redis默认有16个数据库(编号为0~15),默认使用 ...
- vue+elementUI实现 分页表格的单选或者多选、及禁止部分选择
一.vue+elementUI实现 分页表格前的多选 多选效果图: 代码如下: <el-table ref="multipleTable" :data="listD ...
- 手把手教你AspNetCore WebApi:数据验证
前言 小明最近又遇到麻烦了,小红希望对接接口传送的数据进行验证,既然是小红要求,那小明说什么都得满足呀,这还不简单嘛. 传统验证 [HttpPost] public async Task<Act ...
- 搭建单机版的kafka
搭建单机版的kafka
- shell-的特殊变量-进程状态变量$$ $! $? $_详解
一:shell的特殊变量-进程状态变量详解 1. 进程状态变量 $$ 获取当前shell的进程号(pid) $! 执行上一个指令的pid,上一个后台运行进程的进程号 $? 获取执行上一个指令的返回值 ...
- Go 并发操作
goroutine 在其他的编程语言中,线程调度是交由os来进行处理的. 但是在Go语言中,会对此做一层封装,Go语言中的并发由goroutine来实现,它类似于用户态的线程,更类似于其他语言中的协程 ...
- 2019年CSP-J初赛试题(普及组)试题详解
https://www.jianshu.com/p/9e58f455c1ee https://blog.csdn.net/weixin_39104847/article/details/1086711 ...
- MeteoInfoLab脚本示例:FY-2C 云分类HDF数据
脚本程序: #Add data file fn = 'D:/Temp/hdf/FY2C_CLC_MLT_NOM_20070730_1800.hdf' f = addfile(fn) #Get data ...