目录
这些年来,受尽索引的折磨,时常一脸懵逼,因此立志写一篇通俗易懂又不失专业性的索引攻略。
1 索引是啥???
风靡日本全球的“小黄书”——《大便书》的目录类似于一张索引表。
目录中的:
前言-P12
从数字看便便-P17
便便循环-P33
......
类似于一个个索引项,包含着章节名称与页码,便于我们快速定位。
索引(indexing):就是把一个关键码与它对应的数据记录位置相关联的过程。
一个索引表(对应于书的目录)由若干个索引项构成,每个索引项至少包含关键字(对应于章节名称)及其对应的记录在存储器中的位置(对应于章节的页码)等信息。
-(关键码,指针)对,即(key,pointer)
-指针指向主要数据库文件(主文件)中的完整记录
索引文件(index file):用于记录这种联系的文件组织结构。(类似于存放书目录的那一页,具体的那张纸)
-------------------------------------------------------------------------------------------------------------------------------------------------------
2 线性索引
线性索引:就是将索引项集合组织成线性结构。
常用的线性结构有:栈,队列,串等
半线性结构:树
非线性结构:图
线性索引可分为三种:稠密索引,稀疏索引(分块索引),倒排索引
2.1 稠密索引
用一个小本子记录家里所有小东西放置的位置
每隔一段时间还按照本子整理一遍家中的物品,用完都放回原处,这样就不易找不到东西。像这样,家中的每件小物品都对应一条记录。而这个小本子就是索引。
稠密索引:对每个记录建立一个索引项。
(来源于《大话数据结构》)
如果要查找的是PB级甚至更多的数据时,对于稠密索引的索引表来说,索引项一定是按照关键码有序排列的。
索引项有序也就意味着,在查找关键字时,可以用到折半,插值,斐波那契等有序查找算法,大大提高效率。但是,如果数据集非常大,也就意味着索引也得有同样的数据集长度规模,对于内存有限的计算机来说,可能需要反复去访问磁盘,查找性能反而大大下降了。(好比于某土豪的家有一个市那么大,需要大量的本子去记录每件物品的位置,可能每次找物品需要反复去翻看不同的本子)
2.2 稀疏索引(分块索引)
我在整理家里的书架时,都会考虑不同的层板放置不同类别的图书。例如最上层放不常翻阅的书籍,中间层放经常翻阅的书籍如计算机类,最下层放大开本比较重的书籍如字典。这就是分块的概念,并且让它们块间有序了。至于中间层中《数据结构》是应该放在《计算机组成原理》的左边还是右边,并不是很重要。毕竟要找计算机类的《数据结构》,只需要对中间层的图书浏览一遍就能很容易查找到。
稀疏索引:对一组记录建立索引项。
稠密索引因为索引项与数据集的记录个数相同,所以空间代价大。为了减少索引项的个数,可以对数据集进行分块,且使分块有序,然后再对每一块建立一个索引项。
块内无序:每一块内的记录不要求有序。虽然块内有序对查找来说更理想,不过要付出大量时间和空间的代价,因此通常不要求块内有序。
块间有序:例如,要求第二块所有记录的关键字均要大于第一块中所有记录的关键字,第三块所有记录的关键字大于第二块所有记录的关键字。只有块间有序,才有可能在查找时带来效率。
(来源于《大话数据结构》)
2.3 二级线性索引
一级线性索引太大时,在一次检索过程中可能需要多次访问磁盘,从而影响检索的效率。这时可以采用二级线性索引。
如果管理的是家里的一个书架,那么用一级索引就够用了。
如果管理的是一个小型的图书馆,那么至少要引入二级索引了。
栗子1:
解析:
栗子2:
栗子3:unix文件系统采用的三级索引结构
2.4 倒排索引
少说废话,直接
在百度搜索框中输入“找死手册”
看到这个搜索结果列表页,我露出了蜜汁微笑。
进一步查看一下这张图的信息:
-
百度为您找到相关结果约100个
-
列表页飘红的词均出现在搜索框中
-
排在首位的搜索结果,飘红词跟搜索框中的词完全匹配
这样的搜索结果是怎么产生的呢?容老夫娓娓道来。
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