Во-первых, ваш алгоритм неверен, потому что при удалении с помощью vec.remove(i);
элемент i+1
становится элементом i
, поэтому вы пропускаете один элемент.
Проблема с производительностью связана с тем, что в худшем случае каждый снимает стоимость O(n)
, поскольку каждый последующий элемент необходимо сместить влево. попробуйте это:
public void checkBoundary(int width, int height) //width and height of the applet
{
LinkedList<T> outofbounds = new LinkedList<T>();
for(int i = 0; i < vec.size(); i++)
{
if(vec.get(i).x + vec.get(i).width <= 0 ||
vec.get(i).y + vec.get(i).height <= 0 ||
vec.get(i).x >= width ||
vec.get(i).y >= height)
outofbounds.add(vec.at(i));
}
vec.removeAll(outofbounds);
}
Редактировать:
Как указано Ледяной паук , removeAll
стоит дорого. Он имеет сложность O(outofbounds.size()*vec.size())
, что составляет O(n^2)
. При небольшом изменении логики вы можете получить алгоритм, который гарантированно будет работать в O(vec.size())
.
public void checkBoundary(int width, int height) //width and height of the applet
{
LinkedList<T> newvec = new LinkedList<T>();
for(int i = 0; i < vec.size(); i++)
{
if(vec.get(i).x + vec.get(i).width <= 0 ||
vec.get(i).y + vec.get(i).height <= 0 ||
vec.get(i).x >= width ||
vec.get(i).y >= height)
continue;
newvec.add(vec.at(i));
}
vec.clear();
// or vec = newvec if there are no others reference sharing the same object as vec
vec.addAll(newvec);
}