【说明】博客内容选自课件内容
目录
静态索引结构
1. 索引顺序表
索引顺序表的查找
查找成功时的平均查找长度
2. m 叉静态搜索树
当数据表中的记录个数 n 很大时, 由于内存容量的限制,不能全部存入内存。因此,在查找过程中需要反复与外存交换信息,此时前面介绍的各种算法的效率都很低。
折半查找:记录必须全部在内存。
静态查找树表:记录必须全部在内存。
二叉平衡树:记录必须全部在内存。
顺序查找:记录不必全部在内存,但搜索效率极低。
采用索引方法来实现记录的存储和搜索
1. 索引顺序表 2. m 叉静态搜索树
后面要讨论的B树和键树是动态索引结构
例:有一个存放职工信息的数据表. 每一个职工数据10M字节,假设有10000个职工,则数据表共占100G。假设内存只有2G。
采用索引表,每个索引项可索引一个职工记录,且占8个字节,则10000个索引项需要80K个字节。
稠密索引:一个索引项对应数据表中一个记录的索引结构。
稀疏索引:当记录在外存中有序(块)存放时,可以把所有n 个记录分为b 个子表(块)存放,一个索引项对应数据表中一组记录(子表)。
在子表中, 记录可以按关键码有序地存放,也可以无序地存放。但所有这些子表必须分块有序,即:后一个子表中所有记录的关键码均大于前一个子表中所有记录的关键码。
一般分为两级搜索:
①先在索引表中搜索给定值 K, 查找确定满足范围ID[i-1].max_key < K <= ID[i].max_key的 i 值, 即待查记录可能在的子表的序号。
② 然后在第 i 个子表中按给定值搜索要求的记录。
n索引表是按max_key有序的, 且长度也不大,可以折半搜索,也可以顺序搜索。
n各子表中的记录如果也按对象关键码有序, 可以采用折半查找或顺序查找; 如果不是按记录关键码有序, 只能顺序查找。
ASLIndexSeq = ASLIndex + ASLSubList
其中:ASLIndex :在索引表中搜索子表位置的平均查找长度
ASLSubList : 在子表中查找记录位置的查找成功时的平均查找长度。
l设把长度为 n 的表分成均等的 b 个子表,每个子表有 s 个记录,则 b = [n/s](此处向上取整)。
l又设表中每个记录的查找概率相等,则在索引表中查找的概率为1/b,在子表中查找的概率为 1/s。
l若对索引表和子表都用顺序查找,则查找成功时的平均查找长度为:
ASLIndexSeq = (b+1)/2 + (s+1)/2 = (b+s)/2 +1=(n / s + s )/2 + 1
n索引顺序查找的平均查找长度与表中的记录个数n有关,与每个子表中的记录个数s 有关。
n在给定n的情况下,s应选择多大?
n用数学方法可导出, 当 s = 时, ASLIndexSeq 取极小值:ASLIndexSeq = +1。
n这个值比顺序查找强,但比折半查找差。
n当数据记录数目特别大,索引表本身也很大,在内存中放不下,需要分批多次读取外存才能把索引表搜索一遍。
n此时, 可以建立索引的索引(二级索引)。二级索引可以常驻内存,二级索引中一个索引项对应一个索引块,它记录下一级索引块的存储地址及索引块中的最大关键码。
m 叉静态搜索树特点:
由多级索引结构形成一种 m 叉树。
树中每一个内部结点表示一个索引块;
每个索引块中最多存放 m 个索引项;
索引项分别给出各子树结点的最大关键码和结点地址。