2017-06-26 5 views
0

En Java, étant donné un tableau 2D de valeurs doubles avec dim comme 6000 * 6000, existe-t-il un moyen efficace d'interroger la ligne max et la somme des lignes? J'utilise la structure de données double [] [] et une boucle à deux couches pour obtenir la ligne max et sum, mais elle n'est pas suffisamment efficace, car cette fonction est appelée fréquemment.Obtenir efficacement row.max et row.sum d'un tableau 2D Java

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; 
    } 
} 

Existe-t-il une bibliothèque Java offrant des solutions plus efficaces? Existe-t-il une bibliothèque Java similaire à la classe Matrix en Python ou R?

Merci!

+0

Est-ce que votre tableau change sa valeur? – Flown

+0

Non. Après l'initialisation, les valeurs sont fixes. –

+2

Ensuite, vous devriez mettre en cache vos résultats. – Flown

Répondre

1

Pour calculer la somme d'un tableau, ou la plus grande valeur dans un tableau, vous devez visiter chaque élément du tableau. Vous ne pouvez pas accélérer ça. Cependant, si le tableau ne va pas changer, et que vous aurez besoin de la somme et du maximum pour le tableau plusieurs fois, alors vous pouvez les calculer une fois et ensuite les rechercher. Il existe deux approches:

  • Calculer les valeurs requises pour toutes les lignes de votre tableau 2-D au début et à les stocker dans une table de consultation. C'est un formulaire désireux cache.

  • utilisation (par exemple) un HashMap<Integer, CacheEntry> (où CacheEntry représente la somme et max), et ensuite à utiliser l'paresseusement cache les valeurs requises pour chaque rangée (indexée par la clé).

(ou une variante sur la mise en œuvre de ce qui précède.)


Y at-il bibliothèque Java qui fournit des solutions plus efficaces? Existe-t-il une bibliothèque Java similaire à la classe Matrix en Python ou R?

Pas à ma connaissance. Certainement, pas dans les bibliothèques de classes Java standard.

Cependant, si vous utilisez désireux ou paresseux cache, vous ne devriez pas avoir besoin d'une bibliothèque ... pour ce problème.

0

Je ne sais pas si plus efficace mais beaucoup plus court en utilisant Stream. Voici une démonstration en utilisant tableau 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; 
     } 
    } 
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]; 
      } 
     } 
}