2013-02-08 3 views
0

Avec Java, il semble y avoir un important ralentissement lors de l'utilisation des tableaux multidimensionnels: -En Java, comment puis-je représenter un système de coordonnées 2d dans un seul tableau?

int[] oneDArray=new int[3000*3000]; 
int[][] twoDArray=new int[3000][3000]; 

for(int x=0;x<oneDArray.length;x++){ 
    oneDArray[x]=x; 
} 



for(int x=0;x<twoDArray.length;x++){ 
    for(int y=0;y<twoDArray[0].length;y++){ 
     twoDArray[x][y]=x; 
    } 
} 

Le résultat est le suivant: 1d prend 4 ms et 2d prend 15ms, c'est un retard considérable lors de l'exécution des fonctions graphiques. Comment puis-je représenter une coordonnée 2D avec un seul tableau en Java?

+0

Vous pouvez toujours avoir un tableau d'objets de coordonnées mais je doute que cela résoudra les problèmes de délai – smk

Répondre

5
int w = 3000; 
int h = 3000; 

int[] array = new int[w * h]; 

/* Here is how to calculate the index for a specific (x, y) */ 
int index = y * w + x; 

array[index] = 5; 
+0

Merci je vais tester la performance, est-ce O (n) car normalement 2d impliquerait O (n^2) – user2054388

+1

L'allocation est O (n) dans les deux cas, et l'accès à un élément est O (1) dans les deux cas. Mais 2D ralentit car le pipeline s'arrête quand il résout l'adresse mémoire de l'élément final. –

1

Il est assez courant d'utiliser un tableau unidimensionnel pour représenter des données 2D. Par exemple, vous pouvez traduire les indices comme ceci:

1Dindex = xIndex + IMAGE_WIDTH*yIndex 
1

Pour un tableau rectangulaire où toutes les lignes sont de la même longueur que vous pouvez simplement utiliser la convention qui oneDArray[x*3000 + y] tient la valeur à la position (x, y) dans le rectangle .

0

Option 1:

Utilisation tableau 1D d'objets paire Pair[]

class Pair { 
    int x; 
    int y; 
} 

Option 2:

Utilisation transformation arithmétique entre 1D et 2D: Par exemple, vous avez dimension 100 * 200;

Puis a[i, j] = a[i * 200 + j]

0

Que diriez-vous linéariser le tableau en faisant quelque chose comme mélanger les coordonnées? Tous les éléments pairs du tableau peuvent appartenir aux éléments x et les éléments impairs à y. Si vous les choisissez par paires, c'est encore plus facile à écrire.

Quelque chose comme ceci:

x = [x1, x2, x3, x4, ..... , x3000] 
y = [y1, y2, y3, y4, ..... , y3000] 

et le remplacer par quelque chose comme:

data = [x1, y1, x2, y2, x3, y3, x4, y4, ...... , x3000, y3000] 

vous pouvez sélectionner à partir de ce tous les même éléments pour obtenir le x et les éléments impairs pour obtenir le y. Un bonus est que vous pouvez faire quelque chose comme:

coord (point in position i) = [data [2i], data[2i+1]] 

pour ramener les coordonnées du point i. Sinon, je suis tout à fait d'accord pour linéariser le tableau en faisant d'abord tous les x puis les y comme d'autres l'ont suggéré.

+0

Suggérez-vous comme une structure d'entrelacement des lignes verticales et des données de colonne. – user2054388

+0

J'ai essayé de mieux l'expliquer dans le montage. Faites-moi savoir si vous avez besoin d'informations supplémentaires. – mgm

Questions connexes