0

在Java中,给定一个dim为6000 * 6000的二维双值数组,是否有一种有效的方法来查询行最大值和行总和?

我正在使用数据结构 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 类的 Java 库?

谢谢!

4

3 回答 3

1

计算数组的总和或数组中的最大值,您必须访问数组的每个元素。你不能加快速度。

但是,如果数组不会改变,并且您将多次需要数组的总和和最大值,那么您可以计算一次然后查找它们。有两种方法:

  • 在开始时计算二维数组的所有行所需的值并将它们存储在查找表中。这是一个表单或急切的缓存。

  • 使用(比如说)a HashMap<Integer, CacheEntry>(其中CacheEntry表示总和和最大值),然后使用它来延迟缓存每行所需的值(由键索引)。

(或上述实现的一些变化。)


有没有提供更有效解决方案的 Java 库?是否有任何类似于 Python 或 R 中的 Matrix 类的 Java 库?

据我所知不是。当然,不在标准 Java 类库中。

但是,如果您使用急切延迟缓存,则不需要库......来解决这个问题。

于 2017-06-26T11:22:13.067 回答
0
// 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];
            }
        }
}
于 2017-06-27T05:17:08.047 回答
0

我不知道使用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;
        }
    }
于 2017-06-26T11:37:30.530 回答