目录
1.查找的基本概念
2.静态查找表
3.动态查找表
4.哈希表
查找表:
是由同一类型的数据元素(或记录) 构成的集合,由于“集合”中的数据元素之间存在着松散的关系,因此查找表是一种应用灵便的数据结构。
对查找表的操作:
▪查询某个“特定的”数据元素是否在查找表中;
▪检索某个“特定的”数据元素的各种属性;
▪在查找表中插入一个数据元素;
▪从查找表中删去某个数据元素
9.1查找的基本概念
查找又称检索,就是确定一个已给的数据是否出现在某个数据表中。
在计算机中,查找主要分为静态查找、动态查找和哈希查找。静态查找主要是指静态查询某个“特定的”数据元素是否在查找表中,或检索某个“特定的”数据元素的各种属性;动态查找是指在查找过程中同时插入查找表中不存在的数据元素,或者从查找表中删除已存在的某个数据元素;哈希查找则利用哈希函数,通过计算求取待查元素的存储地址
静态查找表
仅作查询和检索操作的查找表。
动态查找表
在查找过程中同时插入查找表中不存在的数据元素,或者从查找表中删除已存在的某个数据元素,此类表为动态查找表。
关键字是数据元素(或记录)中某个数据项的值,用以标识(识别)一个数据元素(或记录)。若此关键字可以识别唯一的一个记录,则称之谓“主关键字”。若此关键字能识别若干记录,则称之谓“次关键字”
对于查找算法,把对关键字的最多比较次数叫做最大查找长度(MaximumSearchLength),简记MSL。把对关键字的平均比较次数叫做平均查找长度(AverageSearchLength),简记ASL。对于n个记录进行查找,查找成功时的平均查找长度ASL可用下列式子表示
其中,Ci为查找第i个记录所需的比较次数,Pi为查找第i个记录的查找概率。如果每个记录的查找机会均等,则每个Pi均等于1/n。
9.2静态查找表
在对查找表操作过程中,只做查找操作的查找表为静态查找表。静态查找表一般以顺序表或线性表表示,顺序表的结构定义为
9.2.1顺序查找
顺序查找(Sequentialsearch)又称线性查找。
算法思路:
假定有n个记录r1,r2,...,rn,顺序地存放在一顺序表r中,其中第i个记录的关键字值为ri.key。现在已给一个关键数据k,将k依次与r1.key,r2.key,...rn.key,进行相等比较,一旦找到某一个ri.key=k,则查找成功,回送下标i,若所有的记录数据都与k值不等,则给出查找失败(i=0)的信息
9.2静态查找表 顺序查找
算法分析:(1)在最坏的情况下顺序查找需要比较n次,因此MSL=n。(2)假定各记录的查找机会均等,即Pi=1/n,由于找第i个记录需要比较i次,即Ci﹦i,于是有:
从分折中可以推出,顺序表查找的最大查找长度和平均查找长度的数量级(即算法的时间复杂度)均为O(n)。
为了提高效率,把经常查找的记录尽量放前,可降低ASL。
例:根据对10个记录做了100次查询得到的统计资料,一般平均查找长度为5.5。其中一个被查找了40次,两个被查找了22次,三个各查找了4次,其余各被查找了1次。请采用合适的存放次序后平均查找长度为多少?
9.2.2 折半查找
算法思路:每次把要找的给定值K与有序表中的中间位置的关键字值进行比较。
中间位置的数据的序号为mid=(1+n)/2。
若K=r[mid].key,则查找成功,返回该元素下标mid,结束查找;
若K<r[mid].key,在左半部分继续使用折半查找;
若K>r[mid].key,对右半部分继续使用折半查找。
例如key=21的查找过程
low指示查找区间的下界;
high指示查找区间的上界;
mid= (low+high)/2。
折半查找判定过程可用一棵二叉树来描述。
折半查找的过程就是从判定树的根结点开始到该记录结点的查找过程。
可根据二叉树计算平均查找次数。
折半查找的性能分析
•判定树:描述查找过程的二叉树。
•有n个结点的判定树的深度为[log2n]+1
•折半查找法在查找过程中进行的比较次数最多不超过[log2n]+1
9.2.3分块查找(索引顺序查找)
要求线性表中的记录按关键字“分段有序”,并在建立这个“分段有序”的顺序表的同时,另建一个“索引”,索引为“索引项”的有序表。
每个索引项由各分段的“最大关键字”和“起始序号” 组成,由“分块有序表”和相应的“索引”构成一个“索引顺序表”。
索引顺序表
在建立顺序表的同时,建立一个索引项,包括两项:关键字项和指针项。索引表按关键字有序,表则为分块有序。每个索引表结点含有最大关键字域和指向本块第一个结点的指针。
分块查找分两步。先确定待查记录所在的块(子表),然后在块中顺序查找。比如:查key=38。
查找方法比较
9.3动态查找表
动态查找表的特点:
即对于给定值k,若表中存在其关键字等于k的记录,则查找成功;否则插入关键字等于k的记录。 动态查找表往往采用树状存储结构、
9.3.1二叉排序查找表
1.二叉排序树的定义和特点定义:二叉排序树BST(Binarysorttree)是空树或是具有以下性质的二叉树:
1、若左子树非空,则左子树上所有结点的值均小于根结点的值;
2、若右子树非空,则右子树上所有结点的值均大于或等于根结点的值;
3、左子树和右子树又分别是二叉排序树。二叉排序树的特点是:对二叉排序树进行中序遍历,可得到一个由小到大的有序序列。
对于一般的二叉树,按给定关键字值查找树中结点时,一般从根结点开始,按先根遍历或中根遍历或后根遍历的方法查找树中结点,直到找到该结点为止。
2.二叉排序树的查找算法
3.二叉排序树的插入算法
若要在二叉排序树中插入一个具有给定关键字值K的新结点,先要查找树中是否存在关键字值为K的结点,只有当树中不存在关键字等于结定值的结点时,即查找失败时,才进行插入操作。新插入的结点一定是一个新添加的叶子结点,并且是查找路径上访问的最后一个结点的左孩子或右孩子结点,使之仍然构成一棵二叉排序树。(插 入 位 置 由查找过程得到。)
二叉排序树的删除算法
二叉排序树查找性能的分析
对于每一棵特定的二叉排序树,均可按照平均查找长度的定义来求它的ASL值,显然,由值相同的n个关键字,构造所得的不同形态的各棵二叉排序树的平均查找长度的值不同,甚至可能差别很大。
{57,21,71,12,51,67,76}
{12,21,51,57,67,71,76}
不失一般性,假设长度为n的序列中有k个关键字小于第一个关键字,则必有n-k-1个关键字大于第一个关键字,由它构造的二叉排序树的平均查找长度是n和k的函数
4.二叉排序树查找算法分析
在二叉排序树上查找关键字值等于给定值的结点的过程,恰是走了一条从根结点到该结点的路径。因此与折半查找类似,和关键字比较次数不超过该二叉树的深度。
深度为i的结点,查找成功时所需比较次数为i。
因此,对于深度为d的二叉排序树,若设第i层有ni个结点(1<i<d),则在同等查找概率的情况下,其平均查找长度为
在二叉排序树上进行查找时,平均查找长度和二叉排序树的形态有关。这也是与折半查找不同的地方,折半查找长度为n的表的判定树是唯一的,而含有n个结点的二叉排序树却不是唯一。在最坏的情况下,二叉排序树是通过把一个有序表的n个结点,依次插入而生成的,此时所得到的二叉排序树退化成一棵深度为n的单支树,即每层仅有一个结点,这时ASL值达到最大,即
资料仅供学习使用
如有错误欢迎留言交流
博主的其他专栏:
关注博主了解更多