当前课程知识点:数据结构(下) > 第九章 词典 > (c)散列:散列函数 > 09C-1 冲突难免
好 接下来的这一节我们就来介绍散列策略中的第一项
也是最重要的技术 散列函数的设计与定制
在上一节我们已经看到
散列策略具有诸多的优势和巨大的潜力
然而尽管如此 冲突却是这一策略的致命缺陷
然而更糟糕的是 从理论上讲 这一缺陷是无法根本消除的
依然回到我们电话键盘的实例
借助字符来助记电话号码的策略 尽管十分精巧
但同样不难举出冲突的实例
比如有时你需要找某个人
但对应的号码却有可能属于某个学院
你要找的或许是欧几里得 但这个电话却有可能属于小黄鸭
你可能需要联系太阳鸟 但接听这个电话的却可能是只臭虫
凡此种种 皆是冲突
我们知道散列函数无非是一个映射
其功能无非是将词条空间中的元素映射到散列表地址空间
而在通常的情况下 前者要远远的大于后者
因此绝不可能是一个单射
当然面对这种现实 我们并非无可作为
这方面的一条好消息是 在一般的实际应用中
我们还是可以在一定的程度上得到一个近似的单射
比如黑白打印机经常要做的一件事就是
将原本是彩色的图像 转换为黑白灰度
从映射的角度来看 这样一种转换也是散列
对于这个散列而言
数据项的取值范围应该是图像中各像素可能取的颜色种类数
也就是2的24次方
而散列表的长度呢 也就是灰度的级别 2的8次方
二者之间的差异 已高达10的4至5次方
然而尽管经过了如此之大幅度的压缩
对我们辨识灰度图像中的物体 并没有多大的影响
当然这主要得益于图像中各像素在空间上是有一个分布的
然而即便离开这个条件 一般意义上的散列
也是有可能做得足够实用的
为此我们需要做两件事 这也是实现散列的两项基本任务
首先我们需要精心的设计散列表及其对应的散列函数
消除掉一些能够导致冲突的先天性因素
从而尽可能的压低日后发生冲突的概率
这也是本节讨论的主题
当然既然无论如何都不可能从根本上消除冲突
所以我们也应该在事先准备好充分的预案
日后一旦发生冲突 我们就可照此预案及时予以排解
关于冲突的排解技巧 我们将留到下一节
-选课之前
--写在选课之前
--宣传片
-考核方式
--考核方式
-OJ系统说明
--关于OJ
--1-注册与登录
--2-界面与选课
--3-提交测试
-关于课程教材与讲义
--课程教材与讲义
-关于讨论区
--关于讨论区
-微信平台
--html
-PA晋级申请
--PA晋级
-(a)概述
--07A-1 纵览
--07A-5 接口
-(a)概述--作业
-(b1)BST:查找
-第七章 二叉搜索树--(b1)BST:查找
-(b2)BST:插入
-(b2)BST:插入--作业
-(b3)BST:删除
-第七章 二叉搜索树--(b3)BST:删除
-(c)平衡与等价
-(c)平衡与等价--作业
-(d1)AVL树:重平衡
-第七章 二叉搜索树--(d1)AVL树:重平衡
-(d2)AVL树:插入
-(d2)AVL树:插入--作业
-(d3)AVL树:删除
-(d3)AVL树:删除--作业
-(d4)AVL树:(3+4)-重构
-(d4)AVL树:(3+4)-重构--作业
-本章测验
--章节测验
-(a1)伸展树:逐层伸展
--习题
-(a2)伸展树:双层伸展
--习题
-(a3)伸展树:算法实现
--习题
-(b1)B-树:动机
--习题
-(b2)B-树:结构
--习题
-(b3)B-树:查找
--习题
-(b4)B-树: 插入
--习题
-(b5)B-树: 删除
--习题
-(xa1)红黑树:动机
--习题
-(xa2)红黑树:结构
--习题
-(xa3)红黑树:插入
--习题
-(xa4)红黑树:删除
-本章测验
--习题
-(b)散列:原理
--09B-3 数组
--09B-4 原理
--09B-5 散列
--09B-6 冲突
--习题
-(c)散列:散列函数
--习题
-(d1)散列:排解冲突(1)
--习题
-(d2)散列:排解冲突(2)
--习题
-(e)桶/计数排序
--习题
-本章测验
--本章测试
-(a1)需求与动机
--习题
-(a2)基本实现
--习题
-(b1)完全二叉堆:结构
--习题
-(b2)完全二叉堆:插入与上滤
--习题
-(b3)完全二叉堆:删除与下滤
--习题
-(b4)完全二叉堆:批量建堆
--习题
-(c)堆排序
--习题
-(xa1)左式堆:结构
--习题
-(xa2)左式堆:合并
--习题
-(xa3)左式堆:插入与删除
-本章测验
--本章测试
-(a)ADT
--习题
-(b1)串匹配
--习题
-(b2)蛮力匹配
--习题
-(c1)KMP算法:从记忆力到预知力
--习题
-(c2)KMP算法:查询表
--习题
-(c3)KMP算法:理解next[]表
--习题
-(c4)KMP算法:构造next[]表
--习题
-(c5)KMP算法:分摊分析
--习题
-(c6)KMP算法:再改进
-(d1)BM_BC算法:以终为始
-(d2)BM_BC算法:坏字符
-(d3)BM_BC算法:构造bc[]
-(d4)BM_BC算法:性能分析
-(e1)BM_GS算法:好后缀
-(e2)BM_GS算法:构造gs表
-(e3)BM_GS算法:综合性能
-(f1)Karp-Rabin算法:串即是数
-(f2)Karp-Rabin算法:散列
-本章测验
--本章测试
-(a1)快速排序:算法A
-- 12a1-5: 实例
--习题
-(a2)快速排序:性能分析
--习题
-(a4)快速排序:变种
-(b1)选取:众数
-(b3)选取:通用算法
--习题
-(c1) 希尔排序:Shell序列
--习题
-(c2)希尔排序:逆序对
-本章测验
--本章测试