2013-04-18 31 views
0

我必須做一個函數,輸入一個整數m,並刪除最小值的map的m元素。 我的主要問題是O(nlogn)的複雜性。 (n是地圖的大小)ListMap:刪除最小值的m個最小元素

這是我的解決方案:

if (Map.isEmpty()) 
    return; 
if (Map.size()<m){ //remove all keys 
     Iterator<K> it=Map.keys().iterator(); //collection of all keys 
     while (it.hasNext()) 
      Map.remove(it.next()); 
} 
else{ 
for (int i=0; i<m; i++){ 
    key=Map.findKeyMin() //complexity:O(n) 
    Map.remove(K); 
} 
+0

這是功課嗎? – Carlo

+0

不,我這樣做,我想要改進我的實現,特別是complessity,並知道是否有辦法在O(nlogn)中執行此操作。 – Ewybe

+0

@Ewybe請包括您嘗試過的相關信息。我可以提供更好的解決方案,但需要證據你付出一些努力 –

回答

0

您的解決方案具有複雜度爲O(N * M),這是最理想的。在c++<algorithm>標題中有一個函數,名爲nth_element該函數是線性的,將會將集合中的最小元素與其他元素分開。該函數是通過修改qsort算法實現的,我相信這是您在這裏需要的。

+0

如果我在我的地圖上做了一個快速排序,然後我刪除了第一個m元素? – Ewybe

+0

quicksort的複雜性是O(n * log(n)),而我建議的是O(n)。 –