Hash冲突处理终极版
对于Hash,我们是怎样来处理冲突的。现在就来介绍一些经典的Hash冲突处理的方法。主要包括
(1)开放地址法
(2)拉链法
(3)再哈希法
(4)建立公共溢出区
(1)开放地址法
基本思想:当发生地址冲突时,按照某种方法继续探测Hash表中其它存储单元,直到找到空位置为止。描述如下
其中,为关键字的直接Hash地址,为Hash表的长度,为
每次再探测时的地址增量。根据的不同取法,有不同的称呼。
线性探测再散列
二次探测再散列
伪随机再散列 伪随机数
(2)拉链法
拉链法又叫链地址法,适合处理冲突比较严重的情况。基本思想是把所有关键字为同义词的记录存储在同一个
线性链表中。
代码:
#include <iostream>
#include <string.h>
#include <stdio.h>using namespace std;
const int N = 35;struct node
{int key; //关键字int len; //每个节点引出的链表长度bool flag; //有数据的标志node *next;
};node list[N];void Init(node list[])
{for(int i=0; i<N; i++){list[i].len = 0;list[i].flag = 0;list[i].next = NULL;}
}void Insert(node list[], int val, int m)
{int id = val % m;if(!list[id].flag){list[id].key = val;list[id].flag = 1;}else{node *p = new node();p->key = val;p->next = list[id].next;list[id].next = p;}
}//输出HashTable
void Print(node list[], int m)
{for(int i=0; i<m; i++){node *p = list[i].next;if(!list[i].flag)printf("The %dth record is NULL!\n", i);else{printf("The %dth record is %d", i, list[i].key);list[i].len++;while(p){printf("->%d", p->key);p = p->next;list[i].len++;}puts("");}}
}//计算平均查找长度
double ASL(node list[], int m)
{double ans = 0;for(int i=0; i<m; i++)ans += (list[i].len + 1) * list[i].len / 2.0;return ans / m;
}int main()
{int n, m;Init(list);scanf("%d %d", &n, &m);for(int i=0; i<n; i++){int val;scanf("%d", &val);Insert(list, val, m);}Print(list, m);printf("The Average Search Length is %.5lf\n", ASL(list, m));return 0;
}/**
12 11
47 7 29 11 16 92 22 8 3 37 89 50
*/
关于拉链法还可以参考:http://www.51nod.com/question/index.html#!questionId=1191
(3)再哈希法
再哈希法又叫双哈希法,有多个不同的Hash函数,当发生冲突时,使用第二个,第三个,....,等哈希函数
计算地址,直到无冲突。虽然不易发生聚集,但是增加了计算时间。
(4)建立公共溢出区
建立公共溢出区的基本思想是:假设哈希函数的值域是[1,m-1],则设向量HashTable[0...m-1]为基本
表,每个分量存放一个记录,另外设向量OverTable[0...v]为溢出表,所有关键字和基本表中关键字为同义
词的记录,不管它们由哈希函数得到的哈希地址是什么,一旦发生冲突,都填入溢出表。
Hash冲突处理终极版相关推荐
- 阿里巴巴Java开发手册终极版网页版v1.3.0
前言 一 .编程规约 ( 一 ) 命名风格 ( 二 ) 常量定义 ( 三 ) 代码格式 ( 四 ) OOP规约 ( 五 ) 集合处理 ( 六 ) 并发处理 ( 七 ) 控制语句 ( 八 ) 注释规约 ...
- EasyCode的Mybatis终极版模板
EasyCode的Mybatis终极版 距离我第一次上手EasyCode已经有一年的时间 提醒一下,看这篇文章,如果你已经有EasyCode使用基础,只是来拿一下模板,可以直接看,如果你同时想知道知道 ...
- 没想到 Hash 冲突还能这么玩,你的服务器中招了吗?
背景 其实这个问题我之前也看到过,刚好在前几天,洪教授在某个群里分享的一个<一些有意思的攻击手段.pdf>,我觉得这个话题应该还是有不少人不清楚的,今天我就准备来"实战" ...
- 解决hash冲突的常用方法
解决hash冲突的常用方法 参考文章: (1)解决hash冲突的常用方法 (2)https://www.cnblogs.com/fxtx/p/11588581.html (3)https://www. ...
- 全面屏适配方案,终极版,华为隐藏导航栏解决方案
全面屏适配方案,终极版,华为隐藏导航栏解决方案 参考文章: (1)全面屏适配方案,终极版,华为隐藏导航栏解决方案 (2)https://www.cnblogs.com/lizhanqi/p/93371 ...
- HashMap解决hash冲突的方法
HashMap解决hash冲突的方法 博客分类: jvm虚拟机 在Java编程语言中,最基本的结构就是两种,一种是数组,一种是模拟指针(引用),所有的数据结构都可以用这两个基本结构构造,HashMap ...
- Python 装饰器记录总结 (终极版)
Python 装饰器记录总结 (终极版) 原文链接:http://magicroc.com/2017/04/10/Python装饰器记录总结/ 装饰器是一个函数,一个用来包装函数的函数,装饰器在函数申 ...
- hashMap怎么解决hash冲突的
2019独角兽企业重金招聘Python工程师标准>>> 学Java的都知道hashMap的底层是"链表散列"的数据结构也也可以说是hash表.在put的实话先根据 ...
- Algorithm:C++语言实现之SimHash和倒排索引算法相关(抽屉原理、倒排索、建立查找树、处理Hash冲突、Hash查找)
Algorithm:C++语言实现之SimHash和倒排索引算法相关(抽屉原理.倒排索.建立查找树.处理Hash冲突.Hash查找) 目录 一.SimHash算法 1.SimHash算法五个步骤 2. ...
最新文章
- 8位图像的双边滤波器实现
- Linux通过kaggle api下载kaggle数据集
- 实现redis 手动_Redis精华所在,一口气说完Redis的主从复制和哨兵模式
- pytorch学习之路
- cordova build android很慢,cordova build --release android命令打包下载gradle非常慢的问题...
- 使用webstorm操作git
- IntelliJ IDEA设置代码字体大小
- 机器视觉基础知识详解
- 【NLP】LSTM 唐诗生成器
- Python读取CSV文件,并进行数据可视化绘图
- Java里format什么意思_java String.Format详解
- 【python】13位时间戳转成正常格式的时间
- Java语言,什么是Java语言?Java的版本。
- 火狐插件油猴Greasemonkey系列二
- 【译】使用 AngularJS 和 Electron 构建桌面应用
- 新导部队营房室内人员定位系统解决方案
- 17.代理_CDN_网络安全
- 【Web编程实践课第二次作业】体育新闻世界
- 结构(structure)创建——直接赋值法与使用struct函数创建法。
- C语言游戏必备:光标定位和颜色设置