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). 哈希有啥作用? 它是一个将大体量数据转化 ...
随机推荐
- CUMTCTF'2020 未完成 wp
Web babysqli burp抓包,发现有 的过滤,用/**/过滤空格. 报错注入 payload username=admin&password='/**/or/**/extractva ...
- 072 01 Android 零基础入门 01 Java基础语法 09 综合案例-数组移位 04 综合案例-数组移位-在指定位置处插入数据方法
072 01 Android 零基础入门 01 Java基础语法 09 综合案例-数组移位 04 综合案例-数组移位-在指定位置处插入数据方法 本文知识点:综合案例-数组移位-在指定位置处插入数据方法 ...
- RESTfull是什么
经常做接口测试,会看很多接口文档,那怎么识别研发的接口设计是否足够规范,是否符合一些行业标准或准则.那认识了解RESTfull,可以让我们更具有专业性.让我们对接口文档的阅.接口合理性设计识别,做到有 ...
- Consul 快速入门
Consul是什么 Consul是一个服务网格(微服务间的 TCP/IP,负责服务之间的网络调用.限流.熔断和监控)解决方案,它是一个一个分布式的,高度可用的系统,而且开发使用都很简便.它提供了一个功 ...
- shell-变量的数值运算let内置命令
1. let命令的用法 格式: let 赋值表达式 [注]let赋值表达式功能等同于:((赋值表达式)) 范例1:给自变量i加8 [root@1-241 scripts]# i=2 [root@1- ...
- VS2019 配置opencv4.4
安装VS2019 参考:链接 下载opencv 链接 下载此时的最新版4.4.0 最后"上墙"下,不然很慢! 安装opencv 我的安装位置是:D:\soft\opencv\ins ...
- 习题3-4 周期串(Periodic Strings, UVa455)
#include<stdio.h> #include<string.h> char s[100]; int main() { int T; scanf("%d&quo ...
- Jmeter创建随机数作为参数使用 转
1.选项-函数值手对话框:2.选择适当的函数,比如"__Random()":3.输入参数,比如随机数的最大.最小数:4."Name of variable in whic ...
- lumen laravel response对象返回数据
Route::get('home', function () { $content = "内容"; $status = 301; $value = 'text/html'; // ...
- vue-awesome-swiper ---移动端h5 swiper 和 tab 栏选项联动效果实现
很久之前做小程序时有个类似每日优鲜里储值卡充值界面里的 卡轮播和价格tab栏联动效果,当时觉得新鲜做出来之后也没当回事.直到今天又遇到了一个类似的功能,所以想着总结经验. 实现效果如下图: 图解:点击 ...