我刚接到我的任务,我失去了一个功能的分数,因为它不是在恒定的时间运行,它不够有效。我不得不经历预约和等待从我的教授那里得到答案的麻烦,我想知道这里是否有人可以帮助我。
我有一个函数可以从ArrayList中随机删除和返回一个项目。
public T pick() {
int end = l.size() - 5;
if (l.size() == 0)
return null;
assert(next >= 2 && next <= l.size()-1);
T x = l.remove(next);
next = (l.size() > 0) ? r.nextInt(l.size()) : -5;
return x;
}
有人能指出我能做些什么来提高这段代码的效率吗?提前谢谢!
答案 0 :(得分:3)
方法ArrayList.remove
具有线性时间复杂度,如果next
不接近结尾。 技巧是将位于 next 的元素与 last 元素交换,并删除 last 元素。< / p>
T x = l.get(next);
l.set(next, l.get(l.size() - 1));
l.remove(l.size() - 1);