散列表 不念不忘少年蓝@ 2022-04-04 06:25 250阅读 0赞 ## 1 定义 ## 散列技术是在记录的存储位置和它的关键位置之间建立一个确定的对应关系`f`,使得每个关键字`key`对应一个存储位置`f(key)`,即: 存储位置 = f(关键字) 我们把对应关系`f`称为散列函数(Hash函数),采用散列技术将记录存储在一块连续的存储空间中,这块连续的存储空间称为散列表或hash表 ## 2 常见的散列函数 ## 选取好的散列函数的原则:计算简单、散列地址分布均匀 * **直接定址法**:`f(key)= a*key + b (a,b为常数)`,适用于知道关键字分布,查找表较小且连续的情况 * **数字分析法**: 抽取关键字的一部分数字来计算散列存储位置,适用于关键字位数较多的情况 * **平方取中法**: 将关键字平方后抽取中间几位数字作为散列地址,适用于不知道关键字的分布,而位数又不是很大的情况 * **折叠法**: 将关键字从左至右分割成位数相等的几部分,并将这几部分叠加求和,取后几位作为散列地址。适用于不知道关键字分布,且位数较多的情况。 * **除留余数法**: `f(key) = key mod p (p<=m)`,对关键字直接取模作为散列地址,是最常用的构造散列函数方法 * **随机数法**: `f(key) = random(key)`,选取一个随机数,取关键字的随机函数值为它的散列地址。适用于关键字长度不等的情况。 ## 3 处理散列冲突 ## * **开放地址法**:一旦发生地址冲突,就去寻找下一个空的散列地址。 线性探测法 fi(key) = (f(key)+ di)MOD m (di = 1,2,3,…,m-1) 二次探测法 fi(key) = (f(key)+ di)MOD m (di = 12,-12,22,-22,…,q2,-q2,q<=m/2) 随机探测法 fi(key) = (f(key)+ di)MOD m (di 是一个随机数列) * **再散列函数法**:对于我们的散列表,事先准备多个散列函数,发生冲突时,就换一个散列函数计算 * **链地址法**:发生冲突时,将关键字为同义词的记录存储在一个单链表中(同义词字表),在散列表中只存储所有同义词子表的头指针,在查找时,可能需要遍历单链表 * **公共溢出区法**:将所有冲突的关键词都统一存储到溢出表中,查找时,先与散列表中的值做比较,若不等再去溢出表中遍历查找。 ## 4 示例 ## const maxLength = 10; //hash表的长度 let hashTable = []; hashTable.len = 0; hashTable.getAddr = function(key){ //计算hash地址 return key % maxLength; }; hashTable.add = function(key){ //插入关键字 if (this.len >= maxLength){ console.log("存储失败,空间不足"); return false; } let addr = this.getAddr(key); while(this[addr] !== undefined){ //开放地址法的线性探测解决地址冲突 addr = (addr + 1) % maxLength; } this[addr] = key; this.len++; console.log("存储成功:"+key); return true; }; hashTable.get = function(key){ //查找关键字地址 let addr = this.getAddr(key); while(this[addr]!==key){ addr = (addr + 1) % maxLength; if (addr === this.getAddr(key)){ console.log(key+"不存在"); return -1; } } console.log(key+"的存储位置为:"+addr); return addr; }
相关 回顾散列表 一 概述 散列表是一种非线性的数据结构,通过利用Hash函数将指定的键(key)映射至对应的值(value),从而实现高效的元素查找。 注意点:散列表的key要保证唯一的。 小灰灰/ 2022年09月15日 12:39/ 0 赞/ 195 阅读
相关 散列表的查找 为什么使用散列表?散列表在查找是有优势的,举例: 1.顺序表查找:一个一个遍历查找 2.有序表:可以通过二分法查找 ....... 那散列表的查找通过一个f(value 迈不过友情╰/ 2022年08月07日 09:41/ 0 赞/ 160 阅读
相关 java实现散列表 在直接寻址的情况下,具有关键字k的元素被存储在槽k中。比方说关键字域有2,3,5,8四个数,那么它只能被存储在2,3,5,8四个位置,其他的位置全部都被浪费掉了,这时候就可以通 向右看齐/ 2022年07月12日 16:26/ 0 赞/ 197 阅读
相关 散列表 1 定义 散列技术是在记录的存储位置和它的关键位置之间建立一个确定的对应关系`f`,使得每个关键字`key`对应一个存储位置`f(key)`,即: 存储位置 = 不念不忘少年蓝@/ 2022年04月04日 06:25/ 0 赞/ 251 阅读
相关 散列表(上) 文章目录 散列思想 散列表用的是数组支持按照下标随机访问数据的特性,所以散列表其实就是数组的一种扩展,由数组演化而来。可以说,如果没有数组,就没有 淡淡的烟草味﹌/ 2022年03月27日 13:40/ 0 赞/ 273 阅读
相关 散列表 散列方法不同于顺序查找、二分查找、二叉排序树及B-树上的查找。它不以关键字的比较为基本操作,采用直接寻址技术。在理想情况下,无须任何比较就可以找到待查关键字,查找的期望时间为O 一时失言乱红尘/ 2022年03月22日 17:06/ 0 赞/ 421 阅读
相关 散列表 直接寻址表 假设某个动态集合中的每个元素取自于U=\{0,1,2,…,m-1\},这里的m不是一个很大的数,假设没有两个元素具有相同的关键字。我们用一个数组(直接寻址表), 淩亂°似流年/ 2021年09月26日 14:26/ 0 赞/ 404 阅读
相关 散列表(一).散列表基本内容介绍 一说到散列表,大家脑子想到的词就是:Hashmap、key-value、查找速度快、增删速度快等等。确实,在我们平常的学习生活中,散列表是很常见、也是用的很多的数据结构... 你的名字/ 2021年01月10日 15:37/ 0 赞/ 802 阅读
还没有评论,来说两句吧...