分治算法
分治法的基本思想是将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同。求出子问题的解,就可得到原问题的解。即一种分目标完成程序算法,简单问题可用二分法完成。
分治法的精髓
分--将问题分解为规模更小的子问题;
治--将这些规模更小的子问题逐个击破;
合--将已解决的子问题合并,最终得出“母”问题的解。
应用
分治法具体应用有查找技术还有排序技术。查找技术有二分查找;排序有快速排序还有归并排序等。
查找技术
二分查找:
前提:是数据已经排序。
注意:
《编程珠玑》里说过:大约10%的专业程序员,才能够正确地写出二分查找。尽管第一个二分查找程序于1946年就公布了,但是第一个没有bug的程序在1962年才出现。
所以,很多人以为自己写的二分查找都没问题,实际上,如果忽略了一点,你写的二分查找都是有问题的,都是不对的。
特别注意:二分查找要设计成左闭右开,这是一种区间无重复的思想。比如,random(0,1)等大量的数学函数
for(int i=0;i<array.length;i++)。
步骤:
一:
1、定义出高位指针还有低位指针,用于定位
2、定义出中间指针进行二分操作
3、移动指针中间指针,定位中间与目标比较大小
如图所示:
二:
1、target是要索引的目标,我们先定位出中间指针所在的数组元素,与索引目标进行比较大小。
2、如果中间指针索引出元素大于目标索引元素,高尾指针不动,低位指针将会向右移动,定位到中间指针原来的位置加1,然后,中间指针重新定位。(反之,移动高位指针减1,低位指针保持不动,中间指针重新定位),如图:
三:
1、中间指针索引出元素小于target时,就是低位指针保持不变,高位指针定位到原有的中间指针位置减1,重复第二和第三动作,直到有指针重合,就可以定位到元素。如图:
\
以上就是二分查找的思想,接下来,用代码实现,以下就是二分查找实现的过程。
/**
* 二分查找法
* @param array 数组
* @param fromIndex 开始索引位置
* @param toIndex 结束索引位置
* @param key 目标值
* @return
*/
public static int binarySearch(int[] array, int fromIndex, int toIndex, int key){
int low = fromIndex; //低位指针
int high = toIndex -1;//高位指针,注意左闭右开
while (low <= high){
int mid = (low+high)/2; //中间指针
int midValue = array[mid];
if(key > midValue){
low = mid+1; //小于目标值,移动低位指针
}else if(key < midValue){
high = mid-1; //大于目标值,移动高位指针
}else{
return mid;
}
}
return -(low+1); //未找到,直接返回出去
}
参考文献:
(1)《编程珠玑》是2008年10月人民邮电出版社出版的图书,作者是Jon Bentley