解决hash冲突之分离链接法
解决hash冲突之分离链接法
分离链接法:其做法就是将散列到同一个值的所有元素保存到一个表中。
这样讲可能比较抽象,下面看一个图就会很清楚,图如下

相应的实现可以用分离链接散列表来实现(其实就是一个linkedList数组)
至于基本的增加、删除和查询的思路都是先根据散列函数来确定遍历哪个链表。然后再到被确定的链表中执行一次查找,然后再进行相应的操作。
接下来就讲几个注意点吧
(一)什么时候需要rehash来扩大散列表的大小
讲这个的时候,先介绍一下什么是装填因子。
装填因子 = 关键字个数 / 表长
当我们使用分离链接法来处理冲突的时候,我们肯定希望装填因子最好为1,因为这个能尽可能将查找代价降到最低,所以当装填因子大于1的时候,我们会需要rehash来扩大散列表的大小。
rehash函数的具体实现如下(这是数据结构与算法书上的伪代码):
private void rehash() {
List<AnyType>[] oldLists = theLists;
theLists = new List[nextPrime(2*theLists.length)];
for(int j=0; j<theLists.length;j++)
theLists[j] = new LinkedList<>();
currentSize = 0;
for(int i=0; i<oldLists.length;i++)
for(AnyType item : oldLists[i])
insert(item);
}
其实大概的思路就是:将当前表的大小翻倍,但是表的大小必须是大于翻倍后的素数(下面贴出了nextPrime的具体实现)
这里表的大小必须要是素数是为了保证一个好的分布,尽可能减少冲突。
(二)散列函数的大概实现
这里先贴出书上的myhash()方法的具体实现
private int myhash(AnyType x) {
int hashVal = x.hashCode();
hashVal %= theLists.length;
if(hashVal < 0) {
hashVal += theLists.length;
}
return hashVal;
}
思路也比较简单,就是先得到插入数据的hashCode,然后对表的大小取余;如果结果是负数的话,就加上表的大小即可。
工具类:
nextPrime
//返回大于某数的下一个素数
static int NextPrime (int N) {
if (N % 2 == 0)
++N;
int i;
for (; ; N += 2){
for (i = 3; i*i <= N; i+=2)
if (N % i == 0)
goto ContOuter;
return N;
ContOuter:;
}
}
解决hash冲突之分离链接法的更多相关文章
- POJ2549【hash分离链接法】
题意: 给n个不同的数,求一个4个数(a,b,c,d)的组合满足a+b+c=d;求最大的d. 思路: 没想到可以用hash搞/ 这个就是数据结构里的分离链接法~ 解决hash冲突的方法:将所有关键字为 ...
- 链表法解决hash冲突
/* @链表法解决hash冲突 * 大单元数组,小单元链表 */ #pragma once #include <string> using namespace std; template& ...
- Python与数据结构[4] -> 散列表[1] -> 分离链接法的 Python 实现
分离链接法 / Separate Chain Hashing 前面完成了一个基本散列表的实现,但是还存在一个问题,当散列表插入元素冲突时,散列表将返回异常,这一问题的解决方式之一为使用链表进行元素的存 ...
- 分离链接法(Separate Chaining)
之前我们说过,对于需要动态维护的散列表 冲突是不可避免的,无论你的散列函数设计的有多么精妙.因此我们解决的重要问题就是:一旦发生冲突,我们该如何加以排解? 我们在这里讨论最常见的两种方法:分离链接法和 ...
- JAVA数据结构--哈希表的实现(分离链接法)
哈希表(散列)的定义 散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构.也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度 ...
- 大厂面试必问!HashMap 怎样解决hash冲突?
HashMap冲突解决方法比较考验一个开发者解决问题的能力. 下文给出HashMap冲突的解决方法以及原理分析,无论是在面试问答或者实际使用中,应该都会有所帮助. 在Java编程语言中,最基本的结构就 ...
- JDK8;HashMap:再散列解决hash冲突 ,源码分析和分析思路
JDK8中的HashMap相对JDK7中的HashMap做了些优化. 接下来先通过官方的英文注释探究新HashMap的散列怎么实现 先不给源码,因为直接看源码肯定会晕,那么我们先从简单的概念先讲起 ...
- HashTable 解决碰撞(冲突)的方法 —— 分离链接法(separate chaining)
1. ListNode 及 HashTable 的类型声明 声明 typedef int ElementType; typedef unsigned int Index; struct ListNod ...
- 解决hash冲突的三个方法
通过构造性能良好的哈希函数,可以减少冲突,但一般不可能完全避免冲突,因此解决冲突是哈希法的另一个关键问题.创建哈希表和查找哈希表都会遇到冲突,两种情况下解决冲突的方法应该一致.下面以创建哈希表为例,说 ...
随机推荐
- 【编程之外】从《海贼王》的视角走进BAT的世界
写在前面的话: 1.从写第一篇博客起到现在篇“纯”技术博客,所以呢-,就想写点不一样的东西,所以就有了这篇文章了 2.本文纯属瞎写,不代表任何第三方的观点.仅仅是出于我对于博客园和那部热血动漫的热爱. ...
- Android Parcelable using Kotlin
Kotlin 有 extension 可以很方便的让类继承 Parcelable 接口. 项目中引入一个较新版本的 Kotlin 引入 Kotlin extensions classpath &quo ...
- 《Python黑帽子:黑客与渗透测试编程之道》 自动化攻击取证
工具安装: 下载源码:https://code.google.com/archive/p/volatility/downloads 工具配置: 获取内存镜像:https://www.downloadc ...
- 题解 P5091 【【模板】欧拉定理】
欧拉定理:若 \(gcd(a,n)=1\),\(a^{\varphi(n)}\equiv 1(mod\ n)\) 设 \(1\sim n-1\) 中与 \(n\) 互素的 \(\varphi(n)\) ...
- 面向对象三大特性编写面向对象程序,self到底是谁
一.函数式编程和面向对象的对比 面向过程:根据业务逻辑从上到下写垒代码: 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可: 面向对象:对函数进行分类和封装,让开发“更快更好更强. ...
- Flash 0day漏洞(CVE-2018-4878)复现
该漏洞影响 Flash Player 当前最新版本28.0.0.137以及之前的所有版本,而Adobe公司计划在当地时间2月5日紧急发布更新来修复此漏洞. 本文作者:i春秋作家——F0rmat 前言 ...
- Mac下通过 brew 安装 Apache 和 PHP
Mac 自带的是php5.6 ,这里讲一下如果要升级到php7.1需要做的. 1.安装brew https://brew.sh/(官网有提供安装命令 建议使用) ruby -e "$(cur ...
- POJ 2864
#include <iostream> #define MAXN 600 using namespace std; int _m[MAXN][MAXN]; int main() { //f ...
- odoo开发笔记 -- context上下文
字段级别 视图级别 窗口动作级别
- (转)【OSGI】1.初识OSGI-到底什么是OSGI
原文:https://blog.csdn.net/acmman/article/details/50848595 目前,业内关于OSGI技术的学习资源或者技术文档还是很少的.我在某宝网搜索了一下“OS ...