7.1基本概念
- 数据项(也称项或字段)
- 数据项是具有独立含义的标识单位,数数据不可分割的最小单位,如学号、姓名、年级等。
- 数据项有名和值之分,名是数据项的标识,用变量定义,而值是数据项的一个可能取值
- 如表中“20140913”是数据项“学号”的一个取值
- 数据元素(记录)
- 数据元素是由若干数据项构成的数据单位,是在某一问题中作为整体进行考虑和处理的基本单位
- 数据元素有类型和值之分,表中数据项名的集合,即表头部分就是数据元素的类型,而一个学生对应的一行数据就是一个数据元素的值。
- 关键字(key)
- 是数据元素中某数据项的值,用该值可以标识一个数据元素。
- 若该值可以唯一标识一个数据元素,则称为主关键字,否则为次关键字。
- 查找表
- 静态查找表——仅限于查找数据元素的值或者判定数据元素是否存在
- 动态查找表——除了静态查找表能做的,还能插入删除表中的记录
- 平均查找长度
- 把关键字的最多比较次数和平均比较次数作为衡量一个查找算法效率优劣的两个基本技术指标
- 最大查找长度(MSL)
- 平均查找长度(ASL)
7.2静态查找表
- 顺序查找
- 折半查找(二分查找)
要求线性表必须采用顺序存储结构,且表中元素必须按关键字有序(升序/降序)
public int Search_Bin(T key)
{
int low,high;
low = 0;
high = length-1;
while(low<=high)
{
mid = (low+high)/2;
if(key.compareTo(elem.get(mid).key)==0)
return mid;
else if(key.compareTo(elem.get(mid).key)<0)
high = mid-1;
else
low = mid+1;
}
return -1;
}
7.3动态查找表
- 二叉排序树
- 是一种左子树上所有结点的值均小于根结点的值且右子树上所有结点的值均大于根结点的值的特殊二叉树。
- 平衡二叉树(Balanced Binary Tree)
- 它或者是一棵空树,或者是具有如下特性的二叉排序树
- 左子树和右子树深度之差绝对值不超过1(根结点深度为1)
- 左右子树也分别是平衡二叉树
- 动态平衡二叉树(AVL树)
- 它或者是一棵空树,或者是具有如下特性的二叉排序树
- B-树
- 前面讨论的顺序查找、折半查找和二叉树排序查找只适合内部查找。内部查找是指被查找的数据都保存在计算机内存中,这种查找方法适用于较小的数据。而不适用于较大的存放在外存储器中的文件。
- B-树是一种平衡的多路查找树。其特点是插入删除时易于平衡,外部查找效率高,适合于组织磁盘文件的动态索引结构,在文件系统中很有用。
- 一棵m阶B-树 定义
- 树中的每个结点最多有m棵子树
- 若根结点不是叶子结点,则至少有两棵子树
- 除根结点之外的所有非终端结点至少有
棵子树
- B-树的插入
- B-树的结点的关键字个数n应该满足公式(
-1)≤n≤m
- 插入后,结点关键字个数n<m,不修改指针
- 插入后,该结点的关键字个数n=m,则须进行结点分裂,令s=
,在原结点中保留(p0,k1,p1,k2,p2,...,k s-1,p s-1),建立新节点(ps,k s+1,...,kn,pn),将ks插入双亲结点
- 若双亲结点为空,则建立新的根结点
- 若双亲位空,则建立新的根结点
- B-树的结点的关键字个数n应该满足公式(
- B-树的删除
7.4哈希表
- 背景:对于频繁使用的查找表,希望ASL=0.这只有一个办法,预先知道所查关键字在表中的位置,即要求记录在表中的位置和其在关键字之间存在一种确定的关系
- 为了一次存取能得到所查记录,在记录的存储位置和它的关键字之间建立一个确定的关系H,以H(key)作为关键字为key的记录在表中的位置,称这个对应关系H为哈希函数,很难找到一个不产生冲突的哈希函数,只能选择恰当的哈希函数。使得冲突尽可能少的产生,因此在构造查找表时,除了需要一个“好”(尽可能少产生冲突)的哈希函数外还需要找到一种“处理冲突的办法”
- 哈希表的定义:根据设定的哈希函数H(key)和所选中的处理冲突的方法,将一组关键字映射到一个有限的、地址连续的地址集(区间)上,并以关键字在地址中的“象”作为相应记录在表中的存储位置,如此构造所得的查找表称之为“哈希表”,这一映射过程也称为“散列”,所以哈希表也称散列表。
- 哈希函数的构建(以下方法主要针对关键字为数字的记录,若是非数字关键字,则需要先对其进行数字化处理)
- 直接定址法
- 数字分析法
- 平方取中法
- 折叠法
- 除留余数法
- H(key) = key%p,p≤m
- p应该为质数或不包含小于20的质因子的合数