zoukankan      html  css  js  c++  java
  • 提高你的Java代码质量吧:多种最值算法,适时选择

    一、分析 

    对一批数据进行排序,然后找出其中的最大值或最小值,这是基本的数据结构的知识。在Java中我们可以通过编写算法的方式,也可以通过数组先排序再取值的方式来实现。 

    二、场景 

    1.自行实现,快速查找最大值,代码如下: 

     

    public static int max(int[] data){ 
        int max = data[0]; 
        for(int i :data){ 
            max = max > i ? max : i; 
        } 
        return max; 
    } 

    这是我们经常使用的最大值算法,也是速度最快的算法。它不要求排序,只要遍历一遍数组即可找出最大值 

    2.先排序,后取值,代码如下: 

     

    public static void main(int[] data){ 
        //先排序 
        Arrays.sort(data.clone()); 
        //然后取值 
        return data[data.length - 1]]; 
    } 

    代码中使用data.clone拷贝在排序,因为数组也是对象,不拷贝不久改变了原有数组的顺序!除非数组元素的顺序无关紧要 

    从效率上讲,当然是自己写快速查找更快一些了,只用遍历一遍就可以计算出最大值 

    但在实际测试中我们发现,如果数组数量少于1万,两者基本上没有差别,在同一个毫秒级别里,此时就可以不同自己写算法,直接使用数组先排序后取值的方式。如果数组元素超过1万,就需要根据实际情况来考虑:自己实现,可以提升性能;先排序后取值,简单,通俗易懂。 

    3.如果查找仅次于最大值的元素,代码如下: 

     

    public static int getSecond(Integer[] data){ 
        //转换为列表 
        List<Integer> dataList = Arrays.asList(data); 
        //转换为TreeSet,删除重复元素并升序排列 
        TreeSet<Integer> ts = new TreeSet<Integer>(dataList); 
        //取得比最大值小的最大值 
        return ts.lower(ts.last()); 
    } 

    注意,数组元素时可以重复的,最大值可能是多个,所以单单一个排序后取倒数第二个元素时解决不了问题的。此时,需要一个特殊的排序算法,先要剔除重复数据,然后在排序。当然,自己写算法也可以实现,但是ThreeSet能剔除重复元素,还能自动排序,然后再使用lower方法寻找小于最大值的值。 

    三、建议

    最值计算时使用集合最简单,使用数组性能最优

  • 相关阅读:
    《ASP.NET Core跨平台开发从入门到实战》Web API自定义格式化protobuf
    .NET Core中文分词组件jieba.NET Core
    .NET Core 2.0及.NET Standard 2.0
    Visual Studio 2017 通过SSH 调试Linux 上.NET Core
    Visual Studio 2017 ASP.NET Core开发
    Visual Studio 2017正式版离线安装及介绍
    在.NET Core 上运行的 WordPress
    IT人员如何开好站立会议
    puppeteer(二)操作实例——新Web自动化工具更轻巧更简单
    puppeteer(一)环境搭建——新Web自动化工具(同selenium)
  • 原文地址:https://www.cnblogs.com/bbsno1/p/3257959.html
Copyright © 2011-2022 走看看