Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 380|回复: 0

[算法学习]Java二分搜索与顺序算法测试

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-11-11 00:03:22 | 显示全部楼层 |阅读模式
    任何项目开发中,在一个集合或数组中循环查找,搜索目标数据,是经常用到的。如果搜索的数据范围比较小,那么不管什么算法,对于今天的计算机来说,性能上基本差别不大,但是如果数据量达到几百万,甚至更大,那么算法的选择和优化就显得比较重要。有空之余测试了下顺序搜索和二分搜索的性能,竟然发现效率差异在1500倍左右。当然,这2种比较的前提是,集合中的数据已经进行了排序处理。 下边是测试代码:  /**
      * 搜索算法测试,主要是比较二分搜索和顺序搜索的效率
      * @author 百里乐
      */
    public class SearchTest
    {
      /** 被搜索数据的大小*/
      private static final int size = 5000000;  /**
       * 启动方法
       * @param args
       */
      public static void main(String[] args)
      {
       long[] data = new long[size];
       
       //添加测试数据
       for(int k =0 ;k<data.length;k++)
       {
        data[k] = 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 <= end)
       {
        int middleIndex = (start + end) / 2;
        if (target == data[middleIndex])
        {
         return middleIndex;
        }
        if (target >= data[middleIndex])
        {
         start = middleIndex + 1;
        }
        else
        {
         end = middleIndex - 1;
        }
       }
       return -1;
      }  /**
       *  顺序搜索算法实现
       * @param data 数据集合
       * @param target 搜索的数据
       * @return 返回找到的数据的位置,返回-1表示没有找到。
       */
      public static int orderFind(long[] data, long target)
      {
       for(int k = 0;k<data.length;k++)
       {
        if(target==data[k])
        {
         return k;
        }
       }
       return -1;
      }
    } 运行测试代码,执行结果如下: inary search position:4980002
    binary search time:19204
    order search position:4980002
    order search time:31723602

       
         
         
          
          

            
          

            
          
         
       

      


    源码下载:http://file.javaxxz.com/2014/11/11/000321812.zip
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-2-25 07:21 , Processed in 0.342008 second(s), 34 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表