浅谈二分法查找和原始算法查找的效率对比

 更新时间:2020年08月18日 09:39:36   作者:after95  
这篇文章主要介绍了浅谈二分法查找和原始算法查找的效率对比,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

我就废话不多说了,大家还是直接看代码吧!

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的RTTI运行时类型识别机制

    举例讲解Java的RTTI运行时类型识别机制

    这篇文章主要介绍了Java的RTTI运行时类型识别机制,包括泛化的Class引用以及类型检查instanceof等知识点,需要的朋友可以参考下
    2016-05-05
  • 分析那些不讲武德的SDK(构造使用规范)

    分析那些不讲武德的SDK(构造使用规范)

    这篇文章主要为大家介绍了盘点分析那些不讲武德的SDK(构造规范)详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • 如何使用Spring integration在Springboot中集成Mqtt详解

    如何使用Spring integration在Springboot中集成Mqtt详解

    MQTT是多个客户端通过一个中央服务器传递信息的多对多协议,能高效地将信息分发给一个或多个订阅者,下面这篇文章主要给大家介绍了关于如何使用Spring integration在Springboot中集成Mqtt的相关资料,需要的朋友可以参考下
    2023-02-02
  • Java实现基础银行ATM系统

    Java实现基础银行ATM系统

    这篇文章主要为大家详细介绍了Java实现基础银行ATM系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • JPA中@CreatedDate和@LastModifiedDate的使用方式

    JPA中@CreatedDate和@LastModifiedDate的使用方式

    这篇文章主要介绍了JPA中@CreatedDate和@LastModifiedDate的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • 基于rocketmq的有序消费模式和并发消费模式的区别说明

    基于rocketmq的有序消费模式和并发消费模式的区别说明

    这篇文章主要介绍了基于rocketmq的有序消费模式和并发消费模式的区别说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • win7 64位系统JDK安装配置环境变量教程

    win7 64位系统JDK安装配置环境变量教程

    这篇文章主要为大家详细介绍了win7 64位系统JDK安装配置环境变量教程,感兴趣的小伙伴们可以参考一下
    2016-06-06
  • MybatisPlus保存、读取MySQL中的json字段失败问题及解决

    MybatisPlus保存、读取MySQL中的json字段失败问题及解决

    这篇文章主要介绍了MybatisPlus保存、读取MySQL中的json字段失败问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • java实现文件变化监控的方法(推荐)

    java实现文件变化监控的方法(推荐)

    下面小编就为大家带来一篇java实现文件变化监控的方法(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-08-08
  • Java多线程中的concurrent简析

    Java多线程中的concurrent简析

    这篇文章主要介绍了Java多线程中的concurrent简析,java.util.concurrent包提供了很多有用的类,方便我们进行并发程序的开发,本文将会挑选其中常用的一些类来进行大概的说明,需要的朋友可以参考下
    2023-09-09

最新评论