氣泡排序最多爲O(n),最差爲O(n^2),其內存使用量爲O(1)。合併排序總是O(n log n),但其內存使用量爲O(n)。關於排序的問題
我們將使用哪種算法來實現一個函數,該函數接受一個整數數組並返回集合中的最大整數,假定數組長度小於1000.如果數組長度大於1000,該怎麼辦?
氣泡排序最多爲O(n),最差爲O(n^2),其內存使用量爲O(1)。合併排序總是O(n log n),但其內存使用量爲O(n)。關於排序的問題
我們將使用哪種算法來實現一個函數,該函數接受一個整數數組並返回集合中的最大整數,假定數組長度小於1000.如果數組長度大於1000,該怎麼辦?
對於O(1)內存使用情況,可以在O(n)時間內完成對數據集的連續掃描,尋找最大值。
您只需將當前最大值設置爲第一個元素,然後再遍歷所有其他元素,並將當前最大值設置爲該值(如果該值較大)。僞代碼:
max = list[first_index]
for index = first_index+1 to last_index:
if list[index] > max:
max = list[index]
的複雜也不會因元素的數量列表中的改變,因此也無所謂有多少。
的運行時間但是會改變(因爲算法是O(n)的時間),如果它發現的最大快是很重要的,有許多的可能性。當列表更改時,這些都取決於做工作,而不是每次您需要這些信息時,因此它們更適合於閱讀次數多於書面次數的列表,因此可以攤銷成本。
選項1是保持列表排序,以便您可以抓住最後一個元素。這是可能是矯枉過正只是保持了最大值的記錄。
選項2是在您插入或從列表中刪除時重新計算最大值(以及保存它的元素的數量)。對於空列表,最初將max
設置爲0並將maxcount
設置爲0。
對於插入件:
maxcount
是0(該列表是空的),設置max
該數值和maxcount
爲1max
,設置max
並將maxcount
設置爲1.max
,請將1加到maxcount
。對於缺失:
max
,從maxcount
減去1。maxcount
爲0,重新掃描列表以獲得新的max
和maxcount
。這樣,在任何時候,你有最大的價值(計數只是一個額外的「技巧」,以加快算法,其中有超過一個元素保持最大值)。我之前在數據分析應用程序中使用過這種方法,結果比重新排序要快得多 - 在這種情況下,我必須存儲最小值和最大值,但它們是相同的想法。
簡單的「編程101」方法用於追蹤集合的極值是堆。 – Svante 2010-03-17 18:04:03
除非預分類,否則最大值始終爲O(n)。如果預先分類,則較少。在搜索之前進行排序總是比O(n)更差...因此,一般來說,1,000個元素需要進行1,000次比較......只是比較字面意思。如果使用分類結構,它便宜。如果不是,它很昂貴。用分類結構插入更昂貴。 ...這就是爲什麼這是一個問題。
最大值不需要排序。這是功課嗎?請用[作業]標籤標記家庭作業。 – 2010-03-17 02:24:46
如果這是作業問題,這是一個邪惡的非sequitur。就像那個謎語:「你怎麼拼寫'民間'?你怎麼拼寫'玩笑'?怎麼拼寫'呱呱'?蛋的白色是什麼名字?」。 – 2010-03-17 04:26:52