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字节

         

  • 相关阅读:
    jython 访问数据库的方法
    Server 2008安装FTP的简单教程
    如何实现Android重启应用程序代码 ?
    android 应用程序自适应屏幕大小
    Android Dialog用法
    2008Server错误
    7种形式的Android Dialog使用举例
    ADB使用方法
    调用手机震动
    android小记之FTP文件上传
  • 原文地址:https://www.cnblogs.com/chaeyeon/p/10916375.html
Copyright © 2011-2022 走看看