分治法之查找技术--二分查找

分治算法

分治法的基本思想是将一个规模为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

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值