2015-12-29 84 views

回答

1

一次掃描應該更快,因爲您可以只保留兩個分隔符變量最小和次小。您將在平均值上使用,每次迭代少於兩次比較(與使用正好2倍數量的單循環比較的2次獨立循環相比)。

在某種僞

smallest = Inf 
2ndSmallest = Inf 
for elem in array 
    if elem < smallest 
     2ndSmallest = smallest 
     smallest = elem 
    else if elem < 2ndSmallest 
     2ndSmallest = elem 
    end 
end 

凡這是假定你進入上面的,如果完全在至少兩次(你可以輕鬆地添加一個修補程序的情況下,這可能並非如此)條款。然而,討論是更喜歡的,所以我會留下寫下實際的比較實施作爲練習。

+1

你的算法是錯誤的。 – elias

+1

@Elias請給我一些更詳細的反饋,我可以糾正這一點,以及自己學習一些東西。 – dfri

+0

現在,您的版本後,幾乎是正確的。如果數組爲[[1,1,2]],則「最小」和「2ndSmallest」將爲「1」。 – elias

0

經驗法則:避免多次循環

拇指的第二個規則:避免過早優化(可讀性和可維護性第一)

這就是說,高效的算法

(請注意,你需要的僞代碼以處理列表大小爲空或一個的情況):

smallest = min(list[0],list[1]) 
second_smallest = max(list[0],list[1]) 
for el in list[2:]: 
    if el < second_smallest: 
     second_smallest = max(el,smallest) 
     smallest = min(el,smallest) 
+0

是不是避免多個循環過早優化的一個實例?我在計算機體系結構中閱讀了它。他們說,如果迭代多次,你就會失去緩存。在進一步推進之前,關注一塊陣列並儘可能多地做好工作。但是利用系統緩存是一個過早的優化,因此是不好的。 –

+0

是的,但多個循環也會影響可讀性。所以,重點是首先關注可讀性和可維護性。那麼,如果你正在尋求優化,一般的經驗法則是循環是昂貴的,然後...不是。 – Harrichael