问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

哈希索引和倒排查找怎么用简单

发布网友 发布时间:2022-05-01 15:17

我来回答

2个回答

热心网友 时间:2022-04-11 17:18

哈希(Hash)表

以上讲的查找方法基于比较的,查找效率依赖比较次数,其实理想的查找希望不经比较,一次存取便能得到所查记录,那就必须在记录的存储位置和它的关键字之间建立一个确定的对应关系f,这样查找k时,只要根据这个对应关系f找到给定值k的像f(k)。这种对应关系f叫哈希(hash)函数。按这种思想建立的表叫哈希表(也叫散列表)。哈希表存取方便但存储时容易冲突(collision):即不同的关键字可以对应同一哈希地址。如何确定哈希函数和解决冲突是关键。

1.哈希函数的构造方法

直接定址法:H(k)=k 或H(k)=a*k+b(线形函数)

如:人口数字统计表

地址 1 2 3 ... 100
年龄 1 2 3 ... 100
人数 67 3533 244 ... 4

数字分析法:取关键字的若干数位组成哈希地址

如:关键字如下:若哈希表长为100则可取中间两位10进制数作为哈希地址。

81346532 81372242 81387422 81301367 81322817 81338967 81354157 81368537

平方取中法:关键字平方后取中间几位数组成哈希地址

折叠法:将关键数字分割成位数相同的几部分(最后一部分的位数可以不同)然后取几部分的叠加和(舍去进位)作为哈希地址。

除留余数法:取关键字被某个不大于表长m的数p除后所得的余数为哈希地址。

H(k)=k mod p p<=m

随机数法:H(k)=rondom(k)。

2.处理冲突的方法

假设地址集为0..n-1,由关键字得到的哈希地址为j(0<=j<=n-1)的位置已存有记录,处理冲突就是为该关键字的记录找到另一个"空"的哈希地址。在处理中可能得到一个地址序列Hi i=1,2,...k

0<=Hi<=n-1),即在处理冲突时若得到的另一个哈希地址H1仍发生冲突,再求下一地址H2,若仍冲突,再求H3...。怎样得到Hi呢?

开放定址法:Hi=(H(k)+di) mod m (H(k)为哈希函数;m为哈希表长;di为增量序列)

当di=1,2,3,... m-1 时叫线性探测再散列。

当di=12,-12,22,-22,32,-32,...,k2,-k2时叫二次探测再散列。

当di=random(m)时叫伪随机探测序列。

例:长度为11的哈希表关键字分别为17,60,29,哈希函数为H(k)=k mod 11,第四个记录的关键字为38,分别按上述方法添入哈希表的地址为8,4,3(随机数=9)。

再哈希法:Hi=RHi(key) i=1,2,...,k,其中RHi均为不同的哈希函数。

链地址法:这种方法很象基数排序,相同的地址的关键字值均链入对应的链表中。

建立公益区法:另设一个溢出表,不管得到的哈希地址如何,一旦发生冲突,都填入溢出表。

3.哈希表的查找

例:如下一组关键字按哈希函数H(k)=k mod 13和线性探测处理冲突所得的哈希表a[0..15]:

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
14 01 68 27 55 19 20 84 79 23 11 10

当给定值k=84,则首先和a[6]比在依次和a[7],a[8]比结果a[8]=84查找成功。

当给定值k=38,则首先和a[12]比,再和a[13]比,由于a[13]没有,查找不成功,表中不存在关键字等于38的记录。

5.5 查找第k小元素

查找第k小元素即在n个元素中(未排序)找到第k小的元素。方法同快速排序,采用递归方式。

程序如下:

program kspv;
const n=7;
type
arr=array[1..n] of integer;
var
b:arr;
i,k:integer;
function p(s,t:integer):integer;
var i,j,t1,x:integer;
begin
i:=s;j:=t;x:=b[i];
repeat
while (b[j]>=x) and (j>i) do j:=j-1;
if j>i then begin t1:=b[i]; b[i]:=b[j];b[j]:=t1;end;
while (b[i]<=x) and (i<j) do i:=i+1;
if i<j then begin t1:=b[j];b[j]:=b[i];b[i]:=t1; end
until i=j;
b[i]:=x;
p:=i;
end;
function find(s,t,k:integer):integer;
var p1,q:integer;
begin
if s=t then find:=b[s] else
begin
p1:=p(s,t);
q:=p1-s+1;
if k<=q then find:=find(s,p1,k) else find:=find(p1+1,t,k-q);
end;
end;
begin
write('input data:');
for i:=1 to n do read(b[i]);readln;
write('input k:');read(k);
write('output data:');
writeln('kthsmall:=',find(1,n,k));
end.
希望你运用成功

热心网友 时间:2022-04-11 18:36

哈希查找是通过计算数据元素的存储地址进行查找的一种方法。哈希查找的操作步骤:⑴用给定的哈希函数构造哈希表;⑵根据选择的冲突处理方法解决地址冲突;⑶在哈希表的基础上执行哈希查找。
哈希查找步骤为:
设哈希表为HST[0~M-1],哈希函数取H(key),解决冲突的方法为R(x);
Step1 对给定k值,计算哈希地址 Di=H(k);若HST为空,则查找失败;
若HST=k,则查找成功;否则,执行step2(处理冲突)。
Step2 重复计算处理冲突的下一个存储地址 Dk=R(Dk-1),直到HST[Dk]为
空,或HST[Dk]=k为止。若HST[Dk]=K,则查找成功,否则查找失败。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
怎样让孩子主动找老师补课? 表格列求和公式怎么设置 求和函数公式怎么输入 北京注册成立一个公司需要多少钱 北京公司都是什么 手机导航地图语音怎么下载 如何分别真金和仿金首饰 怎样区分真金和仿金首饰呢 小学生新年晚会主持人的串词!!(不要太多)急 大大后天就需要了!!!_百度... 周年晚会策划公司 奥格瑞玛传送门大厅在哪 数据库中的hash索引的相关计算,请高手给予解答,谢谢! 请问数据结构中线性探测再散列法怎么算的?试举例说明。 散列表和线性存储的区别,在线等!!急!! 新申请的斗鱼主播为什么说不了话 什么是散列索引?如何构建散列索引 为啥我在斗鱼直播间发言主播都不理我呢,是一定要送鱼丸吗 斗鱼是直播间里面被禁言还能发得出去消息吗? 我的斗鱼tv,看不了主播,只能看别人对话 我在斗鱼主播那里怎么说不了话,第一次进主播直播间,应该不是被封吧,打了字直接消失 为什么我用手机发信息斗鱼主播看不见 ubuntu无法联网怎样安装和解压7z Iphone5s怎么调节亮度 applewatch保存的心跳和涂鸦在哪 applewatch心跳怎么玩 iwatch 无法和朋友传送心跳还有涂鸦功能 对方也有iwatch 已经开启imessage 砂锅云吞的制作方法是什么?你喜欢吃吗? applewatch的心率怎么传到手机 做云吞有诀窍,关键在于肉馅和汤底的调制,你知道方法吗? 温岭市广告制作加工厂,各种发光字,工地标识标牌,宣传栏。激光切割。有人帮我找一下吗? 广告字牌制作公司怎么开展业务 亲子阅读感言怎么写20字? 线性链表是存储结构还是逻辑结构 hashmap会问到数组索引,hash碰撞怎么解决 有关数据结构哈希表的问题? 郑州地铁五号线在黄河路与南阳路有站点吗 成都地铁5号线锦城大道B出口有卫生间吗? 郑州市第八人民医院离地铁五号线哪个站最近? 郑州至港区五号线班车郑州有哪些站点? 郑州银基商贸城做地铁从河南省儿童医院五号线坐到哪一站? 郑州地铁5号线怎么换成郑州地铁1号线东西南北 共享位置下边的黑色圈是什么 地铁五号线郑州火车站是什么名字? 如何在wps表格中只填2020年-2030年星期二星期四星期五星期日的日期? 如何在wps表格中只填星期二星期四星期日的日期 请问郑州东站能不能多设几个卫生间? 洗手盆堵塞如何疏通? 郑州五号线每小时多少公里呀? 微信通讯录里详细资料的右边有一个黑色的小人圈和一个红圈加一线白。各是什么意思呀? 一个黑色的圆圈把微信图标给圈起来了是怎么回事啊? 郑州地铁五号线,3位医生参与了一场惊心动魄的生死自救,他们经历了什么?