在非数值运算问题中,数据存储量一般很大,为了在大量的信息中找到某些值,需要用到查找技术
为了提高查找效率,需要对一些数据进行排序
查找和排序的数据处理量几乎占80%以上,查找和排序的有效性直接影响到基本算法的有效性
查找和排序是重要的处理技术
1.查找的基本概念
列表:由同一类型的数据元素(或者记录)构成的集合,可以利用任意数据结构实现
关键字:数据元素的某个数据项的值,用它可以标识列表中的一个或一组数据元素
如果一个关键字可以惟一标识列表中的一个数据元素,则叫做主关键字,否则为次关键字
当列表中的数据元素仅仅有一个数据项时,数据元素的值就是关键字
查找:根据给定的关键字值,在特定的列表中确定一个其关键字与给定值相同的数据元素,并且返回该数据元素在列表中的位置
如果找到了相应的数据元素,则可以称作查找是成功的;如果没有找到,此时返回一个空地址及其失败的信息
可以根据要求插入这个不存在的元素
查找的分类:对于表的查找,一般有两种情况
一种是静态查找,在查找的过程中只是对数据元素进行查找
一种是动态查找,在查找的同时,插入找不到的元素或者删除找到的元素,也就是允许表中的元素变化
查找算法中的三类对象:查找对象K(找什么)、查找范围L(在哪找)、查找结果(K在L中的位置)
前两个为输入参量,第三个为输出参量,输入参量必不可少,输出参量可以用函数的返回值表示
平均查找长度:为了确定数据元素在列表中的位置,需要和给定值进行比较的关键字的个数的期望值
也叫算法在查找成功时的平均查找长度
ASL=P1C1+P2C2+…+PnCn(P为概率,C为次数)
查找算法的基本运算是关键字之间的比较
查找的基本方法:比较式查找法、计算式查找法
比较式查找法分为:基于线性表的查找法、基于树的查找法
计算式查找法:HASH(哈希)查找法
2.基于线性表的查找法
- (1)顺序查找法
用所给的关键字与线性表中各个元素的关键字逐个比较,直到成功或者失败
存储结构通常为顺序结构,也可以叫做链式结构
在表的一端设置监视哨的附加单元,存放要查找元素的关键字,从表的另一端开始查找
如果在监视哨找到要查找元素的关键字,返回信息失败,否则返回相应的下标
ASL=(n+1)/2 - (2)折半查找法(二分查找法)
待查的列表:必须采用顺序结构存储、必须按关键字大小有序排列
从中间的关键字开始比较,如果相等则查找成功
如果不相等,判断二者的大小,依次类推
ASL=log2(n+1)-1 - (3)分块查找法
首先将列表分成若干个块(子表),块的长度均匀,最后一块可以不满,块内无序,块与块之间有序
构成一个索引表,每个索引项对应一个块记录记录每块的起始位置以及每块中的最大关键字或者最小关键字,索引表按照关键字有序排列
查找过程
将待查找的关键字与索引表中的关键字进行比较,确定所在的块
然后在相应的块内进行查找
ASL分情况
3.基于树的查找法
基于树的查找法是将待查组织成特定树的形式并且在树的结构上实现查找的方法
- (1)二叉排序树(二叉查找树,是特殊的二叉树)
二叉排序树的定义与描述
若左子树非空,则左子树上所有结点的值均小与它的根结点的值
若右子树非空,则右字数上所有结点的值均大于等于它的根结点的值
它的左右子树也分别为二叉排序树
二叉排序树的插入与创建
插入的时间复杂度为O(log2n)
创建的时间复杂度为O(nlog2n)
二叉排序树的查找
二叉排序树的特性:左子树小于根结点、右子树大于根结点
中序遍历一个二叉排序树,可以得到一个有序序列,可以采用折半查找
时间复杂度为O(log2n)
二叉排序树的删除
从二叉排序树中删除一个结点,不能把以该结点为根的子树都删除,只能删掉该结点
还要保证删除后所得的二叉树仍然满足二叉排序树的性质不变
在二叉排序树中删除一个结点,相当于删除有序序列中的一个结点
首先要查找删除的元素在不再二叉排序树中
时间复杂度为O(log2n) - (2)平衡二叉排序树(AV树)
当一棵二叉排序树满足:左子树与右子树的深度之差的绝对值小于1,左子树和右子树也是平衡二叉排序树
为了提高查找效率,时间复杂度为O(log2n)
平衡因子:结点的左子树深度与右子树深度之差(-1,0,1)
4.计算式查找法-哈希法
哈希法也叫做散列法、杂凑法、关键字地址计算法等
相应的表叫做哈希表、散列表、杂凑表等
基本思想
在元素地关键字K和元素地存储位置P之间建立一个对应关系H,使得P=H(K),H称为哈希函数
哈希表里面存放地就是这样一种一一对应的关系,以后查找起来会非常方便
当关键字集合很大的时候,关键字值不同的元素可能会影像到哈希表的同一地址上,这个现象叫做冲突
冲突是不可避免的,只能通过改进哈希函数的性能来减少冲突
哈希法:如何构造哈希函数、如何处理冲突
- (1)哈希函数的构造方法
原则函数本身便于计算、计算出来的地址分布均匀、尽可能减少冲突
数字分析法
平方取中法
分段叠加法
初留余数法
伪随机数法 - (2)处理冲突的方法
开放地址法(再散列法)
线性探测再散列、二次探测再散列、伪随机探测再散列
再哈希法
链地址法
建立公共溢出区