经典!自己找的Java相关资料.doc_第1页
经典!自己找的Java相关资料.doc_第2页
经典!自己找的Java相关资料.doc_第3页
经典!自己找的Java相关资料.doc_第4页
经典!自己找的Java相关资料.doc_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

java的System.currentTimeMillis()和System.nanoTime()有什么区别JDK1.5之后java中的计时给出了更精确的方法:System.nanoTime(),输出的精度是纳秒级别,这个给一些性能测试提供了更准确的参考。但是这个方法有个需要注意的地方,不能用来计算今天是哪一天看到这个方法不由得会想起System.currentTime(),这个方法,它的精度是毫秒,返回值是从1970.1.1的零点开始到当前时间的毫秒数,理论上这个可以用来算当前的时间,而且可以用这个值来构造一个Date对象。但是System.nanoTime()却是不同,代码注释上有这么一句: The value returned represents nanoseconds since some fixed but arbitrary time (perhaps in the future, so values may be negative).这个返回值是一个从确定的值算起的,但是这个值是任意的,可能是一个未来的时间,所以返回值有可能是负数。(我的英语很蹩脚,意思应该能明白吧)所以说这个System.nanoTime()方法只能用来计时,例如:long s = System.nanoTime();.System.out.println(System.nanoTime() - s);二分查找算法java实现今天看了一下JDK里面的二分法是实现,觉得有点小问题。二分法的实现有多种今天就给大家分享两种。一种是递归方式的,一种是非递归方式的。先来看看一些基础的东西。1、算法概念。二分查找算法也称为折半搜索、二分搜索,是一种在有序数组中查找某一特定元素的搜索算法。请注意这种算法是建立在有序数组基础上的。2、算法思想。搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半。3、实现思路。找出位于数组中间的值,并存放在一个变量中(为了下面的说明,变量暂时命名为temp);需要找到的key和temp进行比较;如果key值大于temp,则把数组中间位置作为下一次计算的起点;重复 。如果key值小于temp,则把数组中间位置作为下一次计算的终点;重复 。如果key值等于temp,则返回数组下标,完成查找。4、实现代码。/* * description : 二分查找。 * autor kwzhang * modify :2012-6-29 * * param * param array 需要查找的有序数组 * param from 起始下标 * param to 终止下标 * param key 需要查找的关键字 * return * throws Exception */ public static E extends Comparable int binarySearch(E array, int from, int to, E key) throws Exception if (from 0 | to 0) throw new IllegalArgumentException(params from & length must larger than 0 .); if (from 1) + (to 1); / 右移即除2 E temp = arraymiddle; if (pareTo(key) 0) to = middle - 1; else if (pareTo(key) 0) from = middle + 1; else return middle; return binarySearch(array, from, to, key); 5、测试demo很简单,这里就不写了。上面这种实现是通过递归的方式,各人觉得之类的问题用递归比较好理解,而且过程简单。下面再来看看非递归的方式如何实现。在JDK里面正好有实现,在此就直接贴上Arrays里面的代码。为了简单起见,我们就只看看int参数的方法: private static int binarySearch0(int a, int fromIndex, int toIndex, int key) int low = fromIndex; int high = toIndex - 1; while (low 1; int midVal = amid; if (midVal key) high = mid - 1; else return mid; / key found return -(low + 1); / key not found. 怎样用下面的代码实现下面(1)和(2)。求大家帮我补充完整。(1)在程序中为数组赋值并写入待搜索元素,输出搜索结果;(2)通过键盘为数组赋值并输入待搜索元素,输出搜索结果;public static int binarySearch(int a, int x, int n)int left = 0; int right = n - 1;while (left amiddle) left = middle + 1;else right = middle - 1;return -1; /由小到大排序 public static int sort(int a) for(int i=0;ia.length;i+) for(int j=0;jaj+1) int temp = aj; aj = aj+1; aj+1 = temp; return a; /回答第一题 public static int search1() /程序定义的数组 int b = 2,1,4,8,6,7,0; for(int a:b) System.out.println(a); /排序 b = sort(b); for(int a:b) System.out.println(a); return binarySearch(b,7,b.length); /回答第二题 public static int search2() Scanner sc = new Scanner(System.in); /输入数组个数 System.out.println(请输入数组元素的个数:); int idex = sc.nextInt(); /生成数组 int b = new intidex; /输入元素 System.out.println(请输入元素:); for(int i=0;ib.length;i+) bi = sc.nextInt(); for(int a:b) System.out.println(a); /排序 b = sort(b); for(int a:b) System.out.println(a); /输入要查询的元素 System.out.println(请输入要查询的元素:); int element = sc.nextInt(); return binarySearch(b,element,b.length); 任何项目开发中,在一个集合或数组中循环查找,搜索目标数据,是经常用到的。如果搜索的数据范围比较小,那么不管什么算法,对于今天的计算机来说,性能上基本差别不大,但是如果数据量达到几百万,甚至更大,那么算法的选择和优化就显得比较重要。有空之余测试了下顺序搜索和二分搜索的性能,竟然发现效率差异在1500倍左右。当然,这2种比较的前提是,集合中的数据已经进行了排序处理。下边是测试代码:/* * 搜索算法测试,主要是比较二分搜索和顺序搜索的效率 * author 百里乐 */public class SearchTest /* 被搜索数据的大小*/ private static final int size = 5000000;/* * 启动方法 * param args */ public static void main(String args) long data = new longsize; /添加测试数据 for(int k =0 ;kdata.length;k+) datak = k; / 要查找的数据 long target = 4980002; binaryFindTest(data,target); orderFindTest(data,target); /* * 二分搜索测试 * param data 数据集合 * param target 搜索的数据 */ public static void binaryFindTest(long data, long target) long start = System.nanoTime(); int result = binaryFind(data,target); long end = System.nanoTime(); System.out.println(binary search position: + result); System.out.println(binary search time: + (end-start); /* * 顺序搜索测试 * param data 数据集合 * param target 搜索的数据 */ public static void orderFindTest(long data, long target) long start = System.nanoTime(); int result = orderFind(data,target); long end = System.nanoTime(); System.out.println(order search position: + result); System.out.println(order search time: + (end-start); /* * 二分搜索算法实现 * param data 数据集合 * param target 搜索的数据 * return 返回找到的数据的位置,返回-1表示没有找到。 */ public static int binaryFind(long data, long target) int start = 0; int end = data.length - 1; while (start = datamiddleIndex) start = middleIndex + 1; else end = middleIndex - 1; return -1; /* * 顺序搜索算法实现 * param data 数据集合 * param target 搜索的数据 * return 返回找到的数据的位置,返回-1表示没有找到。 */ p

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论