二(三)分查找

非 Y 不嫁゛ 提交于 2020-01-30 04:11:09

二分查找

二分查找,它适用于有序的顺序表。思路是:首先将给定值与表中中间位置元素的关键字进行比较,若相

等,则查找成功,返回该元素的存储位置;若不等,则所需查找的元素只能在中间元素以外的前半部分或者后

半部分中。然后再缩小的范围内继续进行相同的查找,如此重复直到找到为止。如果确认表中没有所需查找的

元素,则返回查找失败的信息

代码:

// 二分查找(非递归)
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;
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!