【数据结构线性表查找】——顺序查找和折半查找详解和代码
2015-04-23 20:08
281 查看
前言
查找的定义是:给定一个值k,在含有n个记录的表中找出关键字等于k的记录。若找到,则查找成功,返回该记录的信息或该记录在表中的位置;否则查找失败,返回相关的指示信息。
采用哪一种查找方法,需要考虑两点
(1)使用哪种数据结构来表示“表”;
(2)是对无序集合查找还是对有序集合查找。
线性表
三种在线性表上进行查找的方法:
(1)顺序查找
(2) 二分查找
(3)分块查找
线性表有顺序和链式两种存储结构。本文介绍顺序表实现的顺序查找算法。
一、顺序查找
顺序查找是一种最简单的查找方法。
思路:从表的一端开始,顺序扫描线性表,依次将扫描到的关键字和给定值k相比较,若当前扫描到的关键字与k相等,则查找成功;若扫描结束后,仍未找到关键字等于k的记录,则查找失败。
二、算法分析
在等概率情况下,pi=1/n(1≤i≤n),故成功的平均查找长度为
(n+…+2+1)/n=(n+1)/2
即查找成功时的平均比较次数约为表长的一半。
若K值不在表中,则须进行n+1次比较之后才能确定查找失败。
顺序查找的优缺点:
算法简单,查找效率低,因此,当n较大时不宜采用顺序查找。
三、折半查找(二分查找)
折半查找也称为二分查找,要求线性表中的节点必须己按关键字值的递增或递减顺序排列。
思路:首先用要查找的关键字k与中间位置的节点的关键字相比较,这个中间节点把线性表分成了两个子表,若比较结果相等则查找完成;若不相等,再根据k与该中间节点关键字的比较大小确定下一步查找哪个子表,这样递归进行下去,直到找到满足条件的节点或者该线性表中没有这样的节点。
采用二分查找的数据只适合采用顺序存储结构,不适用于链式存储结构。
也可以采用递归算法:
四、算法分析(二分查找)
对于n个元素,二分查找,成功时最多的关键字比较次数为:log2(n+1)
不成功时关键字比较次数为:log2(n+1)。
二分查找的优缺点
虽然二分查找的效率高,但是要将表按关键字排序。而排序本身是一种很费时的运算。既使采用高效率的排序方法也要花费O(nlgn)的时间。
二分查找只适用顺序存储结构。为保持表的有序性,在顺序结构里插入和删除都必须移动大量的结点。因此,二分查找特别适用于那种一经建立就很少改动、而又经常需要查找的线性表。
对那些查找少而又经常需要改动的线性表,可采用链表作存储结构,进行顺序查找。链表上无法实现二分查找。
参考:
http://sjjp.tjuci.edu.cn/sjjg/DataStructure/DS/web/chazhao/chazhao9.1.1.htm
查找的定义是:给定一个值k,在含有n个记录的表中找出关键字等于k的记录。若找到,则查找成功,返回该记录的信息或该记录在表中的位置;否则查找失败,返回相关的指示信息。
采用哪一种查找方法,需要考虑两点
(1)使用哪种数据结构来表示“表”;
(2)是对无序集合查找还是对有序集合查找。
线性表
三种在线性表上进行查找的方法:
(1)顺序查找
(2) 二分查找
(3)分块查找
线性表有顺序和链式两种存储结构。本文介绍顺序表实现的顺序查找算法。
一、顺序查找
顺序查找是一种最简单的查找方法。
思路:从表的一端开始,顺序扫描线性表,依次将扫描到的关键字和给定值k相比较,若当前扫描到的关键字与k相等,则查找成功;若扫描结束后,仍未找到关键字等于k的记录,则查找失败。
<span style="font-size:14px;">//顺序查找 //在顺序表R[0..n-1]中查找关键字为k的元素,成功时返回找到的元素的逻辑序号,失败时返回0 int SeqSearch(int a[],int n,int k) { int i=0; while(i<n&&a[i]!=k) //从表头往后找 i++; if (i>=n) //未找到返回0 return 0; else //找到返回逻辑序号i+1 return i+1; }</span>
二、算法分析
在等概率情况下,pi=1/n(1≤i≤n),故成功的平均查找长度为
(n+…+2+1)/n=(n+1)/2
即查找成功时的平均比较次数约为表长的一半。
若K值不在表中,则须进行n+1次比较之后才能确定查找失败。
顺序查找的优缺点:
算法简单,查找效率低,因此,当n较大时不宜采用顺序查找。
三、折半查找(二分查找)
折半查找也称为二分查找,要求线性表中的节点必须己按关键字值的递增或递减顺序排列。
思路:首先用要查找的关键字k与中间位置的节点的关键字相比较,这个中间节点把线性表分成了两个子表,若比较结果相等则查找完成;若不相等,再根据k与该中间节点关键字的比较大小确定下一步查找哪个子表,这样递归进行下去,直到找到满足条件的节点或者该线性表中没有这样的节点。
采用二分查找的数据只适合采用顺序存储结构,不适用于链式存储结构。
//二分查找 //在有序表R[0..n-1]中进行二分查找,成功时返回元素的逻辑序号,失败时返回0 int BinSearch(int R[],int n,int k) { int low=0,high=n-1,mid; while(low<=high) //当前区间存在元素时循环 { mid=(low+high)/2; if (R[mid]==k)//查找成功返回其逻辑序号mid+1 return mid+1; if (R[mid]>k) //继续在R[low..mid-1]中查找 high=mid-1; else low=mid+1; //继续在R[mid+1..high]中查找 } return 0; }
也可以采用递归算法:
//二分查找 //采用递归算法: int BinSearch1(int R[],int low,int high,int k) { int mid; if (low<=high) //查找区间存在一个及以上元素 { mid=(low+high)/2; //求中间位置 if (R[mid]==k) //查找成功返回其逻辑序号mid+1 return mid+1; if (R[mid]>k) //在R[low..mid-1]中递归查找 BinSearch1(R,low,mid-1,k); else //在R[mid+1..high]中递归查找 BinSearch1(R,mid+1,high,k); } else return 0; }
四、算法分析(二分查找)
对于n个元素,二分查找,成功时最多的关键字比较次数为:log2(n+1)
不成功时关键字比较次数为:log2(n+1)。
二分查找的优缺点
虽然二分查找的效率高,但是要将表按关键字排序。而排序本身是一种很费时的运算。既使采用高效率的排序方法也要花费O(nlgn)的时间。
二分查找只适用顺序存储结构。为保持表的有序性,在顺序结构里插入和删除都必须移动大量的结点。因此,二分查找特别适用于那种一经建立就很少改动、而又经常需要查找的线性表。
对那些查找少而又经常需要改动的线性表,可采用链表作存储结构,进行顺序查找。链表上无法实现二分查找。
参考:
http://sjjp.tjuci.edu.cn/sjjg/DataStructure/DS/web/chazhao/chazhao9.1.1.htm
相关文章推荐
- 数据结构之详解有序表查找
- 数据结构之算法2.6-在顺序线性表L中查找第1个值与e满足compare()的元素的位序
- C++代码,数据结构-次优查找树
- 【数据结构与算法】【查找】顺序查找(线性查找)的代码实现
- 数据结构与算法_折半查找
- 【数据结构与算法】【查找】插值查找的代码实现
- 【数据结构与算法】【查找】哈希表的代码实现
- 数据结构之折半查找
- 【数据结构与算法】【查找】斐波那契查找的代码实现
- 【数据结构作业六a】建立一个顺序表,用顺序查找、折半查找的方法对其实施查找
- SDUT 3378 数据结构实验之查找六:顺序查找
- 看数据结构写代码(53) 静态查找表(线性查找,二分查找,斐波那契查找,插值查找)
- 【数据结构与算法】【查找】折半查找(二分查找)的代码实现
- 详解常用查找数据结构及算法(Python实现)
- 详解常用查找数据结构及算法(Python实现)
- 数据结构——线性表——散列存储结构——哈希表知识点总结 原创 2017年05月14日 10:08:40 散列(hashing)是一种重要的存储方法,也是一种常见的查找方法。 基本思想:以结点的
- C语言 数据结构查找 顺序查找及折半查找
- 数据结构 折半递归查找,二叉排序树查找
- 数据结构实验之查找二:平衡二叉树
- 数据结构实验之查找五:平方之哈希表