找到其他节点的最快方法

Fastest way to find other node

本文关键字:方法 节点 其他      更新时间:2023-10-16

我有一个三角形类,带有指向节点的指针(n0,n1,n2)。我还有一种方法,可以通过两个节点指针(a,b)返回"其他"节点。当前的实现是:

if ( n0 == a && n1 == b )
{
    return n2;
}
else if ( n0 == b && n1 == a )
{
    return n2;
}
else if ( n1 == a && n2 == b )
{
    return n0;
}
else if ( n1 == b && n2 == a )
{
    return n0;
}
else if ( n0 == a && n2 == b )
{
    return n1;
}
else if ( n0 == b && n2 == a )
{
    return n1;
}
else
{
    assert( 0 );
}
return NULL;

有效,但可能不是最好的。分析后,我的程序实际上在此例程中花费了可衡量的时间,因此值得一花一定时间来优化。但是,我对编译器的优化不太熟悉,因此我不确定这是否是多余的。

节点没有特定顺序,因此平均必须执行3.5个化合物比较。

另一种方法是:

if ( n0 == a )
{
    if ( n1 == b )
    {
        return n2;
    }
    else if ( n2 == b )
    {
        return n1;
    }
    return NULL;
}
else if ( n1 == a )
{
    if ( n0 == b )
    {
        return n2;
    }
    else if ( n2 == b )
    {
        return n0;
    }
    return NULL;
}
else if ( n2 == a ) // Theoretically redundant.  Kept for safety.
{
    if ( n0 == b )
    {
        return n1;
    }
    else if ( n1 == b )
    {
        return n0;
    }
    return NULL;
}
return NULL;

平均比较简单比较的3.5。这会更快吗?还是编译器使它们相同?

有更快的方法吗?

我知道我可以消除冗余。在第一种情况下,它将平均值降低到3.33化合物比较。在第二种情况下,它将平均值降低到3.0简单比较。

我可以消除所有其他代码,因为代码的每个真实块都包含返回。但是,我真的觉得编译器应该足够聪明,可以照顾自己的任何收获。

与自身固定的任何东西都将为零,因此,如果您给出了三个中的两个,则只需使用n0 ^ n1 ^ n2 ^ a ^ b即可找到其余的一个。值得解释的评论,但是如果速度很重要,那几乎可以肯定是您最快的选择。