Java Math.abs 与 Math.pow

标签 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));
}

我的问题是哪个更快。由于这是一个数据挖掘应用程序,我希望它能够尽快处理信息。虽然我明白,从本质上讲,可以通过转换实现 2 的幂,但我不确定在像 Java 这样的高级语言中是否会为 JVM 翻译它。一个比另一个更好的原因是什么?

最佳答案

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

其次,考虑更智能的东西,而不是这种低级优化。比如打破你的for(int i = 0; i < (numAttributes - 1); i++)一旦检测到太大的距离就循环。

三、使用Math.pow(a,2)计算 a*a绝对是非常低效的。

四、i < (numAttributes - 1) ?你不是说 i < numAttributes ??

关于Java Math.abs 与 Math.pow,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29957006/

相关文章:

java - 使用 Spring MVC 在模型中添加多个属性会导致性能问题吗?

java - 如何在 Fragment 中使用另一个 XML 文件中的 FloatingActionButton

algorithm - 在什么情况下,较慢的排序算法(冒泡排序、选择排序等)比快速排序等较快的算法更有用?

java - 通过匹配字符串中的日期格式使用 Java 提取日期

java - 如何使用 SIGKILL Process.destroy() 执行 SIGTERM 在 java 中终止 Linux 进程

android - ListView 与线性布局

performance - 为什么 HTTPS 页面请求可能比 HTTP 更快?

java - 反射的哪些部分表现不佳?

java - 从哪里开始编写单元测试

java - 了解 REST API——什么是 Context 和 @Context?