二分查找
二分查找,它适用于有序的顺序表。思路是:首先将给定值与表中中间位置元素的关键字进行比较,若相
等,则查找成功,返回该元素的存储位置;若不等,则所需查找的元素只能在中间元素以外的前半部分或者后
半部分中。然后再缩小的范围内继续进行相同的查找,如此重复直到找到为止。如果确认表中没有所需查找的
元素,则返回查找失败的信息
代码:
// 二分查找(非递归)
int binary_Search(int value, int[]a, int left,int right){
while (left<=right){
int mid=(left+right)/2; //取中间位置
if(value>a[mid]){ //从后半部分继续查找
left=mid+1;
}else if(value<a[mid]){ //从前半部分继续查找
right=mid-1;
}else if(value==a[mid]){
return mid; // 查找成功,则返回所在位置
}
}
return -1; //查找元素不存在,返回-1
}
// 二分查找(递归)
int binary_Search(int value,int *a,int left,int right){
if(left>right) return -1;
int mid=(left+right)>>1;
if(value==a[mid]) return mid;
else if(value>a[mid]) return binary_Search(value,a,mid+1,right);
else return binary_Search(value,a,left,mid-1);
}
三分查找
类似于二分查找,三分查找法也是比较常用的基于分治思想的高效查找方法。但是和二分不同,二分只适用于
单调函数,三分查找不一样,用于左边递增右边递减或者相反的,这一类函数也就是常说的凸函数和凹函数。
三分法之所以可以用于凸函数或者凹函数,是因为这种函数总是有一个最大值或者最小值,这样就可以借此判
断出三分法中两个中点相对相对于极值的位置
三分搜索的实现主要是判断midl和midr所在值的大小。以凸函数为例(凹函数类似,只是判mid大小的时候保
留小的即可[其实是保留离极值最近的mid]),先以left和right为端点计算出它们的中点midl,然后再以
midl和right为端点计算出它们的中点midr,接下来就需要判断f(midl)和f(midr)值的大小了,如果f(midl)大
于f(midr),那么说明midl靠近极值,此时令right=midr,否则说明midr靠近极值,此时则令left=midl,总
之就是要保留离极值最近的那一个mid,然后重复前面的过程,直到left和right十分接近,最终f(left)就等于
极值
double solve(double parameter){
// 计算函数值,即f(x)
}
double trisection_search(double left, double right){
//三分搜索,找到最优解(求函数最大值下的自变量值)
double midl,midr;
while (right-left>1e-7){
midl=(left+right)/2;
midr=(midl+right)/2;
//如果是求最小值的话这里判<=即可
if(solve(midl)>=solve(midr)) right = midr;
else left=midl;
}
return left;
}
来源:CSDN
作者:Happig丶
链接:https://blog.csdn.net/qq_44691917/article/details/104106346