Alternar entre matriz esparsa e matriz bidimensional em java


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.

  1. A matriz esparsa registrará a linha, coluna e número de alguns elementos diferentes de zero (ou valores diferentes de x)
  2. 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)
  3. 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:
Insira a descrição da imagem aqui

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

Acho que você gosta

Origin blog.csdn.net/Meloneating/article/details/114978174
Recomendado
Clasificación