我必须做一个输入整数m的函数,并删除具有最小值的地图的m元素。 我的主要问题是使用O(nlogn)复杂度来做到这一点。 (n是地图的大小)
这是我的解决方案:
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 :(得分:0)
您的解决方案的复杂度为O(n * m),这是次优的。在c++
中,<algorithm>
标题中有一个名为nth_element
的函数,此函数是线性函数,它将集合中最小的n
元素与其他元素分开。该功能是通过修改qsort算法实现的,我相信这就是你需要的。
答案 1 :(得分:0)
你可以在O(n)时间内完成。看看http://en.wikipedia.org/wiki/Selection_algorithm。基本上,您可以找到第m个元素并删除小于或等于第m个元素的所有内容。