浅谈二分法查找和原始算法查找的效率对比
时间:2020-12-02 12:56:40|栏目:JAVA代码|点击: 次
我就废话不多说了,大家还是直接看代码吧!
import java.text.MessageFormat; public class AppTest { static int length = 70000000; static int[] array = new int[length]; static { for (int i = 0; i < length; i++) { array[i] = i; } } public static void main(String[] args) { for (int i = 0; i < 10; i++) { int target = (int) (Math.random() * length * 2); long start_f1 = System.currentTimeMillis(); int index_f1 = findIndex(array, target); long end_f1 = System.currentTimeMillis(); long time_f1 = end_f1 - start_f1; long start_f2 = System.currentTimeMillis(); int index_f2 = findIndexByFor(array, target); long end_f2 = System.currentTimeMillis(); long time_f2 = end_f2 - start_f2; System.out.println(MessageFormat.format("目标数据:{0}\t二分法耗时:{1}\t普通方法耗时:{2}\t二分法结果:{3}\t普通方法结果:{4}", target, time_f1, time_f2, index_f1, index_f2)); } } public static int findIndex(int[] arr, int target) { return findIndex(arr, 0, arr.length, target); } public static int findIndex(int[] arr, int start, int end, int target) { int middle = (start + end) / 2; if (target == arr[middle]) { return middle; } else if (start > end || target < arr[0] || target > arr[arr.length - 1]) { return -1; } else if (target < arr[middle]) { return findIndex(arr, start, middle - 1, target); } else if (target > arr[middle]) { return findIndex(arr, middle + 1, end, target); } return -1; } public static int findIndexByFor(int[] arr, int target) { int index = 0; for (int i : arr) { if (i == target) { return index; } index++; } return -1; } }
查找结果:
总结:
总结过我们可以看出,二分法查找几乎是不耗时,所以方法是很重要的
补充知识:顺序查找与二分查找时间复杂度的比较
注意要点:通过System.currentTimeMills();来获取当前时间,来计算该算法运行运算时间 顺序查找的时间复杂度为O(n)
二分查找的时间复杂度为O(log(n))
但两者的运行时间的结果却千差万别,可知当计算量很大的情况下算法优化的必要性。
import java.util.Arrays; public class Main { public static int a[] = new int[10000*10000]; public static void main(String[] args) { for(int i = 0; i < 10000* 10000; i ++) { a[i] = i + 1; } int target = 10000 * 10000; //计算顺序查找所用时间 long start = System.currentTimeMillis(); find(target); long end = System.currentTimeMillis(); System.out.println(end - start + "ms"); //计算二分查找所用时间 start = System.currentTimeMillis(); Arrays.binarySearch(a, target); end = System.currentTimeMillis(); System.out.println(end - start + "ms"); } private static void find(int target) { for(int i = 0; i < 10000 * 10000; i ++) { if(a[i] == target) { return; } } } }
运行结果:
55ms
0ms
上一篇:java多线程之CyclicBarrier的使用方法
栏 目:JAVA代码
本文标题:浅谈二分法查找和原始算法查找的效率对比
本文地址:http://www.codeinn.net/misctech/28655.html
阅读排行
- 1Java Swing组件BoxLayout布局用法示例
- 2java中-jar 与nohup的对比
- 3Java邮件发送程序(可以同时发给多个地址、可以带附件)
- 4Caused by: java.lang.ClassNotFoundException: org.objectweb.asm.Type异常
- 5Java中自定义异常详解及实例代码
- 6深入理解Java中的克隆
- 7java读取excel文件的两种方法
- 8解析SpringSecurity+JWT认证流程实现
- 9spring boot里增加表单验证hibernate-validator并在freemarker模板里显示错误信息(推荐)
- 10深入解析java虚拟机