- 1、本文档共18页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
数据库--线性散列
线性散列 散列表 定义:散列又叫哈希,它是根据哈希函数和冲突处理的方法将一组关键字影射到一个有限的连续地址集上,并以关键字在地址集中的“象”作为存储位置。 优势:跟一般的查找方法(如线性表、树等)相比。它在定位过程中不用进行关键字的比较,查找效率不依赖查找过程所进行的比较次数,记录存储位置和关键值存在着一个确定的对应关系,通过关键值就可以影射到其存储地址。因此具有较高的查找效率。 静态散列 桶的数目B固定,从来不改变的。可以存在溢出桶。 静态散列表索引的缺点:当数据库数据增加,初始的Bucket太小, 需要建立溢出块。如果一个索引中大部分的桶都有溢出块,将影响查找效率。 因此引入了动态散列表索引:可扩展散列表,线性散列表。 动态散列 动态散列表允许B的改变,使B近似于记录总数除以块中能容纳的记录数所得到的商;也就是说,每个桶大约有一个存储块。 动态散列表可以分为两种: 可扩展散列 线性散列 可扩展散列表 它在简单的静态散列表结构上主要增加了: 为桶引入了一个简接层,即用一个指向块的指针数组来表示桶,而不是用数据块本身组成的数组来表示桶。 指针数组能增长,它的长度总是2的幂,因而数组每增长一次,桶的数目就翻倍。 并非每个桶都有一个数据块;如果某些桶中的所有记录都可以放在一个块中,那么这些桶可能共享一个块。 可扩展散列表 这种方法是认为B太小时即将其加倍,最然是可以动态的增加桶的数目,但是也有些自身的缺点: 当桶的数组需要翻倍时,要做大量的工作。这些工作会阻碍对数据文件的访问,或是使某些插入看来花费很长的时间。 当桶数翻倍后,它在主存中可能就装不下了,或者把其他的一些我们需要保存的数据挤出去。其结果是,一个运行良好的系统可能突然之间每个操作所需的从盘I/O开始大增,并且出现明显的性能下降。 线性散列表 正是由于可扩展散列表的一些缺点,我们引入了另一种策略:线性散列表,其中桶的增长较为缓慢。在线性散列中出现了一些新的要点: 桶数n的选择总是使存储块的平均记录数保持与存储块所能容纳的记录总数成一个固定的比例,如80%。 由于存储块并不是可以分裂,所以允许有溢出块,尽管每个桶的平均溢出块数远小于1。 线性散列表 用来做桶数组项序号二进制位数是[ ],其中n是当前的桶数。这些位总是从散列函数得到的位序列的右(低位)端开始取。 假定散列函数值的i位正在用来给桶数组项编号,且有一个键值为K的记录想要插入到编为 的桶中;即 是 的后i位。那么,把 当作二进制整数,设它为m。如果mn,那么编号为m的桶存在并把记录存入该桶中。如果n m ,那么桶m还不存在,因此我们把记录存入桶m ,就是当我们把 (它肯定是1)改为0时对应的桶。 线性散列表的基本组织结构 例题1. 图1所示为一个n=2的线散列表。并用散列值的一位来确定记录所属的桶(i=1)。并假定散列函数产生四位,用将散列函数作用到记录的查找键上所产生的值来表示记录。 现在我们来详细的分析下这个线性散列的大致结构,提出一些注意事项帮助大家的学习。 我们在图1中看到两个桶,每个桶包含一个存储块,标号分别为0和1。并且散列值的最后一位为0的放入第0号桶中,最后一位为1的放入第1号个桶中。 参数i(当前被使用的散列函数值的位数)、 n(当前的桶数)和r(当前散列表中的记录总数),这些参数和数据共同构成了线性散列表。 比率r/n将受到限制,使一般的桶都只需要约一个磁盘存储块。在选择桶数n时,要注意的策略是使文件中的记录个数不超过1.7n,即r=1.7n。 线性散列表的插入 在进行插入时注意的细节问题: 插入一个新记录时,我们计算 ,其中K是记录的键,并确定 序列后面用做桶号的正确位数。并将记录放入该桶,或者(在桶号大于等于n时)放入把第一个二进制由1改为0后确定的桶中。如果桶没有空间,那么我们创建一个溢出块,连接在那个桶上,并将记录存入该溢出块中。 每次插入,必须用当前的记录总数r于阀值r/n比较,若比率太大,就增加下一个桶到线性散列表中。 一个重要的细节就是:当n超过 时的情况。这时参数i就递增1。 线性散列表的插入 例题2 我们考虑在例题1的散列表中,插入键值散列为0101的记录。因为其最后一位为1,记录应插入到第二个桶中,即第1号桶。桶中有空间,不需要创建溢出块。 存在的问题: 首先,现在2个桶里有四个记录,不能保证r=1.7n,超出比率,因此,我们必须把n提高到3。 其次,当n=3时, =2,应
文档评论(0)