Binary Search in Java
关于折半查找中的几个注意点.
Version 1:
public static <T extends Comparable<? super T>> int binSearch(T[] arr,
T element) {
int length = arr.length;
int middle = length / 2;
int index;
if (length == 0) {
return -1;
}
if (arr[middle].compareTo(element) == 0) {
index = middle;
} else if (arr[middle].compareTo(element) < 0) {
index = middle
+ 1
+ binSearch(Arrays.copyOfRange(arr, middle + 1, length),
element);
} else {
index = binSearch(Arrays.copyOfRange(arr, 0, middle), element);
}
return index;
}
要保证接口为binSearch(array, target),所以此处使用了Arrays.copyOfRange()--导致造成了额外的空间消耗(创建新的数组)。
Version 2:
// 注意这种切换接口的方式
public static <T extends Comparable<? super T>> int binSearch_JDK(T[] arr,
T element) {
//With Recursion
return binSearch_JDK(arr, 0, arr.length - 1, element);
} // With Recursion
public static <T extends Comparable<? super T>> int binSearch_JDK(T[] arr, int start, int end, T element) {
if(start > end){
return -1;
}
int middle = (start + end) / 2;
if(arr[middle].compareTo(element) == 0){
return middle;
}else if(arr[middle].compareTo(element) < 0){
return binSearch_JDK(arr, middle + 1, end, element);
}else{
return binSearch_JDK(arr, 0, middle - 1, element);
}
}
保证了接口原型不变,而且没有额外的空间消耗(创建新的数组)。注意这种切换接口的方式。
Version 3:
// 注意这种切换接口的方式
public static <T extends Comparable<? super T>> int binSearch_JDK(T[] arr,
T element) {
//Without Recursion
return binarySearch(arr, 0, arr.length - 1, element);
} // JDK SOURCE CODE jdk没有使用泛型,而是直接使用了long
// 能不用递归就不要用
public static <T extends Comparable<? super T>> int binarySearch(T[] arr, int start, int end, T element) {
int middle = start;
while(start <= end){
//middle = (start + end) / 2;
middle = (start + end) >>> 1;
if(arr[middle].compareTo(element) == 0){
return middle;
}else if(arr[middle].compareTo(element) < 0){
start = middle + 1;
}else{
end = middle - 1;
}
}
return -1;
}
这种方法相对于前2种方法要好很多:接口原型不变,而且没有额外的空间消耗(创建新的数组)并且没有使用递归。
Binary Search in Java的更多相关文章
- 数据结构之Binary Search Tree (Java)
二叉查找树简介 二叉查找树(Binary Search Tree), 也成二叉搜索树.有序二叉树(ordered binary tree).排序二叉树(sorted binary tree), 是指一 ...
- leetcode 99 Recover Binary Search Tree ----- java
Two elements of a binary search tree (BST) are swapped by mistake. Recover the tree without changing ...
- leetcode 98 Validate Binary Search Tree ----- java
Given a binary tree, determine if it is a valid binary search tree (BST). Assume a BST is defined as ...
- leetcode 96 Unique Binary Search Trees ----- java
Given n, how many structurally unique BST's (binary search trees) that store values 1...n? For examp ...
- LeetCode算法题-Binary Search(Java实现)
这是悦乐书的第297次更新,第316篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第165题(顺位题号是704).给定n个元素的排序(按升序)整数数组nums和目标值,编 ...
- leetcode 109 Convert Sorted List to Binary Search Tree ----- java
Given a singly linked list where elements are sorted in ascending order, convert it to a height bala ...
- leetcode 108 Convert Sorted Array to Binary Search Tree ----- java
Given an array where elements are sorted in ascending order, convert it to a height balanced BST. 给一 ...
- 二分查找(binary search)java实现及时间复杂度
概述 在一个已排序的数组seq中,使用二分查找v,假如这个数组的范围是[low...high],我们要的v就在这个范围里.查找的方法是拿low到high的正中间的值,我们假设是m,来跟v相比,如果m& ...
- Convert Sorted List to Binary Search Tree java
public TreeNode sortedListToBST(ListNode head) { if(head==null) return new TreeNode(0); ArrayList< ...
随机推荐
- Any、AnyObject、as
Swift中添加了两种类型别名 Any:可表示随意类型,(Int.Double等值类型). AnyObject:可表示随意class类型实例, 一个不论什么对象类型的数组 Any类型: class C ...
- MVC | 微软自带的Ajax请求
@Ajax.BegForm( ) 用来生成异步表单 Home控制器 using System; using System.Collections.Generic; using System.Linq ...
- 微信小程序新建项目完整流程
最近刚好也在做新的小程序项目,所以有机会给大家整理一个完整的开发流程! 上一篇介绍是如何获得appid,那么接下来就是怎么新建一个全新的小程序项目了 首先:下载最新版的微信开发者工具,支持网页版微信开 ...
- shell脚本中处理 路径中中文和空格方法
OLDIFS=$IFS IFS=$'\n' #存放路径的变量在引用时都使用双引号括起来 "$VAR_PATH" #路径拼接时后续的旧不需要加双引号了"$VAR_PATH& ...
- linu保持远程会话
django的server启动后,若关闭ssh会就会自动切断进程,结汇对话 命令scree会保持这个会话,在关闭ssh后,仍然能访问 shell下 1screen 进入后 2启动server 关闭ss ...
- 【Mac + Appium学习(一)】之安装Appium环境前提准备
环境: Appium version :1.9.1 Appium-desktop:1.7.1 Xcode:10.0 IOS:iPhone5S(10.3.3) Android:6.0.1 Mac:10. ...
- 2017 css新特性
2017年要学习的三个CSS新特性 这是翻译的一篇文章,原文是:3 New CSS Features to Learn in 2017,翻译的不是很好,如有疑问欢迎指出. 新的一年,我们有一系列新的东 ...
- asp.net c#采集需要登录页面的实现原理及代码
当我们采集页面的时候,如果被采集的网站需要登录才能采集,原理搞清楚了,就好办了,我们所要做的仅仅是在采集的时候(或者说HttpWebRequest提交数据的时候),将Cookie信息放入Http请求头 ...
- SlidingMenu官方实例分析6——ResponsiveUIActivity
ResponsiveUIActivity 这个类实现的是一个响应适UI设计重点是布局的设计: layout布局如下: layout-large-land布局如下: layout-xlarge布局如下: ...
- Python+selenium打开或关闭浏览器
Python+selenium打开或关闭浏览器 一.打开或关闭火狐浏览器 1. 初始化一个webdriver实例对象driver,然后打开和关闭firefox浏览器.要用selenium打 ...