Java Math.abs与Math.pow

时间:2015-04-30 00:34:07

标签: java performance

所以这是一个奇怪的问题。我正在处理一个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的情况。一个人比另一个人好吗?

1 个答案:

答案 0 :(得分:5)

首先,考虑向量A=[0,0,0]B=[1,1,1]C=[0,0,2]。哪一个更接近A?是B还是C?实际上,关心距离测量在kNN中绝对至关重要。我们只谈论曼哈顿和欧几里德的距离。例如,您也可以使用余弦相似度,并且应该仔细选择距离度量,并考虑您对数据的了解。

其次,不要考虑这种低级别的优化,而应考虑更聪明的事情。例如,一旦检测到太大的距离就打破for(int i = 0; i < (numAttributes - 1); i++)循环。

第三,使用Math.pow(a,2)来计算a*a肯定是非常低效的。

第四,i < (numAttributes - 1)?你的意思是i < numAttributes ??