我有一个三角形类,带有指向节点 (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 次简单比较。这会更快——还是编译器会让它们相同?
有没有更快的方法?
我知道我可以消除多余的 if。在第一种情况下,它将平均值减少到 3.33 次化合物比较。在第二种情况下,它将平均值拉低至 3.0 简单比较。
我可以删除所有其他代码,因为每个真正的代码块都包含一个返回值。但是,我真的觉得编译器应该足够聪明,可以自行解决任何问题。
最佳答案
任何与自身异或的东西都将为零,因此如果给定三个中的两个,只需执行 n0 ^ n1 ^ n2 ^ a ^ b
即可找到剩余的一个。它非常值得解释性评论,但如果速度很重要,那几乎肯定是您最快的选择。
关于c++ - 找到其他节点的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46497912/