[英]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.