[数据结构]这可能是你见过最简单的HashMap

Hash:散列

        优势:HashMap是ArrayList和LinkedList的折中版,结合了查询快,插入快的优点。

HashMap为什么查询快?

         Hash中重要的思想就是把数据分散化,引入了bucket(桶)的概念,把空间分为桶,默认16个桶

         众所周知HashMap是基于key-value映射的,而key是唯一的,怎么决定key进入到哪个桶里呢?

         用取模的方式,对桶的个数进行取模运算,这样就知道数据进入到哪个桶里了。

数据怎么hash的?

         当来了一个数据后,首先把数据按照桶的个数取模,然后决定放到哪个桶里去。

查询时是怎么查询的?

         Hash的好处就是可以按照key来查询,一旦给了key,通过hash定位到哪个桶里,然后根据定位的桶去查询数据。Hash最大的优势就是查询起来非常快,数据量越大越明显。

       因为一次性就可以排除n分之n-1的量,比如说十亿数据分为10个桶,给了key之后,9亿的数据都可以不用看了,直接看那一个亿的数据就可以了。

为了更好的加深对HashMap的理解,我们来看一下CSDN一位博主讲解的十分简单的例子:

       现在我要存储4个元素 13 7 14 11

       显然,我们可以用数组来存。也就是:a[1] = 13; a[2] = 7; a[3] = 14; a[4] = 11;

       当然,我们也可以用Hash来存。下面给出一个简单的Hash存储:

       先来确定那个函数。我们就用h(ki) = ki%5;(这个函数不用纠结,我们现在的目的是了解为什么要有这么一个函数)。

       对于第一个元素 h(13) = 13%5 = 3; 也就是说13的下标为3;即Hash[3] = 13;

       对于第二个元素 h(7) = 7 % 5 = 2; 也就是说7的下标为2; 即Hash[2] = 7;

       同理,Hash[4] = 14; Hash[1] = 11;

Hash冲突的处理

      已知一组关键字为(26,36,41,38,44,15,68,12,06,51),用除余法构造散列函数,用线性探查法解决冲突构造这组关键字的散列表。

解答:

       为了减少冲突,通常令装填因子α     

       由除余法的散列函数计算出的上述关键字序列的散列地址为(0,10,2,12,5,2,3,12,6,12)。

       前5个关键字插入时,其相应的地址均为开放地址,故将它们直接插入T[0],T[10),T[2],T[12]和T[5]中。

       当插入第6个关键字15时,其散列地址2(即h(15)=15%13=2)已被关键字41(15和41互为同义词)占用。

       故探查h1=(2+1)%13=3,此地址开放,所以将15放入T[3]中。

       当插入第7个关键字68时,其散列地址3已被非同义词15先占用,故将其插入到T[4]中。

     当插入第8个关键字12时,散列地址12已被同义词38占用,故探查hl=(12+1)%13=0,而T[0]亦被26占用,再探查h2= (12+2)%13=1,此地址开放,可将12插入其中。

      类似地,第9个关键字06直接插入T[6]中;而最后一个关键字51插人时,因探查的地址12,0,1,…,6均非空,故51插入T[7]中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值