为什么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字节
为什么Java的hash表的长度一直是2的指数次幂?为什么这个(hash&(h-1)=hash%h)位运算公式等价于取余运算?的更多相关文章
- java学习--高效的除模取余运算(n-1)&hash
没有测试过使用取余运算符和位运算符都做同一件事时的时间效率! 取余运算符% 如3除以2取余数 a = a%; 结果为1 上面是传统的方式进行求余运算. 需要先将10进制转成2进制到内存中进行计算,然后 ...
- 高效取余运算(n-1)&hash原理探讨
Java的HashMap源码中用到的(n-1)&hash这样的运算,查找发现这是一种高效的求余数的办法,但其中的原理是什么呢为什么可以这么做呢? 先上结论:假设被除数是x,对于除数是2n的取余 ...
- java数据结构之hash表
转自:http://www.cnblogs.com/dolphin0520/archive/2012/09/28/2700000.html Hash表也称散列表,也有直接译作哈希表,Hash表是一种特 ...
- 【数据结构】Hash表
[数据结构]Hash表 Hash表也叫散列表,是一种线性数据结构.在一般情况下,可以用o(1)的时间复杂度进行数据的增删改查.在Java开发语言中,HashMap的底层就是一个散列表. 1. 什么是H ...
- 四种方式带你层层递进解剖算法---hash表不一定适合寻找重复数据
一.题目描述 找出数组中重复的数字 > 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次. ...
- Hash表算法
出处:http://blog.csdn.net/v_JULY_v 第一部分:Top K 算法详解问题描述百度面试题: 搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串的 ...
- 十一、从头到尾彻底解析Hash 表算法
在研究MonetDB时深入的学习了hash算法,看了作者的文章很有感触,所以转发,希望能够使更多人受益! 十一.从头到尾彻底解析Hash 表算法 作者:July.wuliming.pkuoliver ...
- NGINX(三)HASH表
前言 nginx的hash表有几种不同的种类, 不过都是以ngx_hash_t为基础的, ngx_hash_t是最普通的hash表, 冲突采用的是链地址法, 不过这里冲突的元素不是一个链表, 而是一个 ...
- Hash表
Hash表 Hash表也称散列表,也有直接译作哈希表,Hash表是一种特殊的数据结构,它同数组.链表以及二叉排序树等相比较有很明显的区别,它能够快速定位到想要查找的记录,而不是与表中存在的记录的关键字 ...
随机推荐
- JFreeChart的使用示例
示例一,饼图,简单示例: 导入jar,代码文件: 运行结果: 代码: import org.jfree.chart.ChartFactory;import org.jfree.chart.ChartF ...
- Entity Framework 学习笔记(二)之数据模型 Model 使用过程
Entity Framework 数据模型 Model 创建的使用: 开发环境:VS2012 数据库:SQL Server 2008 Entity Framework 版本:6.12 下面是新建的 ...
- Java -- 反射示例
1. 反射: 即加载和解剖, 用于设计框架, 读取配置档 动态创建对象. Person类,用于反射. package com.kevin.class_test; public class Person ...
- BZOJ 1096 [ZJOI2007]仓库建设:斜率优化dp
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1096 题意: 有n个工厂,从左往右排成一排,分别编号1到n. 每个工厂里有p[i]件产品, ...
- java中的Enumeration
Enumeration en = pp.keys(); while(en.hasMoreElements()){ String key = (String)en.nextElement(); Syst ...
- django使用html模板减少代码
看下面两个页面: —————————————————————————————————————————————————————————————————————————————————— 一个显示文章列表 ...
- python_doc 读写docx文件
python读写word文档有现成的库可以处理,在这里采用了 python-docx. 首先先安装 pip install python-docx #!/usr/bin/env python # -* ...
- Selenium-webdriver基本操作1
#! /usr/bin/env python #coding=utf-8 from selenium import webdriver import time print("====浏览器最 ...
- jsp 自定义标签中的Function函数
在taglib中我们发现有一个标签叫做<function>,这次简单介绍<function>标签的基本用法,<function>标签可以做什么呢? 它可以让我们在j ...
- Smali文件添加try/catch语句,出现“invalid use of move-exception”异常
插入代码如下: 捕获到以下异常: 2019-03-18 21:09:35.431 8272-8272/com.xxxx.xxxx E/AndroidRuntime: FATAL EXCEPTION: ...