2016-09-13 41 views
2

設S是存儲在數組中的一組n個整數(不一定排序)。設計一個算法來查找S中的10個最大整數(通過創建一個單獨的長度爲10的數組來存儲這些整數)。您的算法必須在O(n)時間內完成。在O(n)時間中發現陣列中的10個最大整數時間

我想我也許可以通過使用計數排序,然後將最後10個元素添加到新數組來回答這個問題。但顯然這是錯誤的。有誰知道更好的方法?

+0

在新陣列中添加前10個數字。然後只掃描剩餘的元素並不斷更新新的數組。 –

+0

要容易,謝謝! – 101ldaniels

+0

等待我不確定這項工作? – 101ldaniels

回答

5

方法1: 你可以使用FindMax()算法,找到最大數量O(N),如果你使用它10時間:

10 * O(N) =O(N) 

每次找到最大NUM時候你把它放在新的數組,你會在下一次忽略它使用FindMax();

方法2:

你CA氮利用泡沫10倍:

1) Modify Bubble Sort to run the outer loop at most 10 times. 
2) Save the last 10 elements of the array obtained in step 1 to the new array. 

10 * O(N) =O(N) 

方法3:

您可以使用MAX Heap

1) Build a Max Heap in O(n) 
2) Use Extract Max 10 times to get 10 maximum elements from the Max Heap 10 
* O(logn) 

O(N) + 10 * O(logN) = O(N) 
0

使用order statistic算法找出第十大元素。 接下來,迭代數組以找到所有小於/等於它的元素。

TimeComplexity:爲O(n),用於順序統計+ O(n)的用於重複陣列一次=>爲O(n)

+1

在這種情況下最差的情況幾乎是O(N^2) –

+1

@OneManCrew在最壞的情況下是O(n)。 http://www.cse.ust.hk/~dekai/271/notes/L05/L05.pdf –

-1

將它們插入平衡二叉樹。 O(N)+ O(1g2N)。

相關問題