这里有一个奇怪的问题。我正在解决一个kNN问题,需要找到最近的邻居。我在研究距离,但我只关心哪一个最接近,而不关心实际距离。但是,由于距离不能为负数,我需要将距离平方或取绝对值。
因此,有两种方法可以实现这一点:
//note: it's been abstracted for multiple dimensions (not just x and y)
for(int i = 0; i < (numAttributes - 1); i++)
{
distance += Math.pow((a.value(i) - b.value(i)), 2);
}
并且
//note: it's been abstracted for multiple dimensions (not just x and y)
for(int i = 0; i < (numAttributes - 1); i++)
{
distance += Math.abs(a.value(i) - b.value(i));
}
我的问题是哪个更快。由于这是一个数据挖掘应用程序,我希望它能尽可能快地处理信息。虽然我知道,在底层实现中,二的幂可以通过移位来实现,但我不确定在像Java这样的高级语言中是否也是如此,因为它要被转换成JVM。是否有一种方法比另一种更好?
Math.abs(d)
比Math.pow(d, 2)
快得多。为什么?因为abs
应该映射到单个按位与操作以清除符号位,而pow(, 2)
最好情况下映射到乘法,最坏情况下映射到对pow
的实际函数调用。