爲什麼選擇算法失敗:
注意,使用選擇算法是在#elements線性。假設#requests在#elements中是線性的 - 它將導致一個二次方解決方案,這就是爲什麼你超過了時間限制。
的另一種方法: 保持兩個堆:一個最大堆H1
和最小堆H2
最大堆(H1
)將保持2/3最低號碼而最小堆將金1/3個最高的數字。
現在,你看每個元素x
,檢查是否需要增加頂部1/3堆(H2
),如果你這樣做:你需要添加max{x,H1.max()}
。如果您添加了H1.max()
- 您需要將其從堆中刪除,並插入x
。如果不需要添加,請檢查x
是否大於H2.min()
,如果是,請刪除最小格式H2
,將其插入到H1
,並將x
添加到H1
。
注意:您正在尋找這種解決方案的數量可以在O(1)
在任何時候發現的,它是最小堆(H2
)的最小值。
總的複雜性,如果這個解決方案是O(nlogn + k)
- 在n
是號碼的數量,並且k
是「講數」的請求的總數。
注意:一個簡單的解決方案(雖然可能較慢)將保持排序的列表(在BST或例如skiplist),並使用二進制搜索來查找相關的元素。
實施例:
init:
H1 = {}
H2 = {}
input1:
H1 = {1}
H2 = {}
input7:
H1={1,7}
H2 = {}
input 9: //need to add a max, in this case: x > H2.max() -> add x to H2.
H1 = {1,7}
H2 = {9}
tell the number
H2.min() = 9
input 21: // 21>9 -> remove H2.min() add it to H1, add x to H2
H1 = {1,7,9}
H2 = {21}
input 8:
H1 = {1,7,8,9}
H2 = {21}
input 5: //remove max from H1, add max to H2, add x to H1
H1 = {1,7,5,8}
H2 = {9,21}
tell the number
H2.min() = 9
input 11: //remove min from H2, add it to H1, add x to H2.
H1 = {1,7,5,8,9}
H2 = {11,21}
tell the number
H2.min() = 11
作業?問題是什麼 ? – 2012-07-09 11:57:48
問題是不適當的。在第三次請求時,一個集合包含7個數字,因此第三個部分的含義不明確。七個有序的項目可以分成三個儘可能相同的部分,如3 + 2 + 2或2 + 3 + 2或2 + 2 + 3,從而給出'前1/3'或'21 11 9'或'2111',產生答案'9'或'11'。任務描述並沒有定義爲什麼它應該是11而不是9. – CiaPan 2015-12-01 09:15:39