7.1.查找的基本概念
一.查找的基本概念:
1.查找:找到所需的数据;
2.查找表:用来存储数据的数据结构;
3.查找表可以是线性结构、树形结构、图结构(网状结构),因此查找表由数据元素构成;
4.查找表并不是特定的数据结构,它只是对于要执行查找操作的这个数据结构的统称,所以查找表并不是新的数据结构;
5.关键字:用来唯一区分各个数据元素的数据项->
-
例一:如上图,给出了一张表,表的内容是成绩信息,每个同学会有一个学号,这个学号都是不重复的,所以可以把学号这个数据项作为区分各个数据元素的关键字,姓名无法作为关键字,因为姓名可能重复,比如上述表中的"铁柱"
-
例二:如上图,一个图结构,这是由微信的用户信息组成的一个图结构,当查询这个图结构时,这个图结构就是当前的查找表,每一个用户信息就是这个查找表当中的数据元素,这个场景当中可以把每个用户的微信号作为关键字,因为微信号是唯一的,但是微信昵称可能重复,因此微信昵称不能作为关键字,比如上述图片中的"铁柱"
二.对查找表的常见操作:
查找表常见的有两类操作:
第一类操作是"查找",不会涉及到对数据元素的修改;
第二类操作是"插入、删除",会导致查找表中的数据元素发生改变。
查找表名称 | 概念 | 数据元素特点 | 实例 | 效率 |
---|---|---|---|---|
静态查找表 | 如果一个查找表只需要进行第一类操作即"查找"数据元素,那么这类查找表就是静态查找表 | 静态查找表中的数据元素是静态的,不会发生改变 | 比如记录成绩的查找表,因为成绩一旦确定是不会改变的 | 设计静态查找表的查找算法时,只需要关注查找数据元素的效率即可,因为只进行"查找"操作 |
动态查找表 | 如果一个查找表中不仅要进行第一类操作即"查找"数据元素外,还需要进行第二类操作即"插入/删除"数据元素,那么这类查找表就是动态查找表 | 动态查找表中的数据元素是动态的,会发生改变 | 比如一个商家的点餐订单系统,因为各个订单的数据信息会新增/删除/查找 | 设计动态查找表的查找算法时,除了要考虑查找数据元素的效率之外,还需要考虑插入/删除数据元素的效率 |
-
在实际应用当中,需要考虑到当前的场景是否需要增加/删除数据元素,如果需要,就使用动态查找表,如果不需要,就使用静态查找表,不同的查找表的存储结构(物理结构)与数据结构是不同的,用不同的数据结构来存储数据相应的会影响到算法的实现与效率
三.查找算法的评价指标:
1.概念:
-
查找算法的评价指标关键看算法的平均查找长度ASL:要把各种情况都考虑进去,然后考虑到每种情况发生的概率
-
题目没特别说明的情况下,默认是查找任何一个元素的概率都是等可能的
2.实例:
比如求二叉排序树的ASL,以上述图片左边的树为例,在全部能查找成功的情况下,
如果要查找50,那么从根结点出发,需要对比一次关键字即可找到50,树的第一层共有1个结点,所以第1项是1 * 1,
如果要查找26,那么从根结点出发,需要对比两次关键字即可找到26,树的第二层共有2个结点,所以第2项是2 * 2,
如果要查找21,那么从根结点出发,需要对比三次关键字即可找到21,树的第三层共有4个结点,所以第3项是3 * 4,
如果要查找68,那么从根结点出发,需要对比四次关键字即可找到68,树的第四层共有1个结点,所以第4项是4 * 1,
所以该二叉排序树的ASL=( 1 * 1 + 2 * 2 + 3 * 4 + 4 * 1 ) * 1/8=2.625,
最后乘以1/8指的是总共有8个数据元素,这8个数据元素被查找的概率都是1/8。
->本例中ASL=( 1 * 1 + 2 * 2 + 3 * 4 + 4 * 1 ) * 1/8=1 * 1 * 1/8 + 2 * 2 * 1/8 + 3 * 4 * 1/8 + 4 * 1 * 1/8 = 2.625详解:
-
由于默认每一个数据元素被查找成功的概率都相同,所以可以把概率单独提取出来,即ASL=( 1 * 1 + 2 * 2 + 3 * 4 + 4 * 1 ) * 1/8=2.625
-
ASL=1 * 1 * 1/8 + 2 * 2 * 1/8 + 3 * 4 * 1/8 + 4 * 1 * 1/8 = 2.625中已经把二叉排序树中所有数据元素全部计入求和
-
ASL=1 * 1 * 1/8 + 2 * 2 * 1/8 + 3 * 4 * 1/8 + 4 * 1 * 1/8 = 2.625的第一项1 * 1 * 1/8由之前的分析可知,就是第一个元素的查找概率 * 查找长度,只不过只有1个;第二项2 * 2 * 1/8由之前的分析可知,就是第二、三个元素的查找概率 * 查找长度,只不过有2个;第三项3 * 4 * 1/8由之前的分析可知,就是第四、五、六、七个元素的查找概率 * 查找长度,只不过有4个;第四项4 * 1 * 1/8由之前的分析可知,就是第八个元素的查找概率 * 查找长度,只不过只有1个
但是,实际中存在查找失败的情况,所以评价一个查找算法的查找效率时,通常会分开考虑查找成功和查找失败两种情况下的ASL,ASL的数量级就可以直接地反应了查找算法的时间复杂度。