当前课程知识点:数据结构(下) > 第九章 词典 > (b)散列:原理 > 09B-3 数组
来看这样的一个具体实例
假设我们现在要某一所高校制作一本电话簿
也就是说 对于这个学校的每一位老师
学生以及员工 或者办公室
都可以通过这个电话簿直接找到对应的电话号码
现在我们再进一步的假设 还有反过来的需求
也就是像现在的任何一部智能手机那样
对于任何一个有记录的电话号码
都可以及时的给出机主的信息
那么这样一种需求应当如何来满足呢
我想略作思考之后
你很可能就会认为这个问题的难度其实并不高
是的 表面看来确实如此
甚至你不需要10行代码就能完成这个任务
比如你首先想到的很有可能就是数组 嗯 数组
这种方法的原理可以表示为这样一幅图
这里由上而下 就是一个线性数组
而在此区间之内的每一个秩
都对应于某一个电话号码
而每一个元素呢 就可以用来记录对应机主的信息
比如一种方法就是我们通过电话号码确定对应的秩
找到对应的单元 并根据对应单元所给的引用
间接的找到对应的机主
这个是这样 其他的以及每一个单元 都是这样
你甚至会说 啊这种方法不仅简明而且高效
因为正如我们所看到的
从任何一个电话号码找到对应的机主记录
只需常数的时间
难道还有比这更高的效率吗
是的 就时间效率而言 的确如此
但是不要忘了 同时还有另一个因素需要兼顾
对 空间
我们不妨来算一个帐
就以我所在的清华大学为例
不妨只考察座机 于是从理论上来说
清华大学所在的北京市的任何一部座机
都有可能属于清华
因此如果采用上述的数组方式
数组的规模将高达10的8次方 也就是100M
那么清华大学实际拥有的固定电话又有多少门呢
据我在10多年前所获得的不完全统计
大致是在2至3万门之间 不妨粗略的估作为25K
于是我们就可以大致的估算出空间的效率
具体来说也就是我们所用的空间总量
与其中真正有效的数据项之比
所谓不比不知道 一比吓一跳
可以看到空间效率只有万分之几
如此低下的效率是我们万万不能接受的
这样的实例还很多
这类应用的公共特点是
我们需要存储和组织的数据项
可能来自于一个相当大的空间
比如对于一个城市而言理论上讲的100M门固定电话
而在任何一个常规的时刻
我们所真正需要存储和组织的数据
只是其中非常非常小的一个子集
因此即便我们能够开出如此之大的数组
其空间效率也注定是极低的
那么如何破解这一难题呢
-选课之前
--写在选课之前
--宣传片
-考核方式
--考核方式
-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)希尔排序:逆序对
-本章测验
--本章测试