二分搜索学习笔记 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++语言描述》
相关文章推荐
- Java IO 实现文件复制 -Java 学习笔记 (25)
- 关于java打印功能的最简单实现的学习笔记
- 一步一步学习java数组学习(二分搜索)
- Java与Flex学习笔记(9)----用ExternalInterface实现Flex与外部容器交互
- Java学习笔记之 swing 基本实现QQ截屏功能
- 链栈实现算法 - Java 学习笔记(26)
- Java基础学习笔记(七)Set接口及其实现子类
- Java学习笔记——文本操作(记事本实现)
- Java容器学习笔记(二) Set接口及其实现类的相关知识总结
- 学习java笔记 --- 一个实现Iterable<E>接口的小范例
- Java 死锁的实现 -Java学习笔记(28)
- 设计模式学习笔记以及java代码实现
- 用JS实现移动的窗口 - 流星絮语 JAVA学习笔记 - CSDNBlog
- Java学习笔记——文本操作(记事本实现)
- Java 学习笔记 (3) -抽象类 abstract 接口 interface 内部类 inner class 继承 extends 实现 implements 包 package
- Java 线程同步问题 生产者-消费者 算法实现 -Java学习笔记(29)
- {传智播客} (学习笔记)--Java调用存储过程实现Oracle数据库分页
- java学习笔记:【从网络获取图像资源】实现
- 基于JAVA的水泥三维图像特征提取系统设计与实现 之一 JAVA 3D学习笔记
- Java学习笔记——文本操作(记事本实现)