我有一个有以下成员的班级:
可以使用这些参数创建一个矩形。
现在我的问题是我有一个这个类的列表,List<MyClass>
。
我需要将列表中的每个对象与所有剩余对象进行比较,如果currentObject.Location(X, Y)
落在另一个对象的rectangle(X, Y, Width, Height)
中,我需要删除其他对象清单。
我用for循环实现了它。
但主要问题是:表现。 我的最小名单数量为300000。
是否有任何程序可以改善此任务的性能,包括LINQ在内的任何.Net版本?
`public class RectBase { private int _rectId; 私有PointF _rectLocation; private SizeF _rectSize;
public RectBase()
{
_rectId = -911;
_rectLocation = new PointF(0, 0);
_rectSize = new SizeF(0, 0);
}
public RectBase(int id, PointF loc, SizeF size)
{
_rectId = id;
_rectLocation = loc;
_rectSize = size;
}
public bool IsIntersected(RectBase otherRectObject)
{
RectangleF currentRect = new RectangleF(_rectLocation, _rectSize);
if (currentRect.Contains(otherRectObject.RectLocation))
return true;
else
return false;
}
public int RectId
{
get { return _rectId; }
set { _rectId = value; }
}
public PointF RectLocation
{
get { return _rectLocation; }
set { _rectLocation = value; }
}
public SizeF RectSize
{
get { return _rectSize; }
set { _rectSize = value; }
}
}
public class RectProcessor
{
List<RectBase> _rectList;
int maxCount = 300000;
public RectProcessor()
{
_rectList = new List<RectBase>();
FillList();
}
private void FillList()
{
// Adding the items to the list with dummy values
for (int i = 0; i < maxCount; i++)
{
int id = i+1;
PointF loc = new PointF(id, id);
SizeF sz = new SizeF(id, id);
RectBase obj = new RectBase(id, loc, sz);
_rectList.Add(obj);
}
}
private void RemoveIntersectedObjects()
{
List<RectBase> filteredList = new List<RectBase>();
bool isIntersected = false;
for (int i = 0; i < maxCount; i++)
{
for (int j = 0; j < maxCount; j++)
{
if (_rectList[i].IsIntersected(_rectList[j]))
{
isIntersected = true;
break;
}
}
if (!isIntersected)
{
filteredList.Add(_rectList[i]);
}
isIntersected = false;
}
}
}
`
答案 0 :(得分:2)
问题不在于消除for
循环,至少在你想到它的方式。在LINQ中重写它只是隐藏for
循环,但它们仍将存在。这是根本问题。你写的算法是O(n^2)
,这就是为什么当你从20,000个元素到300,000个元素时,你会看到一个荒谬的爆炸。你在第一种情况下进行了400,000,000次比较,在第二种情况下进行了90,000,000,000次比较,它将继续像O(n^2)
那样增长。
所以,你真正想问的问题是:对于这个问题,是否存在时间复杂度优于O(n^2)
的算法?
此问题是computational geometry字段的示例。