《数据库系统概念》14-静态散列

顺序文件组织的缺点之一是必须通过访问索引或使用二分法搜索来定位数据,这需要较多的I/O操作。基于散列技术的文件组织方式则不需要访问索引结构,散列也提供了一种组织索引的方式。
在散列(hash)技术中,用桶(bucket)来表示能存储一条或多条记录的存储单元。如果K代表所有搜索码的集合,B代表所有bucket的集合,则散列函数h表示一个从K到B的映射函数。
插入搜索码为Ki的记录时,通过散列函数计算h(Ki)得出bucket的地址,如果这个bucket还有空间,就将数据插入。
查询Ki时,也是先通过h(Ki)得出bucket的地址,但bucket中往往有多条记录,这时就需要进一步根据搜索码在bucket内部搜索。
散列可以有两种用途,在散列文件组织中,通过散列函数直接定位记录所在的磁盘块;在散列索引组织中,把搜索码和指针组织成一个散列文件结构。
a) 散列函数
合理地选择散列函数非常重要,否则可能导致记录被集中映射到少数几个bucket的情况。要求散列函数的分布特性是均匀、随机的,既每个bucket被分配到的记录数应该是相等的,而且分配结果与搜索码本身的顺序无关。
典型的散列函数是根据搜索码的二进制值进行计算的,比如可以计算二进制所有位的和,然后取模。一个结果良好设计的散列函数应不受记录数量的影响,而具有稳定的搜索效率。
b) Bucket溢出的处理
如果记录被映射到一个Bucket时Bucket以及没有可用空间,就会发生溢出。溢出的原因可能是因为随着记录数的增长,没有足够的bucket;也可能是因为散列函数设计不合理或者存在太多相同的搜索码,导致记录被集中映射到某些bucket,而一个bucket能容纳的记录是有限的,这种情况称为桶偏斜(bucket
skew)。
为了应对bucket溢出,可以在确定bucket数量时留一定的余量,但这会造成空间浪费;也可以使用溢出桶(overflow
bucket)来接收溢出记录:一旦发生溢出,就新增一个溢出桶,以接收溢出记录,溢出桶与原始桶构成链表(overflow
chaining),于是查找数据时,要增加对是否存在溢出桶的探查,如果存在,则进一步在溢出桶中搜索。
这种静态散列的缺点在于必须在设计阶段确定好bucket的数量,随着记录的数的增加或收缩,bucket数无法跟随变化,会造成溢出或空间浪费。
c) 散列索引
除了散列文件组织,还可以用散列的方式组织索引。将散列函数作用于搜索码以确定对应的桶,然后将此搜索码以及相应的指针存入。

学习资料:Database System Concepts, by Abraham Silberschatz, Henry F.Korth, S.Sudarshan

原文地址:https://www.cnblogs.com/zhixin9001/p/8111328.html

时间: 2024-11-05 22:37:47

《数据库系统概念》14-静态散列的相关文章

数据结构与算法分析java——散列

1. 散列的概念 散列方法的主要思想是根据结点的关键码值来确定其存储地址:以关键码值K为自变量,通过一定的函数关系h(K)(称为散列函数),计算出对应的函数值来,把这个值解释为结点的存储地址,将结点存入到此存储单元中.检索时,用同样的方法计算地址,然后到相应的单元里去取要找的结点.通过散列方法可以对结点进行快速检索.散列(hash,也称“哈希”)是一种重要的存储方式,也是一种常见的检索方法. 按散列存储方式构造的存储结构称为散列表(hash table).散列表中的一个位置称为槽(slot).散

散列的基本概念、构造散列函数以及解决冲突

散列定义 散列表(Hash Table,也称哈希表),是一种根据键(Key)而直接访问在内存存储位置的数据结构.也就是说,它通过计算一个关于键值的函数,将所需查询的数据映射到表中一个位置来访问记录,这加快了查找速度.这个映射函数称为散列函数,存放记录的数组称做散列表. 散列基本概念 1.若其关键字为k,则其值存放在 f(k) 的存储位置上.因此不需要比较即可直接取得所查记录.称这个对应关系 f 为散列函数,按照这个思想建立的表叫散列表. 2.对不同的关键字可能得到同一个散列地址,即k1 != k

散列算法与散列码

一.引入 1 /** 2 * Description:新建一个类作为map的key 3 */ 4 public class Groundhog 5 { 6 protected int number; 7 8 public Groundhog(){ 9 } 10 public Groundhog(int number) 11 { 12 this.number = number; 13 } 14 15 @Override 16 public String toString() 17 { 18 ret

散列、加密、编码 漫谈

散列(又叫Hash)和加密在身份校验.敏感信息传输等应用中用途广泛. 把他们放在一起写的原因是,网上太多资料,将散列和加密的概念混为一谈,误导性极大. 由于编码/解码运算和上述二者有一定的相似之处,因此放在这里一并讲述. 注:本文中,为了表述严谨,所有的"位"代表的是字符个数之意,而bit则指代计算机数据中的基本单位比特. 1.三者的共同点 它们都表述了一种映射关系,将原始数据A映射到新的数据B. 在散列运算中,B一般称之为摘要,英文为digest. 其代表算法有MD5,SHA1, S

散列(C++实现)

散列的构成:散列函数,散列表的存储方式,散列表的冲突解决方法. 1.散列函数 较常用的散列函数有除留余数法,数字分析法,平方取中法,折叠法. 2.散列表的存储方式 闭散列法(开地址法),用数组存储:开散列法(链地址法),用邻接链表存储. 3.散列表的冲突解决方法 主要是针对闭散列中关键码位置冲突的问题,常用的方法有线性探查法,二次探查法,双散列法. 性能分析:在存储方式中,开散列法优于闭散列法:在散列函数中,除留余数法最优. 实现代码: 1 #include<iostream> 2 using

没事写个散列玩~

感觉散列的查找性能真心不错,如果使用普通线性结构查找,平均时间是n/2.而刚才用实验,256大小的散列,存储128个数据,平均时间为2次以内.感觉真心NB 1 #include <iostream> 2 #include <vector> 3 #include <string> 4 #include <cstdlib> 5 #include <ctime> 6 7 using namespace std; 8 typedef bool BOOL;

HashMap实现 Hash优化与高效散列

OverView Hash table based implementation of the Map interface. This implementation provides all of the optional map operations, and permits null values and the null key. (The HashMap class is roughly equivalent to Hashtable, except that it is unsynch

非对称算法,散列(Hash)以及证书的那些事

转载请注明出处 http://blog.csdn.net/pony_maggie/article/details/35389657 作者:小马 这几个概念在金融电子支付领域用得比较多,我忽然觉得把它们串起来一起讲,层层引入,可能更好理解一些.希望能以最简单朴实的方式讲明白他们之间的关系. 一非对称算法 关于非对称算法,你只要知道下面这些就行了,密钥是一对,一个叫公钥,一个叫私钥,前者公开,后者保密.假设你有一对公私钥,给你一串数据,你可以用私钥加密,然后把密文和公钥都放出去,别人可以用这个公钥解

《数据库系统概念》学习笔记2

第二章       关系模型 a.关系代数基本运算有:选择.投影.并.集合差.笛卡尔积.和更名 b.附加的关系代数运算:集合交.自然连接.除运算.赋值运算. c.扩展的关系代数运算:广义投影,聚集函数,外连接 d.数据库的修改:删除,插入,更新 小结 A.关系数据模型建立在表的集合的基础之上.数据库系统的用户可以对这些表进行查询,可以插入新元组.删除元组以及更新(修改)元组. B.关系代数定义了一套在表上运算,且输出结果也是表的代数运算.这些运算可以混合使用以得到表达所希望查询的表达式.关系代数