高效获取 Java 二维数组的 row.max 和 row.sum
Efficiently get the row.max and row.sum of a Java 2D array
在Java中,给定一个dim为6000*6000的double值的二维数组,有没有一种有效的方法来查询行最大值和行总和?
我正在使用数据结构 double[][] 和一个双层循环来获取行的最大值和求和,但是效率不够高,因为这个函数被频繁调用。
double MinRowMax = Double.POSITIVE_INFINITY;
int num = 6000;
double[][] array2DDist = new double[num][num];
Random rand = new Random();
// initialising the array2DDist
for(int i=0;i<num;++i)
for(int j=0;j<num;++j)
array2DDist[i][j] = rand.nextDouble();
// get the row.max and row.sum
for(int i=0;i<num;++i) {
double maxDist = Double.NEGATIVE_INFINITY;
double sumDist = 0;
for(int j=0;j<num;++j) {
double dist = array2DDist[i][j];
maxDist = Double.max(maxDist, dist);
sumDist+=dist;
}
if(maxDist < MinRowMax) {
MinRowMax = maxDist;
}
}
是否有任何 Java 库可以提供更有效的解决方案? Python 或 R 中有没有类似于 Matrix class 的 Java 库?
谢谢!
要计算数组的总和,或数组中的最大值,您必须访问数组的每个元素。你无法加快速度。
但是,如果数组不会改变,并且您将多次需要数组的总和和最大值,那么您可以计算一次,然后查找它们。有两种方法:
在开始时计算二维数组所有行的所需值,并将它们存储在查找中 table。这是一个表单或 eager 缓存。
使用(比如说)一个HashMap<Integer, CacheEntry>
(其中CacheEntry
代表总和和最大值),然后用这个来lazily缓存每行所需的值(由键索引)。
(或上述实施方式的一些变体。)
Is there any Java library that provides more efficient solutions? Is there any Java library that is similar to Matrix class in Python or R?
据我所知不是。当然,不在标准 Java class 库中。
但是,如果你使用 eager 或 lazy 缓存,你应该不需要库...来解决这个问题。
我不知道使用 Stream
是否更有效但更短。这是一个使用 4x4 数组的演示:
double MinRowMax = Double.POSITIVE_INFINITY;
int num = 4;
double[][] array2DDist = new double[num][num];
Random rand = new Random();
// initializing the array2DDist
for(int i=0;i<num;++i) {
for(int j=0;j<num;++j) {
array2DDist[i][j] = rand.nextDouble();
}
}
// get the row.max and row.sum
for(int row=0;row<num;++row) {
double maxDist = Double.NEGATIVE_INFINITY;
double sumDist = 0;
for(int col=0;col<num;++col) {
double dist = array2DDist[row][col];
maxDist = Double.max(maxDist, dist);
sumDist+=dist;
}
//System.out.println(Arrays.toString(array2DDist[row]));
System.out.println("row sum - max " + sumDist +" - " + maxDist);
System.out.println("row sum - max " + Arrays.stream(array2DDist[row]).parallel().sum()
+" - " + Arrays.stream(array2DDist[row]).parallel() .max().getAsDouble());
if(maxDist < MinRowMax) {
MinRowMax = maxDist;
}
}
// Programme to get sum of rows value and column values seprately.
int[] colSum =new int[array[0].length];
for (int i = 0; i < array.length; i++){
for (int j = 0; j < array[i].length; j++){
sum += array[i][j];
colSum[j] += array[i][j];
}
System.out.println("Print the sum of rows =" + sum);
}
for(int k=0;k<colSum.length;k++){
System.out.println("Print the sum of columns =" + colSum[k]);
}
// Programme to get maximum in 2D array.
map<int, int> temp;
int currentMax= -999999,maxCount=0;
for(i=0; i< numberOflines ;i++)
{
for(j=0;j< array[i].length;j++)
{
int newCount = ++temp[array[i][j]];
if (maxCount < newCount) {
maxCount = newCount;
currentMax = array[i][j];
}
}
}
在Java中,给定一个dim为6000*6000的double值的二维数组,有没有一种有效的方法来查询行最大值和行总和?
我正在使用数据结构 double[][] 和一个双层循环来获取行的最大值和求和,但是效率不够高,因为这个函数被频繁调用。
double MinRowMax = Double.POSITIVE_INFINITY;
int num = 6000;
double[][] array2DDist = new double[num][num];
Random rand = new Random();
// initialising the array2DDist
for(int i=0;i<num;++i)
for(int j=0;j<num;++j)
array2DDist[i][j] = rand.nextDouble();
// get the row.max and row.sum
for(int i=0;i<num;++i) {
double maxDist = Double.NEGATIVE_INFINITY;
double sumDist = 0;
for(int j=0;j<num;++j) {
double dist = array2DDist[i][j];
maxDist = Double.max(maxDist, dist);
sumDist+=dist;
}
if(maxDist < MinRowMax) {
MinRowMax = maxDist;
}
}
是否有任何 Java 库可以提供更有效的解决方案? Python 或 R 中有没有类似于 Matrix class 的 Java 库?
谢谢!
要计算数组的总和,或数组中的最大值,您必须访问数组的每个元素。你无法加快速度。
但是,如果数组不会改变,并且您将多次需要数组的总和和最大值,那么您可以计算一次,然后查找它们。有两种方法:
在开始时计算二维数组所有行的所需值,并将它们存储在查找中 table。这是一个表单或 eager 缓存。
使用(比如说)一个
HashMap<Integer, CacheEntry>
(其中CacheEntry
代表总和和最大值),然后用这个来lazily缓存每行所需的值(由键索引)。
(或上述实施方式的一些变体。)
Is there any Java library that provides more efficient solutions? Is there any Java library that is similar to Matrix class in Python or R?
据我所知不是。当然,不在标准 Java class 库中。
但是,如果你使用 eager 或 lazy 缓存,你应该不需要库...来解决这个问题。
我不知道使用 Stream
是否更有效但更短。这是一个使用 4x4 数组的演示:
double MinRowMax = Double.POSITIVE_INFINITY;
int num = 4;
double[][] array2DDist = new double[num][num];
Random rand = new Random();
// initializing the array2DDist
for(int i=0;i<num;++i) {
for(int j=0;j<num;++j) {
array2DDist[i][j] = rand.nextDouble();
}
}
// get the row.max and row.sum
for(int row=0;row<num;++row) {
double maxDist = Double.NEGATIVE_INFINITY;
double sumDist = 0;
for(int col=0;col<num;++col) {
double dist = array2DDist[row][col];
maxDist = Double.max(maxDist, dist);
sumDist+=dist;
}
//System.out.println(Arrays.toString(array2DDist[row]));
System.out.println("row sum - max " + sumDist +" - " + maxDist);
System.out.println("row sum - max " + Arrays.stream(array2DDist[row]).parallel().sum()
+" - " + Arrays.stream(array2DDist[row]).parallel() .max().getAsDouble());
if(maxDist < MinRowMax) {
MinRowMax = maxDist;
}
}
// Programme to get sum of rows value and column values seprately.
int[] colSum =new int[array[0].length];
for (int i = 0; i < array.length; i++){
for (int j = 0; j < array[i].length; j++){
sum += array[i][j];
colSum[j] += array[i][j];
}
System.out.println("Print the sum of rows =" + sum);
}
for(int k=0;k<colSum.length;k++){
System.out.println("Print the sum of columns =" + colSum[k]);
}
// Programme to get maximum in 2D array.
map<int, int> temp;
int currentMax= -999999,maxCount=0;
for(i=0; i< numberOflines ;i++)
{
for(j=0;j< array[i].length;j++)
{
int newCount = ++temp[array[i][j]];
if (maxCount < newCount) {
maxCount = newCount;
currentMax = array[i][j];
}
}
}