java - 随机搜索到 lambda 表达式
问题描述
感谢您的所有帮助和分享。
我的问题是关于随机搜索。该技术用于通过定义数量的 cicles 对数据进行近似计算,通常是数学计算。请参阅以下代码,我试图将其减少到最低限度。我的期望是将此代码设置为 lambda 表达式,即 for 循环,我希望它具有最佳性能。我有一些意图,但我不确定我是否充分利用了它。
package stochasticsearch;
import java.util.Random;
public class StochasticSearch {
public static double f(double x) {
return -(x - 1) * (x - 1) + 2;
}
public static void main(String[] args) {
final Random random = new Random();
double startPointX = 0;
double max = f(startPointX);
long begin = System.currentTimeMillis();
for (int i = 0; i < 1000000000; i++) {
double index = 2 * random.nextDouble();
if (f(index) > max) {
max = f(index);
}
}
System.out.println("Elapsed time: " + (System.currentTimeMillis() - begin));
System.out.println("Maximum value y=f(x) is " + max);
}
}
谢谢,祝你有美好的一天。
解决方案
在我的系统上,您的代码在不到 23 秒的时间内完成,我能够对其进行修改,使其在 2 秒内完成。这是我发现的:
Random
当您可以使用时,您正在使用ThreadLocalRandom
;此切换导致相对较大的加速。- 在某些情况下,您在 for 循环中计算
f(index)
两次,而每次迭代只计算一次。 - 因为您正在迭代大范围的值,所以您可以改用并行流;这也会导致相对较大的加速。
您要添加
2
到 中的每个结果f
,因此最好在计算后一次添加max
。public static double f(double x) { double y = x - 1; return -y * y; } public static void main(String[] args) { final ThreadLocalRandom random = ThreadLocalRandom.current(); long begin = System.currentTimeMillis(); double max = IntStream.range(0, 1_000_000_000) .parallel() .mapToDouble(i -> f(random.nextDouble() * 2)) .max() .orElse(f(0)) + 2; System.out.println("Elapsed time: " + (System.currentTimeMillis() - begin)); System.out.println("Maximum value y=f(x) is " + max); }
推荐阅读
- node.js - Docker 多容器应用程序:React、Nginx 和反向代理的问题(无效的 URL 前缀)
- html - 响应式 Flexbox 在 Tailwind css 中无法正常工作
- php - 如何使用带有编码的 http_build_query?
- bash - 如何在使用 bash 保留文件名的其余部分的同时将数字的第一个实例归零
- flutter - 在 Flutter 列中居中文本
- python - 使用熊猫取某些列的平均值
- html - 为什么 align-items 在我的 CSS 文件的正文部分不起作用?
- vba - 在 VBA 中使用 Vlookup 应用程序循环导致 Excel 无响应
- z3 - 较新版本的 Z3 不再保留/打印所有函数实例
- eloquent - 获取属性的成员