索引结构和散列结构是用在外部搜索的搜索结构。
数据在外存中的组织的方式也就是文件结构,主要分成顺序、直接存取(散列)、和索引结构。
在文件组织中主要使用的是索引和散列方法。
下面是殷人昆老师的书中介绍的索引结构
静态索引结构
当数据对象个数 n 很大时,如果用无序表形式的静态搜索结构存储,采用顺序搜索,则搜索效率极低。如果采用有序表存储形式的静态搜索结构,则插入新记录进行排序,时间开销也很可观。这时可采用索引方法来实现存储和搜索。
线性索引 (Linear Index List)
线性索引分成两种:稠密索引和稀疏索引。
稠密索引
一个索引项(位于索引表)对应数据表中一个对象的索引结构。当对象在外存中按加入顺序存放而不是按关键码有序存放时必须采用稠密索引结构,这时的索引结构叫做索引非顺序结构。
例如下图:
稀疏索引
当对象在外存中有序存放时,可以把所有 n 个对象分为 b 个子表(块)存放,一个索引项对应数据表中一组对象(子表).在子表中, 所有对象可能按关键码有序地存放, 也可能无序地存放。但所有这些子表必须分块有序,后一个子表中所有对象的关键码均大于前一个子表中所有对象的关键码。它们都存放在数据区中。另外建立一个索引表。索引表中每一表目叫做索引项,它记录了子表中最大关键码max_key以及该子表在数据区中的起始位置obj_addr。见下图所示:
各个索引项在索引表中的序号与各个子表的块号有一一对应的关系:第 i 个索引项是第 i 个子表的索引项, i = 0, 1, …, n-1。这样的索引结构叫做索引顺序结构。
对索引顺序结构进行搜索时,一般分为两级搜索。
(1)先在索引表 ID 中搜索给定值 K,确定满足 ID[i-1].max_key < K <=ID[i].max_key 的 i 值,即待查对象可能在的子表的序号。
(2)然后再在第 i 个子表中按给定值搜索要求的对象。
索引表是按max_key有序的,且长度也不大,可以对分搜索,也可以顺序搜索。
各子表内各个对象如果也按对象关键码有序,可以采用对分搜索或顺序搜索;如果不是按对象关键码有序,只能顺序搜索。
倒排表
基于属性的倒排
在一个带结构的记录文件中,如数据库文件等。文件里存放的都是一条接着一条的整齐的记录,每个记录又可分为一个个的属性。检索过程往往要求找出,在某个或者某些属性上满足一定条件的记录集合。像这一类的检索我们称为基于属性的检索。
对包含有大量数据对象的数据表或文件进行搜索时,最常用的是针对对象的主关键码建立索引。主关键码可以唯一地标识该对象。用主关键码建立的索引叫做主索引。
主索引的每个索引项给出对象的关键码和对象在表或文件中的存放地址。
在实际应用中有时需要针对其它属性进行搜索。例如,查询如下的职工信息:
(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方面的文章时,可直接取出其倒排表即可得知,编号为3307和4615的文章都是包含KMP这 个关键词的,且能知道包含了多少次,以及在各个文档中的具体出现位置。如果同时需要“最小支撑树”和“贪心算法”两方面的文章,则可以直接将两个倒排表取 交集,就能得到所有符合条件的集合。如此可以免去在整个图书馆里每一篇文档里去逐个查找的代价,从而可以轻松快捷的得到结果。
对于这样一个正文倒排文件的建立通常需要如下几个步骤。首先是文本切词(分词),即以人工或者机器自动的方式把一篇文档里的可能成为关键词的词组划分出来。在汉语等东方语言中,因为词与词之间没有空格,所以怎样把词组从句子中完整的切分出来,需要专门的研究。这需要自然语言理解技术(natural language processing,属人工智能研究的一个分支)的支持。然后是得到各个关键词的集合,对于每个关键词建立它的倒排表,然后把所有倒排表按关键词排序存入文件,形成倒排文件。文件中除了记录那个关键词对应 哪些文档外,还应该有关键词在文档中的出现位置和出现次数等。然而最后得到的倒排文件往往还是很大,关键词很多,所以还需要对倒排文件里的关键词再次建立索引结构。对关键词进行索引的常用技术有散列和B+树等,当然如果关键词能全部放入内存,也可以使用二叉查找树来建立索引。
由于倒排索引支持高效检索,所以应用相当广泛。当然,对倒排表进行集合运算也需要一些运算空间,更大的缺点在于,当文件发生变化时,要同时维护更新这些索引,而这种更新的工作量会很大,所以它比较适合于当大文件里面内容比较稳定的情况下。尤其像光盘上的数据检索等就会是它最理想的应用场所之一。
m路静态搜索树
当数据对象数目特别大,索引表本身也很大,在内存中放不下,需要分批多次读取外存才能把索引表搜索一遍。
在此情况下,可以建立索引的索引,称为二级索引。二级索引可以常驻内存,二级索引中一个索引项对应一个索引块,登记该索引块的最大关键码及该索引块的存储地址。
如果二级索引在内存中也放不下,需要分为许多块多次从外存读入。可以建立二级索引的索引,叫做三级索引。这时,访问外存次数等于读入索引次数再加上1次读取对象。
这种多级索引结构形成一种 m 叉树。树中每一个分支结点表示一个索引块,它最多存放 m 个索引项,每个索引项分别给出各子树结点 (低一级索引块) 的最大关键码和结点地址。
树的叶结点中各索引项给出在数据表中存放的对象的关键码和存放地址。这种m叉树用来作为多级索引,就是m路搜索树。
m路搜索树可能是静态索引结构,即结构在初始创建,数据装入时就已经定型,在整个运行期间,树的结构不发生变化。
m路搜索树还可能是动态索引结构,即在整个系统运行期间,树的结构随数据的增删及时调整,以保持最佳的搜索效率。
分享到:
相关推荐
B+树是一种高效的数据结构,常用于数据库索引,能平衡数据分布,支持高效的范围查询。 **6. 散列索引** - **静态散列**:通过散列函数将搜索码映射到固定数量的桶中,若桶满则使用溢出处理(如溢出链)。理想的散列...
本章主要讨论了静态索引结构和动态索引结构的特性、子表大小的设计原则以及不同索引方式的应用。 1. **静态索引结构**:静态索引结构在数据加载时就已经确定,其结构在整个系统运行期间保持不变,只进行数据的更新...
索引分为静态索引结构和动态索引结构。 静态索引结构:这种索引在创建时已经固定,数据加载后不再改变其结构。优点在于结构稳定,构建简单,数据存取快速。然而,其缺点在于对数据的插入、删除操作效率较低,因为...
5. **多级索引**:当索引结构过大影响性能时,可以使用外层和内层索引来分层检索,降低访问复杂性。 在SQL中,索引的创建和删除可以通过`CREATE INDEX`和`DROP INDEX`语句实现,例如`CREATE INDEX stdno_index ON ...
无论是静态索引的预先规划,还是动态索引的实时更新,或是散列的快速查找,都是为了在面对海量数据时,确保高效的数据访问,从而提升整个系统的性能。通过深入学习这些概念,我们可以更好地设计和实施数据管理系统,...
静态索引通常用于文件系统的目录结构,预先构建好索引表,查找文件时直接查询索引,减少了磁盘访问。动态索引则是在文件系统运行过程中根据需要动态建立和更新索引,适应性更强,但可能会增加系统开销。 散列表则是...
本章重点介绍了静态索引结构和动态索引结构,以及散列方法。 1. 静态索引结构: - 线性索引:包括密集索引、稀疏索引,其中密集索引覆盖所有数据,而稀疏索引只覆盖部分数据。倒排索引用于基于属性查找,单元式倒...
数据结构是计算机科学中的核心概念,它涉及到...总的来说,静态查找表是一种灵活的数据结构,它的效率可以通过各种查找算法和辅助结构(如索引)得到优化。理解和掌握这些概念对于理解和设计高效的计算机程序至关重要。
分为静态散列索引(预分配散列桶)和动态散列索引(动态调整散列桶数量)。 5. **索引的优缺点** 优点是显著提高查询速度,缺点是增加存储空间占用,更新操作需要同时维护索引和主文件,可能导致更新性能下降。...
静态索引结构一旦创建就不会改变,适合数据量固定且很少更新的情况,但更新效率较低。动态索引结构如B树,能随着数据的增删进行调整,以保持最佳搜索效率。B树是一种自平衡的多路搜索树,它的每个节点可以有多个子...
本文将详细解析清华大学殷人昆教授的数据结构笔记中的几个关键概念,包括静态索引结构、动态索引结构、Trie树以及散列(Hashing)。 1. 静态索引结构 静态索引结构主要用于解决大数据量存储和检索问题。在给定的...
静态索引结构是指在系统初始化时就已经确定,并且在后续的操作中,如插入、删除数据时,其结构保持不变。优点是结构稳定,构建简单,存取速度快。然而,这种结构对数据更新不友好,因为插入或删除操作可能导致效率...
- ISAM的索引结构包括磁盘组、柱面和磁道三级,查找时需经过多级索引和顺序查找。 - VSAM的B+树索引结构,支持顺链查找和随机查找,查找效率稳定,适合大型索引顺序文件。 6. 插入与删除: - ISAM文件插入记录...
- **ISAM文件**:专门为磁盘设计的一种文件组织方式,使用静态索引结构。ISAM文件在磁盘上建立多级索引,包括主索引(柱面索引的索引)、柱面索引和磁道索引。检索时,先找到主索引,然后定位到相应的柱面索引,接着...
- **数据结构分类**:逻辑结构(线性、树形、图形)、存储结构(顺序、链式、索引、散列)。 - **算法分析**:时间复杂度、空间复杂度的概念及其重要性。 2. **线性表** - **线性表定义**:具有相同特性的数据...
索引技术的概念:顺序文件、散列文件、倒排文件、静态索引结构、动态索引结构(B 树)。 B 树和 B+ 树的插入与删除:注意保持性质,特别是等高;以及子结点和关键码个数的上下限制。 B 树/B+树的读盘和写盘次数...
数据结构知识点总结 本文档是沈阳工业大学数据结构期末复习资料,涵盖了...本文档涵盖了数据结构的基本概念、数据结构类型、树、图、查找、排序、栈和队列等多个方面的知识点,为学习数据结构提供了系统的知识体系。
数组是一种静态存储结构,元素在内存中连续存储,通过索引访问;链表则由一系列节点组成,每个节点包含数据和指向下一个节点的指针。 2. **栈与队列**:栈是后进先出(LIFO)的数据结构,常用于表达式求解、函数...
散列函数是一对一的关系,但实际操作中可能出现冲突,因此选择合适的散列函数和冲突处理策略是设计散列文件的关键。 2. **顺序文件**: - 顺序文件按照记录的输入顺序存储,适用于小规模或静态数据。对于大型文件...