二分搜索详解

①非递归结构的二分搜索算法:
        二分搜索解决的问题:在一个有序序列当中,查询某一指定取值的关键字在有序序列当中 下标 的问题。
        二分搜索的前提条件:待搜索序列必须是有序序列
        二分搜索的时间复杂度:O(log2 N) -> 暴力查询算法的时间复杂度是O(N)
二分搜索算法的实现步骤:
start:标记搜索范围的起点下标
end:标记搜索范围的终点下标
middle:标记搜索范围的中值下标
key > array[middle]:继续搜索右半侧区间:end不变,start = middle + 1;
key < array[middle]:继续搜索左半侧区间:start不变,end = middle - 1;
注意:s、m、e是有可能产生重叠的,即使产生重叠,也要继续进行一次搜索。 目标关键字在序列当中不存在的情况判断:start > end
注意:当目标元素在有序序列当中不存在的时候,可以返回-1,表示这个元素不存在;或者类
似于Arrays、Collections当中的binarySearch()方法一样,返回-(insertion point)-1;其中
insertion point表示:假设搜索目标取值在有序序列当中存在,其应该插入的下标位。
规律:在二分搜索失败的情况下,start变量的最终取值始终是这个关键字如果存在于有序序列
当中的应当插入的下标位(
insertion point)
②递归结构:
定义:一个方法在内部调用自己,就构成了递归结构。
思想:大事化小、小事化了
大事化小:大问题可以拆分称为诸多子问题,子问题与大问题之间解决过程一致,只有问题
规模在下降
小事化了:当将大问题逐层拆解成为子问题、规模更小的子问题的过程当中,总有一层子问
题的规模已经是最小的了、不能够继续拆分的了,我们将这种不能够再拆分的子问题,称之
为最小子问题。最小子问题一般都具有直接解,可以直接拿来使用。
大事化小:递归调用
小事化了:递归出口
整体思路:通过每一层的递归调用,将一个大规模的问题,逐层进行拆分,规模越来越小;直到
子问题的规模已经不能再小(再拆分),也就到达了最小子问题(递归出口)。最终我们拿着最
小子问题的直接解,将上层积累的所有大问题逐一进行解开。
具体案例:求取n!
n! = (n-1)! * n
(n-1)! = (n-2)! * (n-1)
(n-2)! = (n-3)! * (n-2)
... ...
3! = (3-1)! * 3 = 2! * 3
2! = 1! * 2
1! = 1(最小子问题)
/**
2 * 求取 n 的阶乘
3 * @param n
4 * @return
5 */
6 public int factorial ( int n ) {
7
8 if ( n == 1 ) {
9 //1! = 1
10 return 1 ; // 递归出口
11 } else {
12 // n>1 的时候: n! = (n-1)! * n
13 return factorial ( n - 1 ) * n ; // 递归调用
14 }
15
16 }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值