散列表(上)

散列表(Hash Table)

散列思想

散列表利用的是数组可以按下标快速访问的特征,散列表就是数组的一种扩展

运动员,参赛编号为102301,前两位代表年级,中间代表班级,最后两位代表运动员编号。
可以将最后2位,转换为数组的下标,将运动员的信息存储在数组的下标中,这样就可以通过数组下标,快速的获取到运动员信息
这里,参赛运动员的编号,叫做键(key,关键字),用它来标识一个选手。把参赛编号转换为数组下标的方法就是散列函数(hash函数,哈希函数)。散列函数计算得到的结果就是散列值(hash值,哈希值)

//实现散列函数
const hashMumber = (key) => {
  const lastTwoChars = key.slice(key.length - 2);
  return parseInt(lastTwoChars);
};

let arr = [];
//利用散列函数,插入运动员信息
const insert = (key) => {
  const index = hashMumber(key);
  arr[index] = {
    class: key.slice(0, 2),
    level: key.slice(2, 4),
  };
};
insert("123401");
insert("325602");
insert("237803");
//通过散列函数,获取到运动员信息
console.log(arr[hashMumber("237804")]);

散列函数基本要求

1,key1===key2 hash(key1)===hash(key2)
2,key1!==key2 hash(key1)!==hash(key2)
第二个,再真实的情况下,基本上都会发生重复现象的,这种线性就是散列冲突

散列冲突

既然无法避免冲突,那么该怎么解决那

1,开放寻址法

思路:出现散列冲突,就从找一个位置,进行插入。那这里的关键就是从新找到一个新的位置

线性探测

当我们向散列表中插入数据的时候,如果通过散列函数得到的结果,再散列表中已经被占用的话,我们就继续向后查找,如果有空闲位置就放入(这里向后查找完后,可以从散列表头再查找),否则就停止该操作.
散列表的查找与该操作类似,如果有就代表找到了元素,否则就无该数据。
散列表删除,不过用线性探测方法,删除有些特殊,这里并不能真正的把数据删除,而是进行标记的方法。
这里有点麻烦,我来详细解释下,我们使用线性探测的方法,插入数据的时候,如果对应的下标是空闲的就直接插入,否则就向下查找空闲位置来插入。
因此用线性探测查找的话,首先也是从对应的下标进行查找,如果发现不是,会向后继续查找这里是关键,因为插入的时候,发现该位置被占用的话,就会向后查找位置,再遇到的第一个空闲位置进行插入。所以再线性探测查找数据的过程中,如果遇到了空闲位置,还没找到的话,就会默认代表没有,而这里的空闲位置,有可能是被删除的。
所以这里大家就明白了吧,不能直接删除数据。因此这里用标记的方法来处理。
这里大家也因该发现了问题的吧,线性探测的话,再数据越来越多,散列冲突多的情况下,查找与删除的效果也就会越来越高,最坏时间复杂度为o(n);

二次探测

线性探测的每次为1,hash(key),hash(key)+1,hash(key)+2
二次探测hash(key)+0,hash(key)+12,hash(key)+22

双重散列

用一组散列函数,如果第一次计算后,位置被占用,就调用第二个散列函数来计算,以此类推,直到找到最终的位置
不论哪种方法,再开放寻址法里面,只要数据越来越多,散列冲突就会越来越多。
装载因子,用其来表示空位的多少。
计算公式:散列表的装载因子=填入表中的元素个数/散列表的长度
结果越来越大时,代表空闲位置越来越少,冲突越来越多,性能越来越差

链表法

链表法更加常用,再散列表,对应的下标后都添加一单链表即可。对于散列值相同的元素都放到相同数组下标的链表中
插入与删除都只用散列函数计算出对应的值后,放在其后的链表,或者从其后的链表进行删除
这里的时间复杂度更对应链表的长度成正比,但是理论上k=n/m,k是所有数据的数量,k是对象的数组的曹的个数

对 王争 数据结构与算法之美的学习与笔记

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值