现实生活中经常会遇到将具有某个特征的元素选择出来,并找出对应的位置。
现在来一个小测验,在以数组【1,4,8,3,0,7,56】中找到8所在的位置,很明显大家可以通过直观的感受就可以找到8处于位置3上。
现在换一组数据,【2,6,9,....,3,78,34】,总共有3000个元素,要求找到3这个元素处在的位置,可见从只管感受上不能选择出来。那么有没有更好的办法解决这个问题呢?
针对这个问题,二分法查找算法就能够很好的解决这个问题。接下来先了解二分法原理
二分法原理:
1. 设置查找区间:low = 0;high= n(n是查找数组的长度);
2. 若查找区间[low, high]不存在,则查找失败;否则转步骤3
3. 取中间位m= (low + high) / 2;比较 target 与 array[mid](其中target是目标,array是数组),有以下三种情况:
A. 若 target < array[m],则high = m - 1;查找在左半区间进行,转步骤2;
B. 若 target > array[m],则low = m + 1;查找在右半区间进行,转步骤2;
C. 若 target = array[m],则查找成功,返回 m值;
这里要注意,二分法查找的线性表中的元素必须是有序的。
总的来说,二分法查找是一种区间折半逼近的方法,通过取中间点判断目标值是否在中间点的前面还是后面或者中间,进而缩小范围。
当确定在前半部分或者后部分之后,在对前或后半部分再一次取中间点,依次下去,直到找到目标值。
可以说,二分法的原理具有简单高效的效果。
下面给出以java编写的二分法查找算法的实现代码:
package algorithm;
// 实现二分法查找算法
public class Two_Find_algorithm {public static void main(String[] args) {//创建一个数组int [] array={1,5,9,15,36,39,41,42,49,50,58};int targe=49;int index=FindBary(array,targe);//打印结果//System.out.println(array);System.out.println("目标值所在位置索引为:"+index);}//构造FindBary方法public static int FindBary(int [] a,int t) {//获取边界int l=0,r=a.length,m;while(l<=r) {m=(l+r)/2;if(a[m]==t){return m;}else if(a[m]>t){r=m-1;}else {l=m+1;}}return -1;}
}
显示结果:
目标值所在位置索引为:8
matlab:一种有效的差分进化算法解决多目标优化问题(简称MODEA)