Alternar entre java sparse array e bidimensional array
Este artigo foi selecionado de Shang Silicon Valley java data structure and algoritmo, jdk8, eclipse environment
Definição de matriz esparsa
A chamada matriz esparsa geralmente se refere a uma matriz bidimensional, a maioria dos elementos são 0 ou o mesmo número x, apenas alguns elementos são diferentes dele, portanto, para evitar desperdício de memória ao armazenar na memória, altere o a matriz bidimensional original é convertida em uma matriz esparsa para armazenamento.
- A matriz esparsa registrará a linha, coluna e número de alguns elementos diferentes de zero (ou valores diferentes de x)
- A primeira linha da matriz esparsa registra o número de linhas e colunas da matriz bidimensional original e o número de elementos diferentes de zero (ou x)
- A matriz esparsa tem um total de elementos diferentes de zero (ou x) + 1 linha e três colunas
Veja a imagem de Shang Silicon Valley como exemplo:
Demonstração de código
Primeiro, crie uma matriz bidimensional com 11 linhas e 11 colunas à vontade
public class SparseArray {
public static void main(String[] args) {
int[][] sparseArr = new int[11][11];
sparseArr[1][2] = 1;
sparseArr[2][3] = 2;
sparseArr[3][5] = 2;
sparseArr[4][4] = 1;
for(int[] arr:sparseArr){
for(int arr1:arr){
System.out.printf("%d\t",arr1);
}
System.out.println();
}
}
O resultado de saída é
0 0 0 0 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0 0
0 0 2 0 0 0 0 0 0 0
0 0 0 0 0 2 0 0 0 0 0
0 0 0 0 1 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0
Explique que a frase
for(int[] arr:sparseArr){
for(int arr1:arr){
Entre eles, foreach é usado para percorrer a matriz, que é um pouco semelhante à travessia de python, e os dois pontos são equivalentes a in no loop for em python.
for(type var x:obj){
引用了x的java语句
}
Entre eles, var x é um parâmetro formal, type é o tipo do parâmetro formal e obj é o objeto de travessia. Aqui, o primeiro loop for fornece uma linha de sparseArr para arr, e o segundo loop for fornece cada elemento na linha arr para arr1.
Converta uma matriz bidimensional em uma matriz esparsa
Em seguida, converta-o em uma matriz esparsa
//把数组转换为稀疏数组
int sum = 0;
for(int i = 0;i < sparseArr.length;i++){
for(int j = 0;j < sparseArr[0].length;j++){
if(sparseArr[i][j] != 0)
sum++;
}
}
System.out.println("sum= "+sum);
int sparseArr1[][] =new int[sum+1][3];
sparseArr1[0][0] = 11;
sparseArr1[0][1] = 11;
sparseArr1[0][2] = sum;
int count = 0;
for(int i = 0;i < sparseArr.length;i++){
for(int j = 0;j < sparseArr[0].length;j++){
if(sparseArr[i][j] != 0){
count++;
sparseArr1[count][0] = i;
sparseArr1[count][1] = j;
sparseArr1[count][2] = sparseArr[i][j];
}
}
}
System.out.println("稀疏数组为:");
for(int[] arr:sparseArr1){
for(int arr1:arr)
System.out.printf("%d\t",arr1);
System.out.println();
}
Aqui, o número de elementos diferentes de zero (ou x) é necessário primeiro e, em seguida, a matriz esparsa é desenhada.
Entre eles, a sentença de saída também pode ser escrita como
for(int i = 0;i <= sum;i++){
System.out.printf("%d\t%d\t%d\n",sparseArr1[i][0],sparseArr1[i][1],sparseArr1[i][2]);
}
O efeito de saída é o mesmo, mas mais conciso.
Os resultados da operação são:
soma = 4 A
matriz esparsa é:
11 11 4
1 2 1
2 3 2
3 5 2
4 4 1
Converter matriz esparsa em matriz bidimensional
código mostrado abaixo
//将稀疏数组转换为原始数组
System.out.println("原始数组为:");
int sparseArr2[][] = new int[sparseArr1[0][0]][sparseArr1[0][1]];
for(int i = 1;i <= sum;i++){
sparseArr2[sparseArr1[i][0]][sparseArr1[i][1]] = sparseArr1[i][2];
}
for(int[] arr:sparseArr2){
for(int arr1:arr)
System.out.printf("%d\t",arr1);
System.out.println();
}
O resultado da operação é a matriz bidimensional original.
O código total é o seguinte
package com.atguigu.sparsearray;
public class SparseArray {
public static void main(String[] args) {
int[][] sparseArr = new int[11][11];
sparseArr[1][2] = 1;
sparseArr[2][3] = 2;
sparseArr[3][5] = 2;
sparseArr[4][4] = 1;
for(int[] arr:sparseArr){
for(int arr1:arr){
System.out.printf("%d\t",arr1);
}
System.out.println();
}
//把数组转换为稀疏数组
int sum = 0;
for(int i = 0;i < sparseArr.length;i++){
for(int j = 0;j < sparseArr[0].length;j++){
if(sparseArr[i][j] != 0)
sum++;
}
}
System.out.println("sum= "+sum);
int sparseArr1[][] =new int[sum+1][3];
sparseArr1[0][0] = 11;
sparseArr1[0][1] = 11;
sparseArr1[0][2] = sum;
int count = 0;
for(int i = 0;i < sparseArr.length;i++){
for(int j = 0;j < sparseArr[0].length;j++){
if(sparseArr[i][j] != 0){
count++;
sparseArr1[count][0] = i;
sparseArr1[count][1] = j;
sparseArr1[count][2] = sparseArr[i][j];
}
}
}
System.out.println("稀疏数组为:");
// for(int[] arr:sparseArr1){
// for(int arr1:arr)
// System.out.printf("%d\t",arr1);
// System.out.println();
// }
//输出语句可以换为:
for(int i = 0;i <= sum;i++){
System.out.printf("%d\t%d\t%d\n",sparseArr1[i][0],sparseArr1[i][1],sparseArr1[i][2]);
}
//将稀疏数组转换为原始数组
System.out.println("原始数组为:");
int sparseArr2[][] = new int[sparseArr1[0][0]][sparseArr1[0][1]];
for(int i = 1;i <= sum;i++){
sparseArr2[sparseArr1[i][0]][sparseArr1[i][1]] = sparseArr1[i][2];
}
for(int[] arr:sparseArr2){
for(int arr1:arr)
System.out.printf("%d\t",arr1);
System.out.println();
}
}
}
O resultado da operação é
0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0 0
0 0 2 0 0 0 0 0 0
0 0 0 0 0 2 0 0 0 0 0
0 0 0 0 1 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
soma = 4 A
matriz esparsa é:
11 11 4
1 2 1
2 3 2
3 5 2
4 4 1 A
matriz original é:
0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0 0
0 0 0 2 0 0 0 0 0 0
0 0 0 0 0 0 2 0 0 0 0 0
0 0 0 0 1 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0