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

    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),低位取决于这个数的后四位(因此低位可能为0,也可能为1)  

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

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

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

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

         

  • 相关阅读:
    angularjs学习访问服务器(5)
    sublime text 3解放鼠标的快捷键总结
    AngularJS与服务器交互(4)
    android 串口调试
    QCom MSM MDP显示驱动一些点的简记
    如何提高android串口kernel log等级
    高通平台msm8909 LK 实现LCD 兼容
    MSM8909平台 LED背光的控制
    铝聚合物电池工作温度及低温电量差异的说明
    液晶屏工作稳定说明
  • 原文地址:https://www.cnblogs.com/chaeyeon/p/10916375.html
Copyright © 2011-2022 走看看