-
2021-11-29 23:33:48
负数加m
m为哈希表地址区间长度更多相关内容 -
二次探测法
2020-05-04 16:02:36存在关键码{43,7,29,22,16,92,44,8,19},采用二次探测法处理冲突,建立的hash表为( ) 二次探测法:采用开放定址法处理冲突中的二次探测再散列(也即是题目中的二元探测法),则哈希函数变为Hash(key) = (Hash(key)...设哈希表长为11,哈希函数为Hash (key)=key%11。存在关键码{43,7,29,22,16,92,44,8,19},采用二次探测法处理冲突,建立的hash表为( )
二次探测法:采用开放定址法处理冲突中的二次探测再散列(也即是题目中的二元探测法),则哈希函数变为Hash(key) = (Hash(key) + d) % 11,其中d = 1^2, -1^2, 2^2, -2^2, 3^2,……,则开始计算。对于43,代入公式为Hash(43) = 43 % 11 = 10, 则地址为10;
对于7,代入公式为Hash(7) = 7 % 11 = 7,则地址为7;
对于29,代入公式为Hash(29) = 29 % 11 = 7, 与7冲突,则采用二次探测进行消除冲突, 继续(7 + 1) % 11 = 8,没有冲突,则地址为8;
对于22,代入公式Hash(22) = 22 % 11 = 0, 则地址为0;
对于16,代入公式Hash(16) = 16 % 11 = 5, 则地址为5;
对于92,代入公式Hash(92) = 92 % 11 = 4,则地址为4;
对于44,代入公式Hash(44) = 44 % 11 = 0, 与22的地址冲突,则继续(0 + 1) % 11 = 1,没有冲突,则地址为1;
对于8, 代入公式Hash(8) = 8 % 11 = 8, 与29有冲突,则继续(8 + 1) % 11 = 9, 没有冲突,则地址为9;
对于19,代入公式Hash(19) = 19 % 11 = 8. 与 29有冲突,则继续(8 + 1) * 11 = 9, 与8有冲突,继续(8 - 1) % 11 = 7, 与7有冲突,则继续(8 + 4) % 11 = 1, 与44有冲突,则继续(8 - 4) % 11 = 4, 与92有冲突,则继续(8 + 9) % 11 = 6, 没有冲突,则地址为6.
所以最后得到的Hash表为下图所示:
-
散列表(线性探测法&二次探测法)
2022-04-04 15:10:55线性探测法 将关键字序列(7、8、30、11、18、9、14)散列存储到散列表中 (7) Key 7 8 30 11 18 9 14 H(Key) 0 3 6 5 5 5 6 冲突处理:(位置被占有继续往下找) ...二次探测法 f(key) = (f(key)+di -
构造哈希表以及二次探测法
2018-09-16 19:53:39构造哈希表(散列表)以及二次探测法 今天做笔试题时,遇到一道构造哈希表的题,hash函数是 k%11 ,然后一个数组记不清了,然后就是问二次探测法进行,问下面那个是正确,懵逼啊,没做过,不知道,乱选直接下...今天做笔试题时,遇到一道构造哈希表的题,hash函数是 k%11 ,然后一个数组记不清了,然后就是问二次探测法进行,问下面那个是正确,懵逼啊,没做过,不知道,乱选直接下一题,于是有这个博客,赶紧学习一波。
网上查询了一下。
构造哈希表的几种方法
常用方法是直接定址法和除留余数法
- 直接定址法(取关键字的某个线性函数为哈希地址)
类似于这样的式子
f(key) = a × key + b
- 除留余数法(取关键值被某个不大于散列表长m的数p除后的所得的余数为散列地址)
对于散列表长为m的散列函数公式为:
f( key ) = key mod p ( p ≤ m )
mod是取模(求余数)的意思。事实上,这方法不仅可以对关键字直接取模,也可在折叠、平方取中后再取模。
-
平方取中法
-
折叠法
-
随机数法
-
数学分析法
哈希冲突(碰撞)以及处理
哈希冲突:既然有哈希函数Hash(key),在有限的空间里,肯定会产生相同的的值(哈希地址),我们称这种情况为哈希冲突(碰撞)。任意的散列函数都不能避免产生冲突。
1. 开发定址法
所谓的开放定址法就是一旦发生了冲突,就去寻找下一个空的散列地址,只要散列表足够大,空的散列地址总能找到,并将记录存入。
- 线性探测法
fi(key) = (f(key)+di) MOD m (di=1,2,3,......,m-1)
用开放定址法解决冲突的做法是:当冲突发生时,使用某种探测技术在散列表中形成一个探测序列。沿此序列逐个单元地查找,直到找到给定的关键字,或者碰到一个开放的地址(即该地址单元为空)为止(若要插入,在探查到开放的地址,则可将待插入的新结点存人该地址单元)。查找时探测到开放的地址则表明表中无待查的关键字,即查找失败。
ep:我们的关键字集合为{12,67,56,16,25,37,22,29,15,47,48,34},表长为12。 我们用散列函数f(key) = key mod 12。
当计算前S个数{12,67,56,16,25}时,都是没有冲突的散列地址,直接存入:
计算key = 37时,发现f(37) = 1,此时就与25所在的位置冲突。
于是我们应用上面的公式f(37) = (f(37)+1) mod 12 = 2。于是将37存入为2的下标位置。
接下来22,29,15,47都没有冲突,正常的存入:
到了 key=48,我们计算得到f(48) = 0,与12所在的0位置冲突了,不要紧,我们f(48) = (f(48)+1) mod 12 = 1,此时又与25所在的位置冲突。于是f(48) = (f(48)+2) mod 12=2,还是冲突……一直到 f(48) = (f(48)+6) mod 12 = 6时,存入该位置:
我们把这种解决冲突的开放定址法称为线性探测法。
- 二次探测法
考虑深一步,如果发生这样的情况,当最后一个key=34,f(key)=10,与22所在的位置冲突,可是22后面没有空位置了,反而它的前面有一个空位置,尽管可以 不断地求余数后得到结果,但效率很差。
因此我们可以改进di = 12, -12, 22, -22,……, q2, -q2 (q <= m/2),这样就等于是可以双向寻找到可能的空位置。
对于34来说,我 们取di即可找到空位置了。另外增加平方运算的目的是为了不让关键字都聚集在 某一块区域。我们称这种方法为二次探测法。
f(key) = (f(key)+di) MOD m (di = 1^2, -1^2, 2^2, -2^2,……, q^2, -q^2, q <= m/2)
注:1^2 表示是 1的平方。
2. 链地址法
前面我们谈到了散列冲突处理的开放定址法,它的思路就是一旦发生了冲突,就去寻找下一个空的散列地址。那么,有冲突就非要换地方呢,我们直接就在原地处理行不行呢?
答案是可以的,就是链地址法,就好比Java里的HashMap的数据结构一样。
关于HashMap源码分析 ——> https://blog.csdn.net/Stu_zkl/article/details/82714325
好了,就写到这了。 -
用二次探测法建立hash表
2019-09-14 16:07:43存在关键码{43,7,29,22,16,92,44,8,19},采用二次探测法处理冲突,建立hash表。 由于哈希表长为11,则序号为0~10. Hash(43)=43%11=10, 43地址为10 Hash(7)=7%11=7, 7地址为7 Hash(29)=29%11=8, 29地址为8 ... -
开放定址法与二次探测法构造散列表
2019-12-18 14:21:34二次探测法就是解决这个问题的,二次探测法的解决冲突的方案是 f i ( k e y ) = ( f i − 1 ( k e y ) + d i ) m o d m ( d i = 1 2 , − 1 2 , 2 2 , − 2 2 . . q 2 , − q 2 , q ≤ m / 2 ) f_i(key)=(f_... -
哈希表线性探测法和二次探测法详细代码
2018-07-28 16:58:14//二次探测法 index = (index + iCount*iCount) % Hash->capacity; iCount++; } Hash->arr[index].key = key; Hash->arr[index].state = EXISTED; return 1; } //扩容操作 //如果负载因子超标,则... -
哈希算法中的二次探测法(正向)
2020-05-18 09:36:45假设数组hashTable的长度是mSize,用平方探测法插入数字num,每次的位置pos = (num + i * i) % mSize,i的范围是[0, mSize)。 bool flag = false; //未插入 for(int i = 0; i < mSize; i++){ int pos = (num + i... -
构造哈希表之二次探测法
2016-06-08 01:19:00HashTable-散列表/哈希表 是根据关键字(key)而直接访问在内存存储位置的数据结构。 它通过一个关键值的函数将所需的数据映射到...2.除留余数法(取关键值被某个不大于散列表长m的数p除后的所得的余数为散列地址) 3. -
C语言代码实现 散列表(哈希表)二次探测法处理冲突
2020-02-09 22:24:56//偶数次冲突向后查找 NewPos = CurrentPos - ( CrashNum / 2 ) * ( CrashNum / 2 ) ; while ( NewPos < 0 ) //等于也不行 { NewPos = NewPos + h - > TableSize... -
用二次探测再散列法解决冲突建立哈希表并查找
2014-07-21 11:20:44这是数据结构课程作业,用二次探测再散列法解决冲突建立哈希表并查找 从键盘读入 待查找 的权重数值,以除留余数法为哈希函数,二次探测再散列法解决冲突建立哈希表,基于哈希算法从数组中查找相应的记录,计算相应... -
二次探测散列法
2020-12-28 21:36:29展开全部二次再散e68a84e8a2ad3231313335323631343130323136353331333431366365列法是指第一次散列产生哈希地址冲突,为了解决冲突,采用另外的散列函数或者对冲突结果进行处理的方法。散列函数的选择有两条标准:... -
散列表(四)冲突处理的方法之开地址法: 二次探测再散列的实现
2020-12-19 00:52:54前面的文章分析了开地址法的其中一种:线性探测再散列,这篇文章来讲开地址法的第二种:二次探测再散列(二)、二次探测再散列为改善“堆积”问题,减少为完成搜索所需的平均探查次数,可使用二次探测法。通过某一个... -
cpp代码-二次探测再散列哈希表
2021-07-14 17:47:24cpp代码-二次探测再散列哈希表 -
二次在探测散列表
2014-08-06 10:01:25数据结构中用c++语言二次在探测散列表源代码 -
哈希表之线性探测和二次探测
2020-02-29 17:58:35哈希表又称散列表。 哈希表存储的基本思想是:以数据表中的每个记录的关键字 k为自变量,通过一种函数H(k)计算出函数值。把这个值解释为一块连续存储空间...开放寻址法:Hi=(H(key) + di) MOD m, i=1,2,…, k(k<... -
HashTable哈希表/散列表(线性探测和二次探测)
2017-04-24 17:35:07HashTable的简单介绍HashTable是根据关键字直接访问在内存存储的数据结构。 HashTable叫哈希表或者散列表。 它通过一个关键值的函数将所需的数据...给定一字符串“abckhdgubhkacdggk”找出第一次只出现一次的字符。 -
详细图解什么叫平方探查法即二次探测再散列和线性探测再散列(数据结构 哈希函数 哈希冲突)
2016-08-28 22:38:44虽然上文有提到怎么解释的开放地址法处理hash冲突,但是当时只是给了个...什么叫平方探测再散列(二次探测再散列); 老师的ppt吧。 给个原始数据如上图。 下面详细解析。 上面的是线性探测再散列。这个简单。 -
哈希表-开放地址法(二次探测以及在哈希法)
2017-12-19 23:23:10哈希表-开放地址法(二次探测以及在哈希法) -
DS哈希查找—二次探测再散列(附图解)
2020-12-23 20:22:20输入表长(大于、等于11),输入关键字集合,用二次探测再散列构建哈希表,并查找给定关键字。 输入 测试次数t 每组测试数据格式如下: 哈希表长m、关键字个数n n个关键字 查找次数k k个待查关键字 输出 对每组测试... -
二次探测发解决冲突的闭散列表
2014-01-10 13:21:33二次探测发解决闭散列表中的冲突问题,可供参考 -
散列表,这一篇就够了,平方探测法,有负值
2020-12-26 18:55:52一级目录 二级目录 三级目录 -
DS哈希查找—二次探测再散列
2018-12-04 17:23:03输入表长(大于、等于11),输入关键字集合,用二次探测再散列构建哈希表,并查找给定关键字。 输入 测试次数t 每组测试数据格式如下: 哈希表长m、关键字个数n n个关键字 查找次数k k个待查关键字 输出 对... -
散列表(四):冲突处理的方法之开地址法(二次探测再散列的实现)
2013-07-31 17:11:21为改善“堆积”问题,减少为完成搜索所需的平均探查次数,可使用二次探测法。 通过某一个散列函数对表项的关键码 x 进行计算,得到桶号,它是一个非负整数。 若设表的长度为TableSize = 23,则在线性探测再... -
(第14讲)哈希表的开放地址法中的二次探测
2016-07-13 16:29:49Hi=(H(key)+di) MOD m i=1,2,...,k(k 如果di值可能为1,2的平方,3的平方,...,称... * 哈希表的开放地址法中的二次探测 */ package com.eleven; public class HashDoubleApp{ public static void main(Stri -
平方探测法(quadratic probing)
2019-02-24 15:43:50平方探测法(Quadratic Probing) 二次探测 平方探测法:以增量序列1^2 -1^2, 2^2, -2^2, …… , q^2, -q^2,且 q<= [ TableSize/2 ] 循环试探下一个存储地址。 //其中范围中的q<=TableSize/2,具体是... -
散列的开放定址法中的平方探测法
2018-07-20 01:08:56平方探测就是冲突函数为二次函数的探测方法。流行的选择函数是F(i)=i²,例如插入89,18,49,58,69可以由下图看出, 空表 插入89 插入18 插入49 插入58 插入69 0 ... -
线性探测再散列和平方探测再散列(二次探测再散列)算法
2017-10-16 15:04:41用于解决冲突的两种算法 线性探测再散列 平方探测再散列(二次探测再散列)参考这个blog,写的很好。 http://blog.csdn.net/qq_27093465/article/details/52348366