当前位置: 首页 > 科技观察

顺序查找和二分查找详解

时间:2023-03-20 19:33:35 科技观察

0。Abstract狗选本文主要先介绍搜索的概念,然后介绍最简单的搜索算法——顺序搜索,最后介绍二分查找。1、什么是搜索?我们平时做很多事情,都会涉及到很多的增删改查操作。例如,用户管理系统涉及用户注册(增加)、用户注销(删除)、用户信息修改(修改)、用户查找(查询)等。其中,“删除”和“修改”依赖于“检查”操作。下面重点介绍finding的重要操作。现在给你一个花名册,让你找一个学生。我们的方法是:根据学生的姓名或学号,在花名册中一一比较,直到找到学号或学名符合要求的学生,否则可以说花名册中没有该学生。花名册是一个集合,也称为查找表,它具有大量相同类型的元素,也称为记录——学生。可以有同名学生,但不能有重复学号,即一个学号只对应一个学生,一个名字可以对应多个学生。如果我们根据学号查找,只要花名册中有一个,我们就可以找到唯一符合要求的学生。如果我们按姓名搜索,那么我们可能会找到多个符合条件的学生。学号、姓名等可以识别一个学生的值称为关键字。唯一标识一个元素的值,如学号,是主关键字,可以标识多个元素的值,如姓名,是次关键字。当集合中的元素只有一个数据项时,它的键就是数据元素的值。比如数组[1,2,3,4,5,6,7,8,9]只有一个数据项,关键字是元素值本身;而roster中的元素——student,有三个数据项Item——学号、姓名、专业,其中学号和姓名为关键字。如果你学过数据库,上面的概念很容易理解。所谓查找,通俗地说,就是根据一定的查找依据,在一大群元素(集合/查找表)中找到符合要求的特定元素(记录)。如果找到,则查找成功,返回该元素的信息;如果查找完所有元素都没有找到,则说明这组元素中没有符合要求的元素,即查找失败,返回一个可以明确标示失败的值,如“empty”记录”或“空指针”。所谓搜索依据,就是给定一个目标值,比较目标值是否等于关键字。这要求目标值和关键字是同一类型。2.顺序搜索(SequentialSearch)顺序搜索是我们最容易想到的搜索方式。在上面的名册示例中,顺序搜索用于查找学生。顺序搜索思路:从集合中的第一个元素到最后一个元素,逐个比较其关键字和目标值。如果关键字等于目标值,则搜索成功,返回搜索到的元素信息;如果没有关键字等于目标值,则搜索失败,返回失败标识值。例如给定一个数组[11,8,4,6,9,1,16,22,14,10],给定目标值key,如果找到,则返回其数组下标;否则,返回-1:只从下标0开始遍历整个数组进行比较:/***@description:从头到尾遍历整个数组,找到目标值key,返回其下标index*@param{int}*array说明问题很简单,这里的数组元素不重复*@param{int}length数组长度*@param{int}key目标值*@return{int}如果找到,则返回目标值的下标;否则返回-1*/intsequential_search(int*array,intlength,intkey){for(intindex=0;indexarray[mid]){//key大于中间值left=mid+1;//更新最左边下标,进入右半区}else{returnmid;//key等于中间值,返回其下标}}return-1;//没有找到,返回-1}二分查找的本质是中间标志mid将有序序列表一分为二,通过比较中间值和mid的大小关系targetvalue,能够过滤掉一半的数据,相当于减少了一半的工作量。在上面的例子中,只经过四次比较就找到了目标值。如果使用顺序搜索,则需要八次。可以看出,二分查找的效率比顺序查找有了很大的提高,但是美中不足的是二分查找必须要求元素是有序的。在元素的有序状态不改变或不经常改变的情况下,二分查找非常适合;但是如果涉及到频繁的插入删除操作,就意味着元素的有序状态会被频繁的破坏。这样一来,我们就得花费精力维持元素的有序状态,自然会降低效率,所以要根据实际情况灵活选择。以上就是顺序查找和二分查找的内容。请移至GitHub[1]|Gitee[2]获取完整代码。参考资料[1]GitHub:https://github.com/xingrenguanxue/Simple-DS-and-Easy-Algo[2]Gitee:https://gitee.com/xingrenguanxue/Simple-DS-and-Easy-Algo