处理冲突的方法可以分为两大类:开放地址法和链地址法

开发地址法

  开放地址法的基本思想是:把记录都存储在散列表数组中,当某一记录关键字key的初始散列地址H0=H(key)发生冲突时,以H0为基础,采取合适方法计算得到另一个地址H1,如果H1仍然发生冲突 ,以H1为基础再求下一个地址H2,若H2仍然冲突,再求H3.依次类推,直至Hk不发生冲突为止,则Hk为记录在表中的散列地址。

  这种方法在寻找“下一个”空的散列地址时,原来的数组空间对所有的元素都是开放的,所以称为开放地址法。通常把寻找“下一个”空位的过程称为探测,上述方法可用如下公式表示

    Hi=(H(key)+di)%m     i=1,2,...,k (k<=m-1)

  其中,H(key)为散列函数,m为散列表表长,di为增量序列。根据di取值的不同,可以分为以下三种探测方法:

(1)线性探测法:

di=1,2,3,。。。,m-1

  这种探测方法可以将散列表假想成一个循环表,发生冲突时,从冲突地址的下一个单元顺序寻找空单元,如果到最后一个位置也没有找到空单元,则回到表头开始继续查找 ,直到找到一个空位,就把此元素放入空位中,如果找不到空位,则说明散列表已满,需要进行溢出处理。

(2)二次探测法

di=1^2, -1^2,  2^2, -2^2,...,+k^2 ,-k^2(k<=m/2)

(3)伪随机探测法

di=伪随机数序列

  例如,散列表的长度为11,散列函数H(key)=key%11,假设表中已填有关键字分别为17、60、29的记录,现在有第四个记录,其关键字为38,由散列函数得到散列地址为5,产生冲突。

  若用线性探测法处理时,得到下一个地址6,仍冲突;再求下一个地址7,仍冲突直到散列地址为 8的位置为“空”时为止,处理冲突的过程结束,38填入散列表中序号为 8的 位置。

  若用二次探测法,散列地址5冲突后,得到下一个地址6,仍冲突;再求得到下一个地址4,无冲突,38填入序号为4的 位置。

  若用伪随机探测法,假设产生的伪随机数为9,则计算下一个散列地址为(5+9)%11=3,所以38填入序号为3的位置。

  从上述线性探测法处理的过程中可以看到一个现象:当表中 i,i+1,i+2位置上已填有记录时,下一个散列地址为i、i+1、i+2和i+3的记录都将填入i+3的位置,这种在处理冲突过程中发生的两个第一散列地址不同的记录争夺同一个后续散列地址的现象称作“二次聚集(或称作“堆积”)”即在处理同义词的冲突过程中又添加了非同义词的冲突。

  可以看出,上述三种处理方法各有优缺点。线性探测法的优点是:只要散列表未填满,总能找到一个不发生冲突的地址:缺点是:会产生“二次聚集”现象。而二次聚集探测法和伪随机探测法的优点是:可以避免“二次聚集”现象;缺点也很显然:不能保证一定找到不发生冲突的地址。

链地址法

  链地址的基本思想是:把具有相同散列地址的记录放在同一个单链表中,称为同义词链表。有m个散列地址就有m个单链表,同时用数组HT[0...m-1]存放各个链表的头指针,凡是散列地址为i的记录都以结点插入到HT[i]为头结点的单链表中。

  

转载于:https://www.cnblogs.com/wuyepeng/p/9739885.html

哈希表(散列表)冲突解决方法相关推荐

  1. 数据结构:哈希表(散列表)基础

    哈希表(散列表)基础 引入哈希表 什么是哈西表: 一种具有相同特性的数据元素的集合,每个元素具有唯一标识自己的关键字. 基本原理: 说明: 顺序查找.二分查找或者二叉树的查找是基于待查关键字与表中元素 ...

  2. 查找算法【哈希表】 - 处理冲突的方法:开放地址法-线性探测法

    查找算法[哈希表] - 处理冲突的方法 无论如何设计散列函数,都无法避免发生冲突. 如果发生冲突,就需要处理冲突. 处理冲突的方法分为3种: 开放地址法 链地址法 建立公共溢出区. [开放地址法] 开 ...

  3. 2.10_hash_table_哈希表 / 散列表

    链表类 class LinkedList(object):"""链表类"""class Node(object):def __init__( ...

  4. 哈希表and处理冲突的方法

    哈希法又称散列法.杂凑法以及关键字地址计算法等,相应的表称为哈希表.这种方法的基本思想是:首先在元素的关键字k和元素的存储位置p之间建立一个对应关系f,使得p=f(k),f称为哈希函数.创建哈希表时, ...

  5. 【数据结构笔记39】哈希表/散列表、(数据关键字/字符串关键字)散列构造函数

    本次笔记内容: 11.1.1 引子:散列的基本思路 11.1.2 什么是散列表 11.2.1 数据关键词的散列函数构造 11.2.2 字符串关键词的散列函数构造 文章目录 散列表背景 基本思想引出 已 ...

  6. 开局一张图帮你充分理解哈希表(散列表)

    目录 1哈希表的概念: 1.1哈希表的插入图示: 1.2哈希表的查询图示: 2.哈希冲突 2.1哈希冲突的概念: 2.2避免冲突 2.2.1哈希函数设计 2.2.2负载因子的调节 3.解决冲突 3.1 ...

  7. 算法小讲堂之哈希表|散列表|考研笔记

    文章目录 一. 基本概念 二. 哈希函数|散列函数 2.1 直接定址法 2.2 保留余数法 2.3 数字分析法 2.4 平方取中法 2.5 折叠法 2.6 随机数法 三.冲突处理 3.1 开放定址法 ...

  8. C++--哈希表--散列--冲突--哈希闭散列模拟实现--问答--1107

    1.哈希 概念 可以不经过任何比较,直接从表中得到要搜索的元素. 关键在于通过某种散列函数,使元素的存储位置与它的关键码之间能够建立 一一映射的关系.这样就可以通过o(1)的时间复杂度来寻找到元素. ...

  9. 哈希表(散列表)介绍

    目录 前言 一.哈希概念 1.1 什么时哈希表 1.2 哈希函数 1.3 哈希冲突 1.4 哈希冲突的解决 1.4.1 闭散列 1.4.2 开散列 1.4.3 问题 前言 哈希表时C++11两容器un ...

  10. JavaScript 哈希表(散列表)实现和应用

    查找的效率与比较次数密切相关.基于比较的程序,运算效率是比较低的.比如平时可以通过indexOf查找一个数据.但这是一个基于比较的一个实现.如果是淘宝那样有上亿个商品,那么用indeOf 来查数据就会 ...

最新文章

  1. ant 获取当前url的参数
  2. 没听说过这些,就不要说你懂并发了,three。
  3. cnblogs_504 Gateway Time-out
  4. 【剑指offer】面试题31:栈的压入、弹出序列(Java)
  5. 有知其下落者的nanshan
  6. sparkpython多线程_如何在PySpark(Spark流)中组合多个rdd?
  7. 205615872 能用来干么?
  8. SpringBoot项目 四种读取properties文件的方式
  9. iOS音频采集技术解读:如何实现男女变声的音效?
  10. Java解析省市县树形结构工具类
  11. windows“运行”自定义“命令”的实现
  12. 百度地图拾取坐标工具-toolfk程序员在线工具
  13. Linux C 库打桩技术
  14. YTU 3084 返回指针的函数
  15. 用树莓派制作视频监控器
  16. 2022年69 个经典 Spring 面试题和答案,值得收藏
  17. GsyVideoPlayer视频分析使用
  18. 制作深度操作系统U盘启动盘
  19. linux vi etc fstab,vi /etc/fstab开机挂载及使用教程分享-学派吧
  20. linux startx 鼠标指针,支持各主流浏览器使用的鼠标拖动和拖拽的鼠标指针特效...

热门文章

  1. SSP控制寄存器SSPCON
  2. apache网络服务的搭建和配置
  3. thymeleaf学习笔记
  4. leetcode之Contains Duplicate
  5. 学用MVC4做网站五:5.2我的文章
  6. 电大计算机阅读英语作文,(2017年电大)电大英语作文整理20篇.doc
  7. mysql binlog rotate_mysql binlog日志存储格式
  8. redis-shake数据同步迁移工具
  9. 块裁剪后的矩形边界如何去掉_如何3分钟剪辑出满意的视频号视频?
  10. 在 CentOS 上安装 Docker 引擎