目录
百战程序员,全站22050+开发课程+文档 ,学习精选优质好课快人一步!观看视频 快捷键ALT+N

Python全系列 教程

3567个小节阅读:5930.6k

收藏
全部开发者教程

鸿蒙应用开发

C语言快速入门

JAVA全系列 教程

面向对象的程序设计语言

Python全系列 教程

Python3.x版本,未来主流的版本

人工智能 教程

顺势而为,AI创新未来

大厂算法 教程

算法,程序员自我提升必经之路

C++ 教程

一门通用计算机编程语言

微服务 教程

目前业界流行的框架组合

web前端全系列 教程

通向WEB技术世界的钥匙

大数据全系列 教程

站在云端操控万千数据

AIGC全能工具班

A

A A

White Night

阅读(211)
赞(0)

哈希冲突

image-20220904222600697

若key(关键字)为n,则其值存放在 f(n) = n % size 的存储位置上。由此,不需比较便可直接取得所查记录。称这个对应关系f函数为哈希(散列)函数,按这个思想建立的表为哈希(散列)表

但对不同的关键字可能得到同一散列地址,即n1 ≠ n2,而f(n1)==f(n2),这种现象称为冲突

在设计哈希表的时候,最需要注意两个基本因素:一个是散列函数的编写,一个是键冲突解决算法

散列函数

哈希表中元素的位置是由哈希函数确定的。将数据n作为自变量,通过一定的函数关系计算出的值,即为该元素的存储地址。

  • 直接定址法

    • 直接使用key的某些部分作为存储地址,适用于关键字的取值范围不大的情况
    • 假设我们有一组学生ID,并决定使用学生ID本身作为哈希地址,公式:哈希地址 = 学生ID
  • 数字分析法

    • 针对key的数位进行分析,选择具有代表性的数位作为哈希地址。适用于关键字具有一定规律的情况
    • 假设我们有一组社交安全号码,我们选择使用最后两位数字作为哈希地址
    • 对于123-45-6789,我们取最后两位89作为哈希地址
  • 平方取中法

    • 将关键字的平方值的中间一部分作为哈希地址。适用于关键字分布较均匀的情况
    • 假设我们有一组三位数,我们将每个数字平方,然后取中间的数字作为哈希地址
    • 对于数字456,平方得到207936。取中间两位数字,哈希地址为79
    • 公式:哈希地址 = 取中位数字(平方(关键字))
  • 折叠法

    • 将关键字分割成固定长度的片段,然后将这些片段相加,再取余数作为哈希地址。适用于关键字长度较长的情况。
    • 考虑一组电话号码(例如,123-456-7890)。我们可以将数字分成两位一组,求和,然后取模得到哈希地址
    • 对于电话号码123-456-7890,哈希地址将是(12 + 34 + 56 + 78 + 90) % 表大小
    • 公式:哈希地址 = 组的数字之和(关键字) % 表大小
  • 随机数法

    • 使用一个随机数生成器产生哈希地址。适用于关键字分布随机的情况
  • 除留余数数法(常用)

    • 将关键字除以某个不大于哈希表大小的数,取余数作为哈希地址
    • 哈希地址 = 关键字 % 表大小

哈希冲突处理的办法

  1. 单独链表法(常用)

    将具有同一散列地址的记录存储在一条线性链表中

    image-20220829000517170

  2. 开放定址法 $hash(key)+n \quad mod \quad len(table)$

    • n为冲突的次数,线性探测
    • n值为冲突次数的平方,平方探测
  3. 双散列 $h_i(k) = (hash_1(k)+i*hash_2(k))$

    使用第二个哈希函数来计算步长,以决定下一个探测的位置

  4. 再散列

    当哈希表变得太满时,增加表的大小并重新散列已有的关键字,以减少冲突的可能性

  5. 建立一个公共溢出区

实时效果反馈

1. 关于哈希表,说法错误的是?

A 哈希表是通过key映射到表中一个位置来访问记录

B 设计哈希表基本之一为:哈希函数的编写

C 设计哈希表基本之一为:键冲突解决算法

D 哈希表可以存储重复数据

答案

1=>D

北京市昌平区回龙观镇南店村综合商业楼2楼226室

©2014-2023 百战卓越(北京)科技有限公司 All Rights Reserved.

京ICP备14032124号-2