簡體   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