我被要求改进给定的一段代码。代码的想法是获取对象列表,并通过两个foreach循环检查它们是否冲突。用伪代码编写的代码:

foreach (Entity object in objectList)
    foreach (Entity object2 in objectList)
        if (object.collideWith(object2))
            Collision(object,object2)


对于每个对象,它在每个对象上循环-效率不高。相反,我应该将其更改为“对于每个对象,遍历每个后续对象”。我对C#来说还很陌生,但这是我用伪图片描述解决方案的方式:

foreach (Entity object in objectList)
    if (object.collideWith(subsequent object))
        Collision(object, subsequent object)


这样,我只检查一个对象是否与另一个对象碰撞一次。但是,如何在列表中获取“后续对象”?

最佳答案

您可以使用for循环而不是foreach循环,如下消除笛卡尔乘积的“下半部分”(假设碰撞关系是对称的)来改进代码。

for ( int i = 0; i < objectList.Count(); i++ )
{
    var iObj = objectList[i];
    for ( int j = i ; j < objectList.Count(); j++ )
    {
        var jObj = objectList[j];
        if ( iObj.collideWith(jObj) )
        {
            Collision( iObj, jObj );
        }
    }
}


这样可以将numbe rof冲突检查大约减少2倍。但是,运行时复杂度是相同的,并且该方法很难用Linq实现。

关于c# - 获取列表C#中的后续元素,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42905015/

10-14 14:51
查看更多