索引与文件
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
void Insert (Btreenode *BST ,elemtype X ) { if(BST= =NULL) { Btreenode *p= new Btreenode;
3
在索引查找中,主表只有一个,其中包含的是待查找的内容, 而索引表可以有多个,包含一级索引,二级索引……,所需 的级数可根据具体问题而定。如刚才的利用读音查找汉字为 一级索引,而 利用字形查找汉字为二级索引(部首表→检字 表→汉字)。在此,我们仅讨论一级索引。 索引查找是在线性表(主表)的索引存贮结构上进行的,而 索引存贮的基本思想是:首先将一个线性表(主表)按照一 定的规则分成若干个逻辑上的子表,并为每个子表分别建立 一个索引项,由所有这些索引项得到主表的一个索引表,然 后,可采用顺序或链接的方法来存储索引表和各个子表。索 引表中的每个索引项通常包含三个域:一是索引值域,用来 存储标识对应子表的索引值,它相当于记录的关键字,在索 引表中由此索引值来唯一标识一个索引项(子表);二是子 表的开始位置,用来存储对应子表的第一个元素的存储位置; 三是子表的长度,用来存储对应子表的元素个数。
表8-2
按部门的索引表 index
J
start
0 4 7 9 1 3 2 4
length
讲师 D 副教授 G 助教 C 讲师 助教 副教授 教授 讲师 副教授
8
若按职称进行索引,则得到的索引表中也有4个子表, 分别为:
Jiaosou=(a1,a8)
FuJiaosou=(a3,a7,a10)
Jiangshi=(a2,a5,a9) Zhujiao=(a4,a6)
4
索引文件:由索引表和主表共同构成,索引 表由关键字与物理记录构成,通常关键字是 有序的。 索引查找的步骤: (1)先读取索引表到内存 (2)根据索引表所指物理地址将记录所在的 主表数据块读入内存后查找 (3)返回查找结果 若主表的内容按关键字排序,则称为索引顺 序文件,否则称为索引无序文件。索引顺序 文件可用于分块查找。
5
索引表
key addr 03 180 08 140 17 340
主表
职工号 姓名 性别
索引无序文件
职务 教师 教师 婚否 已婚 … 已婚 ... 张珊 李斯 王鲁 女 男
100
140 180
83 08 03
男 教务员 已婚 ...
24 260
47 300
220
260
95
24
刘琪
岳跋
女 实验员 未婚 ...
对象关键码 key 对象存放地址 addr
但在实际应用中有时需要针对其它属性进行 搜索。例如,查询如下的职工信息: (1) 列出所有教师的名单;
17
(2) 已婚的女性职工有哪些人? 这些信息在数据表或文件中都存在,但都不 是关键码,为回答以上问题,只能到表或文 件中去顺序搜索,搜索效率极低。 因此,除主关键码外,可以把一些经常搜索 的属性设定为次关键码,并针对每一个作为 次关键码的属性,建立次索引。 在次索引中,列出该属性的所有取值,并对 每一个取值建立有序链表,把所有具有相同 属性值的对象按存放地址递增的顺序或按主 关键码递增的顺序链接在一起。
具体实现如下:将一个含有n个元素的主表分成m个子表, 但要求子表之间元素是按关键字有序排列的,而子表中 元素可以无序的,然后建立索引表,索引表中索引域的 值用每个子表最大关键字代替,则可以按索引查找思想 找到表中元素。
13
例 如 , 给 定 关 键 字 序 列 如 下 : 18,7,26,34,15,42,36,70,60,55,83,90,78,72,74 , 假设 m=3,s=5, 即 将该序序分成3个子表,每个子表有5 个元素,则得到的主表和 索引表如图8-5所 示。
索引与文件
1
索引与文件
索引查找 分块查找 倒排表 树表查找--二叉排序树 文件
2
索引查找
1.索引查找的思想 索引查找,又称分级查找,它既是一种查找方法,又是 一种存贮方法,称为索引存贮。 它在我们的日常生活中有着广泛的应用。例如,在汉语 字典中查找某个汉字时,若知道某个汉字读者,则可以 先在音节表中查找到对应正文中的页码,然后再在正文 中所对应的页中查出待查的汉字;若知道该汉字的字形, 但不知道读者,则可以先在部首表中根据字的部首查找 到对应检字表中的页码,再在检字表中根据字的笔画找 到该汉字所在的页码。在这里,整个字典就是索引查找 的对象,字典的正文是字典的主要部分,被称之为主表, 而检字表,部首表和音节表都有是为了方便查找主表而 建立的索引,所以被称之为索引表。
男 教师 已婚 ...
51 380
83 100 95 220
300
340 380
47
17 51
周斌
胡江 林青
男
女
教师
教师
已婚 ...
未婚 ...
6
男 实验员 未婚 ...
例如,设有一个学校部分教师档案表如表8-1所示,设 编号为主关键字,则该表可以用一个线性表L=(a1,a2, a3,a4,a5,a6,a7,a8,a9,a10)来表示,其中ai (1≤i≤n)表示第i位 教师的信息(包含有编号,姓名,部门,职称),而 它的索引表可以按部门进行,也可以按职称进行,按 部门的索引表中有4个子表,分别为:
这时的主表用顺序存贮不太方便,因相同职称的教师没 有连在一起,故用链式存储得到主表较方便。具体的存 贮如图8-4所示。在图8-4中,箭头上面的数字表示该元 素在主表中的下标位置(指针),每个子表中最后个元 素的指针为-1,表示为空指针。
9
教授 副教授
0 2 1 3
a1
7 6 4 5
a8 -1 a7
21
在次索引中记录对象存放位置的指针 可以用主关键码表示: 可通过搜索次索 引确定该对象的主关键码, 再通过搜索 主索引确定对象的存放地址。
22
树表查找 二叉排序树查找
1.什么是二叉排序树 二叉排序树(Binary Sorting Tree),它或者是一棵空树, 或者是一棵具有如下特征的非空二叉树: (1)若它的左子树非空,则左子树上所有结点的关键字均 小于根结点的关键字; (2)若它的右子树非空,则右子树上所有结点的关键字均 大于等于根结点的关键字; (3)左、右子树本身又都是一棵二叉排序树。
47
17 51
周斌
胡江 林青
男
女
教师
教师
已婚 ...
未婚 ...
16
男 实验员 未婚 ...
倒排表 (Inverted Index List)
对包含有大量数据对象的数据表或文件进行 搜索时,最常用的是针对对象的主关键码建 立索引。主关键码可以唯一地标识该对象。 用主关键码建立的索引叫做主索引。 主索引的每个索引项给出对象的关键码和对 象在表或文件中的存放地址。
0 18 1 2 3 4 5 6 7 8 9 10 11 12 13 14 7 26 34 15 42 36 70 60 55 83 90 78 72 74
(a)15 个关键字序列得到的主表
index 34 70 90
start 0 5 10
length 5 5 5
(b)
按关键字序列递增得到的索引表
a3
9 8
a10 -1
讲师 助教 图 8-4
a2
a5
a9 -1
a4
a6 -1
按职称的链式存贮ቤተ መጻሕፍቲ ባይዱ构
于是,可以得到如表8-3所示的职称索引表。 表8-3 按职称的索引表
index
教授 副教授 0 2
start
2 3
length
讲师
助教
1
3
3
2
10
从刚才的两种索引表中,可以给出索引查找的基本思想如下:
第一步,在索引表中按index域查找所给值K1,这时可得到子 表起始位置start 和长度length,若找不到K1,结束查找,表 示查找不成功。第二步,在主表的start位置开始,长度为 length的范围内查找所给值K2,若找到,查找不成功,否则, 查找不成功。 例如,对于按部门的索引查找,主表可以用顺序存贮,假设 K1=“D”,“D”代电工系,K2=“孙六”,则先在表8-2的索引表 中找到的index域为“D”的项,得到start=4, length=3,然后从 主表的第4个位置开始(即a5)找姓名为“孙六”的人,则在主 表 的 第 5 个 位 置 可 以 找 到 , 故 查 找 成 功 。 若 假 设 K1=“D” , K2=“杨九”,则索引表的查找与上面相同,然后在主表的第4个 位置开始查找,没找到,进入第5个位置查找,还没找到进入第 6位置查找,仍然没找到,但查找的length=3,既只允许3次查找, 故查找不成功。若假设K1=“F”,K2=“张三”,则首先在索引表 中就找不到“F”,故无需进入主表进行查找,查找不成功。
11
3.索引查找的性能分析 由于索引查找中涉及到两方面查找,第一个是索引表的 查找,第二个是主表的查找,假设两种查找都按顺序查 找方式进行,则索引表的平均查找长度为(m+1)/2,主表 中的平均查找长度为(s+1)/2,(m为索引表的长度,S为 主表中相应子表的长度),则索引查找的平均查找长度为: ASL=(m+1)/2+ (s+1)/2。若假定每个子表具有相同的长 度,而主表的长度为n,则有n=m.s, 这时当s= 时,
n 索引查找具有最小的平均查找长度,即ASL=1+ n
。
从该公式可以看出,索引查找的 性能优先顺序查找,但 比二分查找要差,时间复杂度介于O(log2 n)~O(n)之间。
12
分块查找
1.分块查找 的思想 分块查找实际上就是一种索引查找,是索引查找与二分 查找的结合,其性能更优先于索引查找。原因是分块查 找的索引表是一个有序表,故可以用 二分查找 来代替 顺序查找 实现索引表的快速查找。
23
2.二叉排序树的数据类型描述
和第六章类似,可以用一个二叉链表来描述一棵二叉 排序树,具体为:
struct Btreenode
{ elemtype data; Btreenode }; 3.二叉排序树的基本运算 (1)二叉排序树的插入 若二叉排序树为空,则作为根结点插入,否则,若待 插入的值小于根结点值,则作为左子树插入,否则作为 右子树插入,算法描述为: 24 *left,*right; //代表关键字 //代表左、右孩子
图 8-5
分块查找的主表和索引表
14
3.分块查找的性能分析 分块查找实际上就是索引查找,但分块查找中索引的域 的类型与主表的关键字域的类型相同,且索引表按索 引域递增(或递减)有序,故它的平均查找长度与索 引查找接近,且优于索引查找。
15
索引表
key addr 03 180 08 140 17 340
数据表
职工号 姓名 性别 职务 教师 教师 婚否 已婚 … 已婚 ...
100
140 180
83 08 03
张珊 李斯 王鲁
女 男
男 教务员 已婚 ...
24 260
47 300
220
260
95
24
刘琪
岳跋
女 实验员 未婚 ...
男 教师 已婚 ...
51 380
83 100 95 220
300
340 380
职务次索引
次关键码 教师 教务员 实验员 计 数 5 1 2 地址指针
指针 08 24 47 51 83 03 17 95
20
(1) 列出所有教师的名单; (2) 已婚的女性职工有哪些人? 通过顺序访问“职务”次索引中的“教师” 链,可以回答上面的查询(1)。 通过对“性别”和“婚否”次索引中的“女 性”链和“已婚”链进行求“交”运算,就 能够找到所有既是女性又已婚的职工对象, 从而回答上面的查询(2)。 倒排表是次索引的一种实现。在表中所有次 关键码的链都保存在次索引中,仅通过搜索 次索引就能找到所有具有相同属性值的对象。
18
次索引的索引项由次关键码、链表长度和链 表本身等三部分组成。 例如,为了回答上述的查询,我们可以分别 建立“性别”、“婚否”和“职务”次索引。
性别次索引
次关键码 男 女 计 数 5 3 地址指针 指针 03 08 17 24 47 51 83 95
19
婚否次索引
次关键码 已婚 未婚 计 数 5 3 地址指针 指针 03 08 24 47 83 17 51 95
计算机系J=( a1,a2,a3,a4) 电工系 D=(a5,a6,a7) 管理系G=(a8,a9)
成教部C=(a10)
该4个子表示成一个索引表如表8-2所示。
7
表8-1 教师档案表
编号 J001 J002 J003 J004 D001 D002 D003 G001 G002 C001 姓名 赵一 钱二 张三 李四 王五 孙六 刘七 朱八 杨九 罗十 部门 计算机系 计算机系 计算机系 计算机系 电工系 电工系 电工系 管理系 管理系 成教部 职称 教授