对于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冲突处理终极版相关推荐

  1. 阿里巴巴Java开发手册终极版网页版v1.3.0

    前言 一 .编程规约 ( 一 ) 命名风格 ( 二 ) 常量定义 ( 三 ) 代码格式 ( 四 ) OOP规约 ( 五 ) 集合处理 ( 六 ) 并发处理 ( 七 ) 控制语句 ( 八 ) 注释规约 ...

  2. EasyCode的Mybatis终极版模板

    EasyCode的Mybatis终极版 距离我第一次上手EasyCode已经有一年的时间 提醒一下,看这篇文章,如果你已经有EasyCode使用基础,只是来拿一下模板,可以直接看,如果你同时想知道知道 ...

  3. 没想到 Hash 冲突还能这么玩,你的服务器中招了吗?

    背景 其实这个问题我之前也看到过,刚好在前几天,洪教授在某个群里分享的一个<一些有意思的攻击手段.pdf>,我觉得这个话题应该还是有不少人不清楚的,今天我就准备来"实战" ...

  4. 解决hash冲突的常用方法

    解决hash冲突的常用方法 参考文章: (1)解决hash冲突的常用方法 (2)https://www.cnblogs.com/fxtx/p/11588581.html (3)https://www. ...

  5. 全面屏适配方案,终极版,华为隐藏导航栏解决方案

    全面屏适配方案,终极版,华为隐藏导航栏解决方案 参考文章: (1)全面屏适配方案,终极版,华为隐藏导航栏解决方案 (2)https://www.cnblogs.com/lizhanqi/p/93371 ...

  6. HashMap解决hash冲突的方法

    HashMap解决hash冲突的方法 博客分类: jvm虚拟机 在Java编程语言中,最基本的结构就是两种,一种是数组,一种是模拟指针(引用),所有的数据结构都可以用这两个基本结构构造,HashMap ...

  7. Python 装饰器记录总结 (终极版)

    Python 装饰器记录总结 (终极版) 原文链接:http://magicroc.com/2017/04/10/Python装饰器记录总结/ 装饰器是一个函数,一个用来包装函数的函数,装饰器在函数申 ...

  8. hashMap怎么解决hash冲突的

    2019独角兽企业重金招聘Python工程师标准>>> 学Java的都知道hashMap的底层是"链表散列"的数据结构也也可以说是hash表.在put的实话先根据 ...

  9. Algorithm:C++语言实现之SimHash和倒排索引算法相关(抽屉原理、倒排索、建立查找树、处理Hash冲突、Hash查找)

    Algorithm:C++语言实现之SimHash和倒排索引算法相关(抽屉原理.倒排索.建立查找树.处理Hash冲突.Hash查找) 目录 一.SimHash算法 1.SimHash算法五个步骤 2. ...

最新文章

  1. 8位图像的双边滤波器实现
  2. Linux通过kaggle api下载kaggle数据集
  3. 实现redis 手动_Redis精华所在,一口气说完Redis的主从复制和哨兵模式
  4. pytorch学习之路
  5. cordova build android很慢,cordova build --release android命令打包下载gradle非常慢的问题...
  6. 使用webstorm操作git
  7. IntelliJ IDEA设置代码字体大小
  8. 机器视觉基础知识详解
  9. 【NLP】LSTM 唐诗生成器
  10. Python读取CSV文件,并进行数据可视化绘图
  11. Java里format什么意思_java String.Format详解
  12. 【python】13位时间戳转成正常格式的时间
  13. Java语言,什么是Java语言?Java的版本。
  14. 火狐插件油猴Greasemonkey系列二
  15. 【译】使用 AngularJS 和 Electron 构建桌面应用
  16. 新导部队营房室内人员定位系统解决方案
  17. 17.代理_CDN_网络安全
  18. 【Web编程实践课第二次作业】体育新闻世界
  19. 结构(structure)创建——直接赋值法与使用struct函数创建法。
  20. C语言游戏必备:光标定位和颜色设置

热门文章

  1. 自定义线程池-参数设计分析
  2. CentOS查看 占用 内存 最多的 进程
  3. 逆推继承看原型 函数的角色 函数声明和函数表达式的区别 函数中this指向的问题
  4. activemq使用
  5. python 预编译加速_让Python代码运行更快的最佳方式
  6. Allegro 光绘文件快速导入
  7. CAM350 10.7 中文界面
  8. 验证哥德巴赫猜想:任何一个大于6的偶数均可表示为2个素数之和
  9. 我的新宠Vue a系列 项目初构
  10. android单独刷入镜像