浅谈二分法查找和原始算法查找的效率对比
我就废话不多说了,大家还是直接看代码吧!
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
以上这篇浅谈二分法查找和原始算法查找的效率对比就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
idea pom导入net.sf.json的jar包失败的解决方案
JSON(JavaScript Object Notation,JS对象简谱)是一种轻量级的数据交换格式,这篇文章主要介绍了idea pom导入net.sf.json的jar包失败的解决方案,感兴趣的朋友一起看看吧2023-11-11Java8新特性之StampedLock_动力节点Java学院整理
本文从synchronized、Lock到Java8新增的StampedLock进行对比分析,对Java8新特性之StampedLock相关知识感兴趣的朋友一起看看吧2017-06-06SpringBoot2学习之springboot与spring区别分析
这篇文章主要为大家介绍了SpringBoot2学习之springboot与spring区别分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2022-05-05详解mybatis-plus实体类中字段和数据库中字段名不对应解决办法
这篇文章主要介绍了详解mybatis-plus实体类中字段和数据库中字段名不对应解决办法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2021-03-03Spring Cloud Feign 自定义配置(重试、拦截与错误码处理) 代码实践
这篇文章主要介绍了Spring Cloud Feign 自定义配置(重试、拦截与错误码处理) 实践,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2020-08-08
最新评论