POSTGRESQL 中用到的哈希算法解读(jung)
来源:互联网 发布:网络被骗了去哪里报警 编辑:程序博客网 时间:2024/06/15 06:07
哈希算法简介
1、哈希概念:
在线性表、树等数据结构中,数据的记录在结构中的相对位置是随机的,记录的关键字之间的不存在确定的关系。基于这类结构的数据查找是建立在比较的基础之上,因此查找的效率依赖于查找过程中比较的次数。理想情况下,哈希表的记录位置和关键字之间存在着确定的关系,不需要经过任何的比较,一次存取就能够找到所查询的记录。查找的效率为O(1).
2、哈希函数的构造:
直接寻址法:取关键字或关键字的某个线性函数值为散列地址。即H(key)=key或H(key) = a·key + b,其中a和b为常数。
3、冲突处理技术:
因为实际的存储空间有限,所以系统没有申请包含所有关键值数目的空间。在压缩的空间范围内,必然会存在两个关键的字映射到同一空间上,这就是所谓的“碰撞”。在postgresql中解决碰撞的方法是链接法(chaining)。
(一)链接法(chaining)
如上图所以,理想情况下,每一个关键字对应的实际数据只有一个,如果在关键字6 上产生冲突,采用链接法来解决的话,结果是 6 后面跟着一个链表的数据结构,每一个元素都映射到关键字6上。
链接发性能分析:
简单一致散列(simple uniform hashing):任何元素散列到m个槽中的每一个的可能性是相同的,且与其他的元素已经散列到什么位置上是独立无关的;
装填因子(load factor)a = n/m ,即一个链中平均存储的元素数目;
定理1:对每一个用链接技术来解决碰撞的散列表,在简单一致散列的假设下,一次不成功查找的期望时间是O(1+a).
证明:根据简单一致散列的假设,任何尚未被存储到表中的关键字都是等可能地散列到任何一个槽中,因此查找不成功的情况就是只查找到某一链表的末尾。因此查找的时间是和链表的平均长度有关的。而链表的平均长度是n/m,即装填因子大小。
定理2:对每一个用链接技术来解决碰撞的散列表,在简单一致散列的假设下,平均情况下一次成功查找的期望时间是O(1+a).
证明:1、首先引入指示器随机变量的概念:给定一个样本空间S和事件A,则A的指示器随机变量为 I(A) , I(A) = 1 事件A发生; I(A) = 0 事件A不发生;则E(I(A)) = P(A)
2、设xi 为第 i 个插入的元素,xj 为第 j 个插入的元素,(j>=i+1)Xij 表示第i个元素和第j个元素映射到相同的槽事件,I(Xij)为Xij的指示器随机变量。则I(Xij) = 1 事件Xij发生,否则I(Xij) = 0 事件Xij不发生;
因为每一个新插入的元素都是位于链表的最前端,所以可以通过统计I(Xij)来指示xi前有多少个元素,从而统计出查找的时间。然后将所有元素的查找时间进行平均化处理,得出平均情况下成功查找的期望时间。设槽位数为 m,链表元素个数为n
a=n/m.所求期望查找次数为
因此 期望时间为O(1+a)
- POSTGRESQL 中用到的哈希算法解读(jung)
- postgresql src/backend/storage/file/fd.c 源代码解读 (jung)
- postgresql 内存上下文的理解和代码示例(一)(jung)
- POSTGRESQL 存储管理之外存管理(一)(jung)
- .Net 开发中用到的MVVM Light Toolkit源码解读
- JUNG
- 编程中用到的一些算法
- Tween中用到的缓动算法
- 数据结构算法中用到的存储结构
- 雷德算法 (快速傅里叶变换中用到的倒位序算法)
- Lucene的FuzzyQuery中用到的Levenshtein Distance(LD)算法
- oj中用到的一些数学上的算法
- java中的分布式应用(二)之各类中间件中用到的算法
- 网络爬虫中用到的宽度优先遍历算法
- HONGJIN2游戏开发中用到的排序算法有很多
- iOS中用到的3DES密码算法
- iOS开发学习中用到的3DES密码算法
- 机器学习算法中用到的R添加包
- Mantis平台配置手册
- 技术选择 - 为什么我们选择CentOS而不是Debian/Ubuntu
- kd-tree
- C++虚析构函数、纯虚析构函数
- 服务器层级
- POSTGRESQL 中用到的哈希算法解读(jung)
- 如何使用C#语言实现原型模式
- 《消费者行为学》读书笔记 第二章 知觉
- iOS标准时间与时间戳相互转换
- 风险投资者不青睐你的5个原因
- java-sleep()和wait()的区别
- Tomcat配置log4j
- 灯火阑珊,一夜芳醉年华:QQ空间伤感日志
- 素数判断(某公司实习生招聘笔试题目)