码迷,mamicode.com
首页 > 编程语言 > 详细

为什么Java的hash表的长度一直是2的指数次幂?为什么这个(hash&(h-1)=hash%h)位运算公式等价于取余运算?

时间:2019-05-24 10:51:52      阅读:222      评论:0      收藏:0      [点我收藏+]

标签:如何   使用   是你   实现   散列表   hash   相同   运算   之间   

1.什么是hash表?

  答:简单回答散列表,运算在hash结构散列(分散)存放。

2.如何散列排布,如果均匀排布?

  答:取余运算

3.Java中如何实现?

  答:hash&(h-1)

4.为什么hash&(h-1)=等价于hash%h

  java的h(表长)一定是2的指数次幂,2的指数次幂2n

  2n的结果:一定长这样10000...(n个0)

  2n-1的结果:一定这样1111(n-1)个1

       举个例子:

    当h=16,对应的二进制:00010000

              h-1=15,对应的二进制:00001111

              可以知道所有的数与00001111进行&运算
       高位都是0,低位取决于这个数的后四位(可能为0,也可能为1)  

    因此:(24-1)& hash=0 ~(24-1)之间=hash%(24

    只要知道是取余就行这种写法就行。只是对cpu指令的优化,

5.总结取余是为了散列分布,而hash桶的长度以2的指数被增长,可以使用位运算代替取余运算(显示的告诉计算机采用位运算,但是你去取余计算机应该也是这么用位去算的,.net里就是直接取余的,但表长也是2的指数倍)

hahs结构的重点算法应该是求hashcode,比如字符串,既要保证运算相同的串值的hash相同,又要使hash值尽量不同(不然也不能散列分布),就要去遍历串来计算hahscode,而hashcode一般占4字节

 

     

为什么Java的hash表的长度一直是2的指数次幂?为什么这个(hash&(h-1)=hash%h)位运算公式等价于取余运算?

标签:如何   使用   是你   实现   散列表   hash   相同   运算   之间   

原文地址:https://www.cnblogs.com/chaeyeon/p/10916375.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!