列出没有For循环的操作

时间:2011-08-24 00:23:13

标签: c# .net linq list

我有一个有以下成员的班级:

  • X
  • ý
  • 宽度
  • 高度

可以使用这些参数创建一个矩形。

现在我的问题是我有一个这个类的列表,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;
        }
    }
}

`

1 个答案:

答案 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字段的示例。