稀疏数组
基本介绍
当一个数组中大部分元素为0,或者为同一个值得数组时,可以使用稀疏数组来保存该数组。
稀疏数组的处理方法:
1. 记录数组一共有几行几列,有多少个不同的值。
2. 把具有不同值得元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模。
稀疏矩阵第一行记录几行几列多少个值,往下的每行记录每个数据的位置和值。
案例
稀疏数组和普通数组的相互转换。
package com.sparseArray;
import java.io.*;
public class SparseArray {
public static void main(String[] args) throws IOException {
sparseArrayToArray(readSparseArray());
}
/**
* 写入普通矩阵
* @throws IOException
*/
public static void writeArray() throws IOException {
int[][] chessArray = new int[11][11];
FileWriter fw = new FileWriter("D:\\java\\IDEA_projects\\数据结构与算法\\DataStructures\\data\\array.data");
chessArray[1][3] = 1;
chessArray[2][6] = 2;
for (int[] row : chessArray) {
for (int col : row) {
fw.write(col+"\t");
}
fw.write("\n");
}
fw.close();
}
/**
* 读取普通矩阵
* @return
* @throws IOException
*/
public static int[][] readArray() throws IOException{
File file = new File("D:\\java\\IDEA_projects\\数据结构与算法\\DataStructures\\data\\array.data");
FileInputStream fis = new FileInputStream(file);
byte[] bytes = new byte[(int) file.length()];
fis.read(bytes);
String s = new String(bytes);
String[] rows = s.split("\n");
String[][] array = new String[rows.length][];
for (int i = 0; i < rows.length; i++) {
array[i] = rows[i].split("\t");
}
int[][] result = new int[rows.length][array[0].length];
for (int i = 0; i < result.length; i++) {
for (int j = 0; j < result[0].length; j++) {
result[i][j] = Integer.parseInt(array[i][j]);
}
}
fis.close();
return result;
}
/**
* 将矩阵转换为稀疏矩阵
* @param array
* @throws IOException
*/
public static void arrayToSparseArray(int[][] array) throws IOException {
//数据个数
int sum = 0;
for (int[] row : array) {
for (int col : row) {
if(col != 0){
sum++;
}
}
}
//稀疏矩阵
int[][] sparseArray = new int[sum + 1][3];
sparseArray[0][0] = array.length;
sparseArray[0][1] = array[0].length;
sparseArray[0][2] = sum;
int count = 0;
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array[0].length; j++) {
if(array[i][j] != 0){
count++;
sparseArray[count][0] = i;
sparseArray[count][1] = j;
sparseArray[count][2] = array[i][j];
}
}
}
FileWriter fw = new FileWriter("D:\\java\\IDEA_projects\\数据结构与算法\\DataStructures\\data\\sparseArray.data");
for (int[] row : sparseArray) {
for (int col : row) {
fw.write(col+"\t");
}
fw.write("\n");
}
fw.close();
}
/**
* 读取稀疏矩阵
* @return
* @throws IOException
*/
public static int[][] readSparseArray() throws IOException {
File file = new File("D:\\java\\IDEA_projects\\数据结构与算法\\DataStructures\\data\\sparseArray.data");
FileInputStream fis = new FileInputStream(file);
byte[] bytes = new byte[(int) file.length()];
fis.read(bytes);
String s = new String(bytes);
String[] rows = s.split("\n");
String[][] array = new String[rows.length][];
for (int i = 0; i < rows.length; i++) {
array[i] = rows[i].split("\t");
}
int[][] result = new int[rows.length][array[0].length];
for (int i = 0; i < rows.length; i++) {
for (int j = 0; j < array[0].length; j++) {
result[i][j] = Integer.parseInt(array[i][j]);
}
}
fis.close();
return result;
}
/**
* 将稀疏矩阵转换为普通矩阵
* @param sparseArray
*/
public static void sparseArrayToArray(int[][] sparseArray){
int[][] array = new int[sparseArray[0][0]][sparseArray[0][1]];
for (int i = 1; i < sparseArray.length; i++) {
array[sparseArray[i][0]][sparseArray[i][1]] = sparseArray[i][2];
}
for (int[] row : array) {
for (int col : row) {
System.out.printf("%d\t",col);
}
System.out.println();
}
}
}