`

静态索引结构

阅读更多

索引结构

 

来源:http://blogold.chinaunix.net/u2/61062/showart_2035566.html

 

 

索引结构和散列结构是用在外部搜索的搜索结构。

数据在外存中的组织的方式也就是文件结构,主要分成顺序、直接存取(散列)、和索引结构。

在文件组织中主要使用的是索引和散列方法。

下面是殷人昆老师的书中介绍的索引结构

 

静态索引结构

当数据对象个数 很大时,如果用无序表形式的静态搜索结构存储,采用顺序搜索,则搜索效率极低。如果采用有序表存储形式的静态搜索结构,则插入新记录进行排序,时间开销也很可观。这时可采用索引方法来实现存储和搜索。

线性索引 (Linear Index List)

线性索引分成两种:稠密索引和稀疏索引

稠密索引

一个索引项(位于索引表)对应数据表中一个对象的索引结构。当对象在外存中按加入顺序存放而不是按关键码有序存放时必须采用稠密索引结构,这时的索引结构叫做索引非顺序结构

例如下图:


稀疏索引

当对象在外存中有序存放时,可以把所有 个对象分为 个子表()存放,一个索引项对应数据表中一组对象(子表).在子表中,  所有对象可能按关键码有序地存放,  也可能无序地存放。但所有这些子表必须分块有序后一个子表中所有对象的关键码均大于前一个子表中所有对象的关键码。它们都存放在数据区中。另外建立一个索引表。索引表中每一表目叫做索引项,它记录了子表中最大关键码max_key以及该子表在数据区中的起始位置obj_addr。见下图所示:

 

各个索引项在索引表中的序号与各个子表的块号有一一对应的关系:第 个索引项是第 个子表的索引项,  = 0, 1, …, n-1。这样的索引结构叫做索引顺序结构

对索引顺序结构进行搜索时,一般分为两级搜索。

(1)先在索引表 ID 中搜索给定值 K,确定满足 ID[i-1].max_key < K <=ID[i].max_key  值,即待查对象可能在的子表的序号。

(2)然后再在第 个子表中按给定值搜索要求的对象。

索引表是按max_key有序的,且长度也不大,可以对分搜索,也可以顺序搜索。

各子表内各个对象如果也按对象关键码有序,可以采用对分搜索或顺序搜索;如果不是按对象关键码有序,只能顺序搜索。

 

倒排表

基于属性的倒排

在一个带结构的记录文件中,如数据库文件等。文件里存放的都是一条接着一条的整齐的记录,每个记录又可分为一个个的属性。检索过程往往要求找出,在某个或者某些属性上满足一定条件的记录集合。像这一类的检索我们称为基于属性的检索。

对包含有大量数据对象的数据表或文件进行搜索时,最常用的是针对对象的主关键码建立索引。主关键码可以唯一地标识该对象。用主关键码建立的索引叫做主索引

索引的每个索引项给出对象的关键码和对象在表或文件中的存放地址。

对象关键码key

对象的存储地址addr

在实际应用中有时需要针对其它属性进行搜索。例如,查询如下的职工信息:

(1) 列出所有教师的名单;

(2) 已婚的女性职工有哪些人?

这些信息在数据表或文件中都存在,但都不是关键码,为回答以上问题,只能到表或文件中去顺序搜索,搜索效率极低。

因此,除主关键码外,可以把一些经常搜索的属性设定为次关键码,并针对每一个作为次关键码的属性,建立次索引

在次索引中,列出该属性的所有取值(次关键码),并对每一个取值建立有序链表,把所有具有相同属性值的对象按存放地址递增的顺序或按主关键码递增的顺序链接在一起

索引的索引项由次关键码、链表长度和链表本身等三部分组成

为了回答上述的查询,我们可以分别建立“性别”、“婚否”和“职务”次索引


倒排表或倒排文件是一种次索引的实现。在倒排表中所有次关键码的链都保存在次索引中,仅通过搜索次索引就能找到所有具有相同属性值的对象。

 

在次索引中记录对象存放位置的指针可以用主关键码表示,可以通过搜索次索引确定该对象的主关键码,再通过搜索主索引确定对象的存放地址。

了倒排文件,我们就可以将查询变成几个集合之间的交,并等运算,得到的最后结果即时我们要求的,这样不用挨个读取记录,且参与运算的数据大大减少,基本可以不用多次读写磁盘而直接在内存里进行运算,大大提高了检索速度。

基于文本的倒排

倒排文件也可以应用于非结构化的信息检索里面,如大量正文的文本索引。尤其当今搜索引擎需要对海量的正文文本信息进行检索的情况下,倒排文件的使用尤其重要。

 对多个正文文本建立索引的基本思想就是,把正文看成一个一个的关键词的集合,然后用这些词组成一些适合快速检索的数据结构。一个倒排文件就是一个已经排好序的关键词的列表,其中每个关键词指向一个倒排表,该表中记录了该关键词出现的文档集合以及在该文档中的出现位置。如北大某院图书馆论文集的部分倒排表:

关键词

倒排表(所在文档编号,出现次数, 出现位置)

KMP

#3307, 2, 5, 43)(#4615, 3, 0, 19, 34, 70, 143

最小支撑树

#2519, 1, 267)(#6742, 3, 19, 322, 526)……

贪心算法

#2948, 3, 45, 267, 587)(#3693, 5, 39, 423, 765,809,1024)……

……

……

这样一来,当要检索关于KMP方面的文章时,可直接取出其倒排表即可得知,编号为33074615的文章都是包含KMP这 个关键词的,且能知道包含了多少次,以及在各个文档中的具体出现位置。如果同时需要“最小支撑树”和“贪心算法”两方面的文章,则可以直接将两个倒排表取 交集,就能得到所有符合条件的集合。如此可以免去在整个图书馆里每一篇文档里去逐个查找的代价,从而可以轻松快捷的得到结果。

对于这样一个正文倒排文件的建立通常需要如下几个步骤。首先是文本切词(分词),即以人工或者机器自动的方式把一篇文档里的可能成为关键词的词组划分出来。在汉语等东方语言中,因为词与词之间没有空格,所以怎样把词组从句子中完整的切分出来,需要专门的研究。这需要自然语言理解技术(natural language processing,属人工智能研究的一个分支)的支持。然后是得到各个关键词的集合,对于每个关键词建立它的倒排表,然后把所有倒排表按关键词排序存入文件,形成倒排文件。文件中除了记录那个关键词对应 哪些文档外,还应该有关键词在文档中的出现位置和出现次数等。然而最后得到的倒排文件往往还是很大,关键词很多,所以还需要对倒排文件里的关键词再次建立索引结构。对关键词进行索引的常用技术有散列和B+树等,当然如果关键词能全部放入内存,也可以使用二叉查找树来建立索引。

 由于倒排索 引支持高效检索,所以应用相当广泛。当然,对倒排表进行集合运算也需要一些运算空间,更大的缺点在于,当文件发生变化时,要同时维护更新这些索引,而这种 更新的工作量会很大,所以它比较适合于当大文件里面内容比较稳定的情况下。尤其像光盘上的数据检索等就会是它最理想的应用场所之一。

 

m路静态搜索树

当数据对象数目特别大,索引表本身也很大,在内存中放不下,需要分批多次读取外存才能把索引表搜索一遍

在此情况下,可以建立索引的索引,称为二级索引。二级索引可以常驻内存,二级索引中一个索引项对应一个索引块,登记该索引块的最大关键码及该索引块的存储地址。

 

如果二级索引在内存中也放不下,需要分为许多块多次从外存读入。可以建立二级索引的索引,叫做三级索引。这时,访问外存次数等于读入索引次数再加上1次读取对象。

这种多级索引结构形成一种 叉树。树中每一个分支结点表示一个索引块,它最多存放 个索引项,每个索引项分别给出各子树结点 (低一级索引块的最大关键码和结点地址

树的叶结点中各索引项给出在数据表中存放的对象的关键码和存放地址。这种m叉树用来作为多级索引,就是m路搜索树。

m路搜索树可能是静态索引结构,即结构在初始创建,数据装入时就已经定型,在整个运行期间,树的结构不发生变化。

m路搜索树还可能是动态索引结构,即在整个系统运行期间,树的结构随数据的增删及时调整,以保持最佳的搜索效率。

分享到:
评论

相关推荐

    清华殷人昆数据结构笔记(c++)10

    本文将详细解析清华大学殷人昆教授的数据结构笔记中的几个关键概念,包括静态索引结构、动态索引结构、Trie树以及散列(Hashing)。 1. 静态索引结构 静态索引结构主要用于解决大数据量存储和检索问题。在给定的...

    索引与散列1

    1. **静态索引结构**:静态索引结构在数据加载时就已经确定,其结构在整个系统运行期间保持不变,只进行数据的更新。优点在于结构固定,构建简单,数据存取便捷;缺点在于更新操作如插入和删除时效率较低,因为索引...

    数据结构第10章1

    本章重点介绍了静态索引结构和动态索引结构,以及散列方法。 1. 静态索引结构: - 线性索引:包括密集索引、稀疏索引,其中密集索引覆盖所有数据,而稀疏索引只覆盖部分数据。倒排索引用于基于属性查找,单元式倒...

    第A章习题(索引与散列).doc

    索引分为静态索引结构和动态索引结构。 静态索引结构:这种索引在创建时已经固定,数据加载后不再改变其结构。优点在于结构稳定,构建简单,数据存取快速。然而,其缺点在于对数据的插入、删除操作效率较低,因为...

    数据结构第10章.doc

    静态索引结构一旦创建就不会改变,适合数据量固定且很少更新的情况,但更新效率较低。动态索引结构如B树,能随着数据的增删进行调整,以保持最佳搜索效率。B树是一种自平衡的多路搜索树,它的每个节点可以有多个子...

    清华计算机 数据结构 练习题 习题答案

    静态索引结构是指在系统初始化时就已经确定,并且在后续的操作中,如插入、删除数据时,其结构保持不变。优点是结构稳定,构建简单,存取速度快。然而,这种结构对数据更新不友好,因为插入或删除操作可能导致效率...

    算法 数据结构1800题 第11章 文件答案.doc

    - **ISAM文件**:专门为磁盘设计的一种文件组织方式,使用静态索引结构。ISAM文件在磁盘上建立多级索引,包括主索引(柱面索引的索引)、柱面索引和磁道索引。检索时,先找到主索引,然后定位到相应的柱面索引,接着...

    数据结构试题及答案10.doc

    15. ISAM 文件是静态索引结构,VSAM 文件是动态索引结构。正确答案是 C. 前者建立静态索引结构,后者建立动态索引结构。 16. 数据的逻辑结构在计算机存储器内的表示被称为数据的物理结构或存储结构。 17. 删除双向...

    北京大学数据结构与算法往年复习提纲.docx

    索引技术的概念:顺序文件、散列文件、倒排文件、静态索引结构、动态索引结构(B 树)。 B 树和 B+ 树的插入与删除:注意保持性质,特别是等高;以及子结点和关键码个数的上下限制。 B 树/B+树的读盘和写盘次数...

    20秋东北大学《数据结构Ⅱ》在线平时作业1【满分答案】.docx

    它们都是索引顺序文件,但ISAM是静态索引结构,而VSAM则是动态索引结构,故C选项正确。 4. **数组存储**:二维数组按照行优先顺序存储时,元素地址计算遵循公式`address = base + (row * width + column) * element...

    静态hash索引

    它基于哈希函数来定位数据,通过将键(key)转化为哈希值(hash code),并根据这个哈希值在索引结构中快速找到对应的记录。这种索引方法与传统的B树或B+树索引不同,它不依赖于数据的排序,而是依赖于哈希函数的...

    数据结构 静态查找表

    在实际应用中,静态查找表可能采用一些优化策略,比如哈希表,通过哈希函数将键值映射到数组索引,可以进一步提高查找速度,达到近乎常数时间的平均查找复杂度。但是,哈希表并不是真正的静态查找表,因为它通常允许...

    数据与算法课程:8 查找.pdf

    静态索引结构是另一种查找技术,适用于只读或几乎不变的数据集,它们通常不支持动态插入和删除操作,但查找效率较高。相比之下,动态查找结构如二叉查找树允许高效地进行插入、删除和查找操作,特别适合需要频繁更新...

    静态数据结构与动态数据结构.pdf

    数组是最简单的数据结构之一,它是一系列相同类型的数据元素的有序集合,每个元素可以通过索引访问。数组的大小在创建时即被确定,之后无法调整。记录则是一组相关数据的集合,它们通常具有固定的字段和类型,例如...

    数据结构实验报告-静态查找表

    静态查找表是一种常见的数据结构,尤其在处理固定数量元素且不频繁插入或删除操作的场景下非常适用。本实验报告将深入解析静态查找表的原理、实现方法以及其在实际问题中的应用。 静态查找表,顾名思义,是指在创建...

    全站静态与伪静态

    MySQL优化涉及表结构优化(遵循第三范式3NF)、读写分离、分表技术(垂直分割和水平分割)、建立索引以及数据库服务器硬件和配置的优化。 服务器集群技术也是提升网站性能的重要手段,通过负载均衡将请求分散到多个...

    DZX3.5伪静态规则文件

    1. **搜索引擎友好**:静态URL对于搜索引擎更加友好,因为它们看起来更像目录结构,有助于爬虫更好地理解和索引页面内容。 2. **用户友好**:静态化的URL更易读,使用户能够更容易理解页面内容,提升用户体验。 3....

    JavaScript中的快速静态二维空间索引

    1. **插入与删除**:用户可以向索引结构中插入点或矩形,这些对象会被分配到对应的空间块中。删除操作则从相应的块中移除对象,更新索引。 2. **空间查询**:通过提供一个矩形区域,Flatbush能迅速返回该区域内所有...

    数据结构(C语言版)---静态链表

    静态链表是一种特殊的链式数据结构,它与常规动态链表有所不同,主要在于存储方式和内存分配。 静态链表,顾名思义,与动态链表相对,其链表节点是在编译时静态分配的,而不是在运行时动态分配。这种设计减少了动态...

Global site tag (gtag.js) - Google Analytics