当前课程知识点:数据结构(下) > 第九章 词典 > (b)散列:原理 > 09B-4 原理
实际上 我们刚才介绍的数组方法并非一无是处
就原理而言 只需再向前略作改进 也就成为了散列
为此需要首先统一一些名词
比如在这里数组中的每一个单元将被称作为桶bucket
其中可能直接存放某一个词条
也可能存放的是一个词条的间接引用
而以上所说的数组 在这里将被称为是桶数组
bucket array
或者直接的称之为散列表 hash table
我们也统一的将散列表的长度记作M
而这里的核心技巧恰恰就在于散列表长度的选取
首先散列表至少应该能够足以容纳所有的待存放元素
因此这个不等号也就必须满足
其次正如我们已经看到的 直接应用数组的方法
它的致命缺点在于 所使用的空间远远过大
因此所谓的散列表
也可以认为是对这个空间做了一个适当的压缩
既然散列表的长度关乎我们的空间效率
所以这种压缩 必须是实质性的
也就是说 在数量级上M要实质的远远小于R
尽管M必须大于N
但是为了实现尽可能高的效率
M还是应该与N尽可能的同阶
这样我们实际所花费的空间量
就能够控制在线性的范围以内
那么这种思路如何兑现呢
你应该记得 在此前那种朴素的数组方法中
对于任何一个关键码 我们都可以在O(1)的时间内
直接得到对应的记录 或者它的间接引用
而在做过空间压缩的现在 这个功能又当如何实现呢
如果将这种确定目标词条位置的功能 称作为定址
那么具体的定址方法也就是我们所说的散列hashing
为了完成散列定制 我们需要在事先确定一个散列函数
借助这个函数
可以将任意关键码转换为对应的词条或它的入口
在这个原理图中
原先一蹴而就的过程 被分解为了两步
也就是将任意给定的关键码
通过hash function转换为散列表中的某一个桶单元
并且进而通过这个桶单元 找到目标词条
尽管整个过程多了一些曲折
但是正如我们最终将要看到的
只要散列函数设计与实现得当
我们就可以将整个过程所需要的时间控制在期望的常数范围以内
那么这里的散列表应当如何压缩并得到呢
相应的散列函数 又当如何设计呢
-选课之前
--写在选课之前
--宣传片
-考核方式
--考核方式
-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)希尔排序:逆序对
-本章测验
--本章测试