繁体   English   中英

从整数集合中获取最大数字的最有效方法

[英]Most efficient way to get the highest number from a collection of integers

问题:从整数集合中获取最大数字的最有效方法

我最近在讨论这个问题,因此我想到了两种解决方案。 1)遍历集合并找到最高编号(下面的代码)2)使用排序算法。

第一种方法将具有O(n)效率

int getHighestNumber(ArrayList<Integer> list)
    {       
        if(list != null && list.size() > 0)
        {
            if(list.size() == 1)
                return list.get(0);

            int maxNum = list.get(0);
            for(int item:list)
            {
                if(item > maxNum)
                    maxNum = item;
            }
            return maxNum;          
        }
        return null;
    }

我的问题是“任何排序算法都可以在任何给定输入上(按时间标度)击败它,例如,是否已经对集合进行了排序?” 还有什么比这更好的方法了吗?

如果Collection已排序,则可以在O(1)找到最大的元素(假设Collection支持对拥有最大元素的Collection的末尾进行随机访问或O(1)访问-如果最大的元素位于第一个,则最大集合会给您O(1)通过其Iterator对其进行访问。 在那种情况下,您不必对它进行排序。

当对输入进行排序时,任何排序都至少会占用O(n)如果未对输入进行排序,则至少会占用O(nlog(n)) ),因为您无法在不检查所有元素的情况下验证输入是否已排序。 因此,排序算法无法击败您的O(n)解决方案。

您的问题暗示了它的答案。 它取决于集合本身的来源。 就是说,您对数据集了解得越多,就可以更快地设计启发式方法来获得所需的答案。

因此,如果您的列表已经排序,则list [0]或list [len-1]将是最高的...

次要答案还取决于“搜索列表的频率?”。 如果这是一次性搜索,则仅迭代最高列表将是最快的。 如果您将重复执行此操作(例如,收集各种指标),则最好使用“快速排序”将其排序。

您的问题是,有两种方法可以找到未排序列表的最大值。

选项1:使用您在问题getHighestNumber提到的方法

选项2:使用世界上最高效的排序算法对列表进行排序,然后获取列表的最后一个值。

因此,就效率而言,最佳选择是什么。

我的回答:选项1,如果未对数组进行排序,则没有排序算法可以胜过选项1。

使用Java 8,您可以使用Stream API查找max ,但这不能解决O(n)问题。 但是,元素访问比普通的迭代器在计算上更便宜。

list.stream().mapToInt(i -> i).max().getAsInt();

这是我最喜欢的论点,我经常使用它来快速判断这样的问题:

您必须至少使用O(N)来查找所有元素,即I / O时间。

不用考虑太多,就可以说服自己,就复杂性而言,没有算法可以胜过任何O(N)算法。 希望有道理。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM