您的位置:首页 > 编程语言 > Java开发

二分搜索学习笔记 Java实现

2016-09-07 19:38 281 查看
<span style="font-size:18px;">二分搜索算法:
设有一个长度为n的有序表(a0,a1 ... an-1);要求在表中搜索与给定元素x有相同关键字值的元素。
若n=0,显然搜索失败,若n>0,则可将有序表分解成若干个子表,二分搜索:分成两个子表。
现以a[mid]为划分点,mid=(0+(n-1))/2;首先将a[mid]关键字值与指定元素x的关键字值比较
1、当x<a[mid]时,若与x相同关键字值的元素在表中,则必在(a0, ... a[mid-1])中
2、当x=a[mid]时,搜索成功
3、当x>a[mid]时,若与x相同关键字值的元素在表中,则必在(a[mid+1], ... a[n-1])中
以此类推,分割搜索区间,最终确定搜索结果。</span>

package DataStructureAndAlgorithm.BinarySearch;
/**
* 对半搜索递归算法
* @author zhen
*
*/
public class BSearch {
//对半搜索递归算法
public String search(int x,int[] array){
int result=binarySearch(x,array,0,array.length-1);
if(result==-1)
return "No Present!";
return array[result]+" find success!";
}
private int binarySearch(int x,int[] array,int low,int high){
if(low<=high){
int m=(low+high)/2;
if(x<array[m]){
return binarySearch(x, array, low, m);
}
else if(x>array[m]){
return binarySearch(x, array, m, high);
}else return m;
}
return -1;
}
//对半搜索迭代算法
public String bSerach(int x,int[] array){
int mid,low=0,high=array.length-1;
while(low<=high){
mid=(low+high)/2;
if(x>array[mid]){
low=mid+1;
}else if(x<array[mid]){
high=mid-1;
}else
return array[mid]+" find success!";
}
return "No present!";

}
}


递归:

优点:程序简洁清晰,且易于分析。

缺点:费时间、费空间

首先,系统实现递归需要一个系统栈,用于在程序运行时间处理函数调用。系统栈是一块特殊的存储区。

当一个函数调用时,系统创建一个工作记录,称为栈帧(stack frame),并将其置于栈顶。初始时只包

括返回地址和指向上一个帧的指针。当该函数调用另一个函数时,调用函数的局部变量、参数将加到它的

栈帧中。一旦一个函数运行结束,将从栈中删除它的栈帧,程序控制返回原函数继续执行下去。

因此,递归是费空间的,且进出栈也费时。

其次,递归是费时的。除了上诉局部变量、形式参数和返回地址的进出栈,及参数传递消费时间外,重复

计算也是费时的主要原因。eg.计算菲波那切数列,考察fib(4)计算过程(递归树),fib(0)调用2次,fib(1)调用3次,

fib(2)调用2次。 所以许多计算工作重复,费时。

因此为节省时间、空间有其他解决方案,尽量不用递归。


参考:《数据结构——C++语言描述》
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: