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