二分查找算法

合集下载

2分查找算法

2分查找算法

2分查找算法二分查找算法,也称为折半查找算法,是计算机科学中一种常用的查找算法。

它的核心思想是将待查找的数据集合分成两半,然后通过与目标值的比较,确定目标值可能存在的范围,再逐步缩小范围,直到找到目标值或确定目标值不存在。

二分查找算法适用于有序的数据集合,可以快速定位目标值的位置,时间复杂度为O(logn)。

下面以二分查找算法为中心,详细阐述其原理和应用。

一、算法原理二分查找算法的原理非常简单,主要包含以下几个步骤:1.确定查找范围:将待查找的数据集合按照升序或降序排列,并确定查找范围的起始位置和结束位置。

2.计算中间位置:通过起始位置和结束位置计算出中间位置。

3.比较目标值:将目标值与中间位置的值进行比较。

-如果目标值等于中间位置的值,则查找成功,返回中间位置。

-如果目标值小于中间位置的值,则目标值可能在前半部分,将查找范围缩小到前半部分。

-如果目标值大于中间位置的值,则目标值可能在后半部分,将查找范围缩小到后半部分。

4.缩小查找范围:根据比较结果,缩小查找范围为前半部分或后半部分,并重复步骤2和步骤3,直到找到目标值或确定目标值不存在。

二、算法示例为了更好地理解二分查找算法,我们以一个具体的例子来说明:假设有一个按升序排列的数组[1,3,5,7,9,11,13,15,17, 19],我们要查找目标值为9的位置。

1.确定查找范围:起始位置为0,结束位置为9。

2.计算中间位置:(0+9)/2=4,中间位置为4。

3.比较目标值:目标值9大于中间位置的值7,所以目标值可能在后半部分。

4.缩小查找范围:将查找范围缩小到[9,11,13,15,17,19],起始位置更新为中间位置+1=5,结束位置不变。

5.重复步骤2和步骤3:计算新的中间位置(5+9)/2=7,中间位置为7。

目标值9小于中间位置的值15,所以目标值可能在前半部分。

6.缩小查找范围:将查找范围缩小到[9,11,13],起始位置更新为5,结束位置更新为中间位置-1=6。

二分查找公式介绍

二分查找公式介绍

二分查找公式介绍公式说明二分查找(Binary Search)是一种高效的查找算法,也称折半查找,用于在有序数组中查找指定元素的位置。

它的基本原理是每次通过将目标值与数组的中间元素进行比较,从而将搜索范围缩小一半,直到找到目标值或确定目标值不存在。

但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。

下面详细介绍二分查找的原理和应用,并提供一个例子来说明其使用。

公式原理首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。

重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。

前提条件:二分查找要求应用于有序数组或有序列表,这是因为它需要按照元素的大小顺序进行比较和查找。

确定搜索范围:初始时,将整个数组作为搜索范围。

设定左边界(low)为0,右边界(high)为数组长度减1。

计算中间位置:通过计算中间位置(mid = (low + high) / 2)来确定中间元素的索引。

比较目标值:将目标值与中间元素进行比较。

如果目标值等于中间元素,则查找成功,返回中间位置的索引。

如果目标值小于中间元素,证明目标值可能出现在左半部分,将高位边界设为mid-1,即查找范围缩小为左半部分。

如果目标值大于中间元素,证明目标值可能出现在右半部分,将低位边界设为mid+1,即查找范围缩小为右半部分。

循环操作:重复步骤3和步骤4,直到找到目标值或搜索范围缩小至无法再继续划分为止。

二分查找具有时间复杂度O(log n),相比于线性查找的时间复杂度O(n),它在大型有序数组中的查找效率非常高。

公式举例应用下面通过一个例子来说明二分查找的使用:假设有一个有序数组arr,其中包含如下元素:[2, 5, 8, 12, 16, 23, 38, 56, 72, 91]。

二分查找算法详解

二分查找算法详解

二分查找算法详解
一、算法介绍
二分查找算法又称折半查找算法,是一种分治思想的算法。

它的思想是:将空间定义为一个有序数组中从左到右的递增区间,每次进行二分查
找的时候,可以将空间缩小一半。

首先,取有序数组的中间元素作为比较
的对象,如果查找的目标元素与此元素相等,则直接输出结果;如果查找
的目标元素大于中间元素,则将查找范围减小一半,从中间元素的右半部
分继续进行查找;如果查找的目标元素小于中间元素,则将查找范围减小
一半,从中间元素的左半部分继续进行查找;如此反复,直到找到要查找
的目标元素,或者没有找到目标元素为止。

因此,如果要查找的元素在有
序数组中,二分查找算法有最佳的效率,因此,它是一种快速算法。

二、算法描述
1、首先,为有序数组定义low、high指针,令low指向有序数组的
第一个元素,high指向有序数组的最后一个元素。

2、然后,取有序数组的中间元素mid(即low和high的中间位置),将mid元素与查找的目标元素target进行比较。

3、如果target等于mid元素,则查找成功,输出mid元素的下标;
4、如果target大于mid元素,则将空间范围缩小一半,把low设置
为mid+1,继续进行二分查找;。

二分查找算法(折半查找算法)

二分查找算法(折半查找算法)

二分查找算法(折半查找算法)
二分查找算法也称折半查找算法,是在有序数组中查询其中一特定元
素的算法。

它的基本思想是:将数组中间位置的元素与要查找的元素比较,如果两者相等,则查找成功;如果要查找的元素小于中间位置元素,则在
数组的前半部分查找;如果要查找的元素大于中间位置元素,则在数组的
后半部分查找。

它采用分而治之的思想,基于这个思想,将一个庞大的问题划分成规
模较小的子问题分别解决,然后将子问题的解组合起来构成原问题的解。

具体而言,就是将要查找的元素(也就是目标值)与数组的元素对比,每次
都只比较一部分,直到确定位置,也就是找到目标值,此时查询结束。

实现二分查找算法的基本步骤如下:
(1)首先,从有序数组的中间元素开始,将中间元素与要查找的元
素进行比较;
(2)如果查找的元素正好是中间元素,则查找成功;
(3)如果查找的元素小于中间元素,则在数组的前半部分查找;
(4)如果查找的元素大于中间元素,则在数组的后半部分查找;
(5)重复上面的步骤,直到查找到指定的元素或者查找范围为空为止。

生活中的二分查找算法

生活中的二分查找算法

二分查找算法是一种在有序数组中查找特定元素的高效算法。

在生活中,我们可以将二分查找算法应用于许多场景,以提高搜索效率。

以下是一些例子:
1. 字典查找:当我们使用字典查找一个单词的定义时,通常会从中间的页码开始查找。

如果所查找的单词在中间页码之前,则在字典的前半部分查找;如果在中间页码之后,则在字典的后半部分查找。

这种查找方式就是应用了二分查找算法。

2. 电话簿搜索:在电话簿中查找一个联系人时,我们可以先大致估计联系人姓名所在的位置,然后根据估计的位置进行查找。

如果找到了联系人,则搜索成功;如果没有找到,则根据姓名首字母在电话簿中的位置,判断联系人可能在前面或后面的部分,然后相应地缩小搜索范围。

这也是二分查找的一种应用。

3. 有序数据库查询:在数据库管理中,当我们需要根据特定关键字查询数据时,如果数据库中的数据是有序的,我们可以使用二分查找算法来加快查询速度。

例如,在电子商务网站中根据价格排序的商品列表中查找特定价格的商品。

4. 软件更新:在软件更新过程中,有时我们需要根据特定条件(如版本号)在大量更新文件中查找对应的更新包。

通过使用二分查找算法,我们可以快速定位到所需的更新文件,从而提高更新效率。

5. 排序比赛:在某些排序比赛中,参赛者需要根据特定的规则对一系列数据进行排序。

在这种情况下,参赛者可以使用二分查找算法来确定自己的排名,从而节省时间并提高效率。

总之,二分查找算法在生活中的许多场景中都有应用,它可以帮助我们更快地找到所需的信息,提高工作和生活的效率。

二分查找算法范文

二分查找算法范文

二分查找算法范文二分查找算法(Binary Search Algorithm)是一种常用的查找算法。

该算法主要应用于已排好序的数组或列表中,通过将目标值与数组或列表的中间元素进行比较,根据比较结果,在目标值可能出现的区间内继续查找,直到找到目标值或确定目标值不存在为止。

二分查找算法的时间复杂度为O(log n),相对较低,因此在大规模数据的查找中具有较高的效率和优势。

具体的二分查找算法步骤如下:1.确定查找范围:首先,确定待查找区间的起始和结束位置。

通常情况下,起始位置为数组的第一个元素的索引值,结束位置为数组的最后一个元素的索引值。

2.计算中间元素:通过求取起始和结束位置的中间索引值,可以得到查找区间的中间元素,即“中间元素”的值。

3.比较中间元素与目标值:将中间元素与目标值进行比较。

若中间元素等于目标值,则返回中间元素的索引值,表示找到目标值。

若中间元素大于目标值,则说明目标值可能位于中间元素的左侧,将查找区间缩小为起始位置到中间元素的前一个位置,重复步骤2;若中间元素小于目标值,则说明目标值可能位于中间元素的右侧,将查找区间缩小为中间元素的后一个位置到结束位置,重复步骤24.重复查找步骤:根据中间元素与目标值的大小关系,重复执行步骤2和步骤3,直到找到目标值或确定目标值不存在为止。

5.返回查找结果:若找到目标值,则返回其索引值。

若确定目标值不存在,则返回一个特定的错误码或指定的标识值,表示未找到目标值。

1.待查找数组的有序性:二分查找算法要求待查找的数组或列表必须是有序的。

如果不满足有序性要求,可以事先进行排序操作,再进行查找。

2.查找区间的更新与终止条件:在每次查找过程中,需要根据中间元素与目标值的大小关系,不断更新查找区间的范围。

同时,需要确定查找的终止条件,即查找区间缩小为一个元素,或者查找区间中不存在目标值。

3.边界条件的处理:在实现二分查找算法时,需要考虑各种边界情况。

例如,若待查找数组为空,需要返回不存在的结果;若查找区间的起始位置大于结束位置,表示查找失败。

二分法查找数值

二分法查找数值

二分法查找数值
二分法查找数值
二分法,也叫二分查找,是一种在有序数组中查找特定元素的算法。

其基本思想是每次取数组中间的值与目标值进行比较,然后根据比较结果舍弃一半的数据,直到找到目标值或者发现目标值不存在为止。

二分法查找数值的具体步骤如下:
1. 初始化左右指针,left=0,right=n-1。

(n为数组长度)
2. 当left小于等于right时,进行以下操作:
3. 取中间值middle=(left+right)/2。

4. 如果中间值等于目标值,返回目标值的位置。

5. 如果中间值大于目标值,说明目标值在middle的左侧,将right更新为middle-1。

6. 如果中间值小于目标值,说明目标值在middle的右侧,将left更
新为middle+1。

7. 如果循环结束还没有找到目标值,说明目标值不存在,返回-1。

二分法的时间复杂度为O(logN),是一种十分高效的查找算法,因此
在很多情况下都被广泛应用。

其中包括在数据量较大的有序数组中查
找特定元素,以及在游戏中对答案进行猜测等。

总之,二分法通过逐步缩小查找范围,可以快速高效地查找指定元素,是一种很实用的算法。

在实际使用时,需要注意的是数组必须是有序的,否则无法保证算法正确性。

同时,由于函数栈空间有限,在数据
量较大时需要注意是否会爆栈。

二分查找算法范文

二分查找算法范文

二分查找算法范文二分查找(Binary Search)算法是一种在有序数组中查找特定元素的高效算法。

首先,需要对数组进行排序,然后确定待查找元素的取值范围,不断将待查找元素与数组的中间元素进行比较,从而缩小查找范围,直到找到目标元素或确定目标元素不存在。

下面是二分查找算法的详细步骤:1.将待查找数组按照升序或降序排序。

2. 初始化起始位置start和结束位置end为数组的第一个和最后一个元素的索引。

3. 迭代,直到start大于end时退出循环:a. 计算中间元素的索引mid,即mid = (start + end) / 2b.比较中间元素与目标元素的值:-如果目标元素等于中间元素,返回中间元素的索引。

- 如果目标元素小于中间元素,更新end为mid-1,即end = mid - 1- 如果目标元素大于中间元素,更新start为mid+1,即start = mid + 14.如果循环终止时还没有找到目标元素,返回不存在。

然而,二分查找算法也有一些限制:-数组必须是有序的,否则算法无法正常工作。

-数组的插入和删除操作会破坏有序性,需要重新排序才能继续使用二分查找算法。

-当待查找元素有多个时,二分查找算法只能找到其中一个元素的索引,无法确定是否还有其他相等的元素。

除了在有序数组中查找特定元素,二分查找算法还可以应用于其他问题,如找到一个数的平方根、在旋转有序数组中查找目标元素等。

这些问题的解决方法基本上与二分查找算法类似,只需稍作改变即可。

总结来说,二分查找算法是一种高效的算法,适用于有序数组中查找特定元素。

通过不断将待查找元素与数组的中间元素进行比较,可以缩小查找范围,提高效率。

二分查找算法时间复杂度为O(log n),在大规模有序数组中表现优异。

然而,对于无序数组、频繁插入和删除操作的场景,二分查找算法并不适用。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
二分查找算法
CUGB ACM/ICPC GROUP
二分查找算法
简单定义:在一个单调有序的集合中查找元素,每次 将集合分为左右两部分,判断解在哪个部分中并调整 集合上下界,重复直到找到目标元素。 时间复杂度:O (logn),优于直接顺序查找O(n)
CUGB ACM/ICPC GROUP
例子:
CUGB ACM/ICPC GROUP
//查找到符合元素x
{
res = mid;
break;
}
else if(num[mid]<x)
//x在右边部分,调整集合下界
low=mid+1;
else
//x在左边部分,调整集合上界
high=mid-1;
}
//若未找到x,则res = -1
CUGB ACM/ICPC GROUP
查找连续函数的写法
//x:待查找的值,Caculate():所要查找的函数,在这里单调递增 //需保证查找的值在区间范围内 double low=“区间下界”,high=“区间上界”,mid; while(high - low > 1.0e-6) {
mid = (high + low)/2; if(Caculate(mid)<x)
low=mid; else
high=mid; }
CUGB ACM/ICPC GROUP
常见拓展
对于某些问题,如果答案具有特定的范围,并且验证 答案是否成立的函数具有单调性。则可以在范围内对答 案进行二分验证,从而快速确定答案。
CUGB ACM/ICPC GROUP
例子:ZOJ 3203 Light Bulb
如图,人左右走动,求影子L的 最长长度。 根据图,很容易发现当灯,人的 头部和墙角成一条直线时(假设 此时人站在A点),此时的长度 是影子全在地上的最长长度。当 人再向右走时,影子开始投影到 墙上,当人贴着墙,影子长度即 为人的高度。所以当人从A点走 到墙,函数是先递增再递减,为 凸性函数,所以我们可以用三分 法来求解。
CUGB ACM/ICPC GROUP Nhomakorabea 核心代码
double mid, midmid; while ( low + eps < high ) {
mid = (low + high) / 2; midmid = (mid + high ) / 2; double cmid = cal(mid); double cmidmid = cal(midmid); if ( cmid > cmidmid )
long long res,mid; while (low <= high) {
mid = (high + low) / 2; if (judge(mid) ) {
low = mid + 1; res = mid; //最后结果为res } else { high = mid - 1; } }
bool judge(long long mid) {
CUGB ACM/ICPC GROUP
CUGB ACM/ICPC GROUP
三分法
当需要求某凸性或凹形函数的极值,通过函数本身 表达式并不容易求解时,就可以用三分法不断逼近求 解。
CUGB ACM/ICPC GROUP
三分法
类似二分的定义Left和Right mid = (Left + Right) / 2 midmid = (mid + Right) / 2; 如果mid靠近极值点,则Right = midmid; 否则(即midmid靠近极值点),则Left = mid;
CUGB ACM/ICPC GROUP
x轴——每个人分到的面积v y轴——对应可分最大人数p
对于第一组样例—— 图中红点所对应的v值即 为最优解,二分查找满足 p>=4时v的最大值即可得 到答案
CUGB ACM/ICPC GROUP
核心代码
//由于精度差问题,考虑先将面积 *1000000转化为整数来二分
high = midmid; else
low = mid; }
double cal(double x) {
return (h * D - H * x) / (D - x) + x; //这里放要求的函数; }
CUGB ACM/ICPC GROUP
总结
对于求解一些实际问题,当公式难以推导出来时,二 分、三分法可以较为精确地求解出一些临界值,且效 率也是令人满意的。 灵活应用这些方法对解题会很有帮助。
参考程序
//x:待查找的元素, n:数组集合大小, num数组单调递增
int low=0,high=n,mid,res = -1; //low:集合下界 high:集合上节
while(low<=high)
{
mid=(low+high)/2;
//mid:将集合分割为两部分
if(num[mid]==x)
CUGB ACM/ICPC GROUP
例子:HOJ2651 PIE
题目大意:有f+1个人分n块披萨,每个人要求分得的面 积一样,且披萨只能被切开而不能重新组合,求每个人 能分到的最大面积v。 分析:对于每个确定的v,可以计算出最多能满足的人 数p。因此得到一个单调递减的函数关系,并且v的范围 也可以确定为0~max(size(i)),i=1...n。
long long p = 0; for (int i = 0; i < n; ++i) {
p += size[i] / mid; } return p >= f; }
CUGB ACM/ICPC GROUP
推荐题目
Poj 3273 ,1434 Hdu 2141 ,2899,1969 Coj 1080 ,1216,1048
相关文档
最新文档