目录

1  索引是啥???

2  线性索引

2.1  稠密索引

2.2  稀疏索引(分块索引)

2.3  二级线性索引

2.4  倒排索引

2.4.1 基于属性的倒排

2.4.2 对正文文件的倒排



这些年来,受尽索引的折磨,时常一脸懵逼,因此立志写一篇通俗易懂又不失专业性的索引攻略。

数据结构索引之杀死攻略(一)

1  索引是啥???

数据结构索引之杀死攻略(一)

风靡日本全球的“小黄书”——《大便书》的目录类似于一张索引表

数据结构索引之杀死攻略(一)

目录中的:

前言-P12         

从数字看便便-P17          

便便循环-P33

......

类似于一个个索引项,包含着章节名称与页码,便于我们快速定位。

索引(indexing):就是把一个关键码与它对应的数据记录位置相关联的过程。

 数据结构索引之杀死攻略(一)

一个索引表(对应于书的目录)由若干个索引项构成,每个索引项至少包含关键字(对应于章节名称)及其对应的记录在存储器中的位置(对应于章节的页码)等信息。

-(关键码,指针)对,即(key,pointer)

-指针指向主要数据库文件(主文件)中的完整记录

索引文件(index file):用于记录这种联系的文件组织结构。(类似于存放书目录的那一页,具体的那张纸)

-------------------------------------------------------------------------------------------------------------------------------------------------------

2  线性索引

线性索引:就是将索引项集合组织成线性结构

线性结构一个有序数据元素的集合。

常用的线性结构有:栈,队列,串等

数据结构索引之杀死攻略(一)

半线性结构:

非线性结构:

线性索引可分为三种:稠密索引,稀疏索引(分块索引),倒排索引

2.1  稠密索引

用一个小本子记录家里所有小东西放置的位置

数据结构索引之杀死攻略(一)

每隔一段时间还按照本子整理一遍家中的物品,用完都放回原处,这样就不易找不到东西。像这样,家中的每件小物品都对应一条记录。而这个小本子就是索引。

稠密索引:每个记录建立一个索引项。

数据结构索引之杀死攻略(一)

(来源于《大话数据结构》)

如果要查找的是PB级甚至更多的数据时,对于稠密索引的索引表来说,索引项一定是按照关键码有序排列的。

索引项有序也就意味着,在查找关键字时,可以用到折半,插值,斐波那契等有序查找算法,大大提高效率。但是,如果数据集非常大,也就意味着索引也得有同样的数据集长度规模,对于内存有限的计算机来说,可能需要反复去访问磁盘,查找性能反而大大下降了。(好比于某土豪的家有一个市那么大,需要大量的本子去记录每件物品的位置,可能每次找物品需要反复去翻看不同的本子)

2.2  稀疏索引(分块索引)

        我在整理家里的书架时,都会考虑不同的层板放置不同类别的图书。例如最上层放不常翻阅的书籍,中间层放经常翻阅的书籍如计算机类,最下层放大开本比较重的书籍如字典。这就是分块的概念,并且让它们块间有序了。至于中间层中《数据结构》是应该放在《计算机组成原理》的左边还是右边,并不是很重要。毕竟要找计算机类的《数据结构》,只需要对中间层的图书浏览一遍就能很容易查找到。

数据结构索引之杀死攻略(一)

稀疏索引:一组记录建立索引项。

稠密索引因为索引项与数据集的记录个数相同,所以空间代价大。为了减少索引项的个数,可以对数据集进行分块,且使分块有序,然后再对每一块建立一个索引项。

块内无序:每一块内的记录不要求有序。虽然块内有序对查找来说更理想,不过要付出大量时间和空间的代价,因此通常不要求块内有序。

块间有序:例如,要求第二块所有记录的关键字均要大于第一块中所有记录的关键字,第三块所有记录的关键字大于第二块所有记录的关键字。只有块间有序,才有可能在查找时带来效率。

数据结构索引之杀死攻略(一)

(来源于《大话数据结构》)

2.3  二级线性索引

一级线性索引太大时,在一次检索过程中可能需要多次访问磁盘,从而影响检索的效率。这时可以采用二级线性索引。

如果管理的是家里的一个书架,那么用一级索引就够用了。

数据结构索引之杀死攻略(一)

如果管理的是一个小型的图书馆,那么至少要引入二级索引了。

数据结构索引之杀死攻略(一)

栗子1:

数据结构索引之杀死攻略(一)               数据结构索引之杀死攻略(一)

解析:

数据结构索引之杀死攻略(一)

栗子2:

数据结构索引之杀死攻略(一)

栗子3:unix文件系统采用的三级索引结构

数据结构索引之杀死攻略(一)

2.4  倒排索引

少说废话,直接

数据结构索引之杀死攻略(一)

在百度搜索框中输入“找死手册”

数据结构索引之杀死攻略(一)

看到这个搜索结果列表页,我露出了蜜汁微笑。

进一步查看一下这张图的信息:

  1. 百度为您找到相关结果约100个

  2. 列表页飘红的词均出现在搜索框中

  3. 排在首位的搜索结果,飘红词跟搜索框中的词完全匹配

这样的搜索结果是怎么产生的呢?容老夫娓娓道来。

2.4.1 基于属性的倒排

——按照属性建立索引

  • 倒排表:对某属性按属性值建立索引表
  • “属性 – 指针”对 (attr, ptrList)

       —— 指针可以是关键码,或该记录的主文件地址                                  

       —— 属性值,具有该属性值的各记录指针

  • 倒排索引:颠覆主文件的顺序
  • 属性往往是离散型的,对于连续型的索引,往往用B树
  • 倒排文件:带有倒排索引的文件

数据结构索引之杀死攻略(一)

数据结构索引之杀死攻略(一)

优点:能够对基于属性的检索进行较高效率的处理

缺点:花费了保存倒排表的存储代价,降低了更新运算的效率

2.4.2 对正文文件的倒排

数据结构索引之杀死攻略(一)

 


词索引(word index)——倒排文件使用的最广泛的方法

基本思想:把正文看作由符号和词所组成的集合,从正文中抽取出关键词,每个关键词指向一个倒排列表。

-(posting,list)
• posting:指向该关键词出现文档集合
• list:在文档中的位置

现在对上述搜索的栗子进行解析:

假如我们要对3篇文档(网页)建立索引:

文档1:找死手册百度百科

文档2:找死手册(豆瓣)

文档3:找死手册怎么样

那么文档中的词典集合为{找死,手册,百度,百科,豆瓣,怎么样},倒排索引见下图:

数据结构索引之杀死攻略(一)

百度后台建立了索引之后,我们就可以开始查询了。在百度搜索框输入“找死手册”,分词得到{找死,手册},查倒排索引,就出现了的上上上图的展示结果。

我再举个栗子

数据结构索引之杀死攻略(一)

数据结构索引之杀死攻略(一)

数据结构索引之杀死攻略(一)

当然,中间还会经历一些中文分词,从记录中抽取关键词,去掉停用词等。


全文索引 ( full-text index )

基本思想:把正文看作一个长的字符串
                – 在数据结构中记录的是子字符串的开始位置
                – 可以针对正文中的任何子字符串进行查询
• 可以对每一个字符建立索引,从而使查询词不再限于关键词
• 需要更大的空间

篇幅太长没人看的,所以跳转到下一篇《数据结构索引之杀死攻略(二)》:

https://blog.csdn.net/wydyd110/article/details/81945803

相关文章: