浅谈Java数据结构之稀疏数组知识总结

网友投稿 268 2023-01-13

浅谈Java数据结构之稀疏数组知识总结

稀疏数组

当一个数组中的元素大多为0或者相同元素的时候,可以用稀疏数组来压缩

稀疏数组只记录 行row 列col 值value

将下列的二维数组转为稀疏数组,如下两图所示

1.实现二维数组转为稀疏数组的步骤:

遍历数组,得到数组中 不为0的个数,并记录为sum,作为稀疏数组第0行的 value

遍历数组,将数组中不为0的数的行和列和值分别写入稀疏数组的 row col val 中

代码实现:

public class SparseArray {

public static void main(String[] args) {

// 创建一个原始二维数组

// 0表示没有棋子,1,2各表示一种棋

int chessArr[][] = new int[8][8];

chessArr[1][1] = 1;

chessArr[2][2] = 2;

// 遍历原始数组,获得不等于 0 的个数,并输出原始数组

int sum = 0;

System.out.println("原始数组:");

for (int[] ints : chessArr) {

for (int anInt : ints) {

System.out.print(anInt+"\t");

if (anInt != 0){

sum++;

}

}

System.out.println();

}

System.out.println(sum);

// 创建稀疏数组并赋值

int sparseArray[][] = new int[sum+1][3];

http:// int row = chessArr.length; // 原数组的行数

int col = chessArr[0].length; // 原数组的列数

sparseArray[0][0] = row;

sparseArray[0][1] = col;

sparseArray[0][2] = sum;

// 遍历原始数组并赋值给稀疏数组

int count = 0; // count 为计数器

for (int i = 0;i < row;i++) {

for (int j = 0;j < col;j++) {

if (chessArr[i][j] != 0) {

count++;

sparseArray[count][0] = i;

sparseArray[count][1] = j;

sparseArray[count][2] = chessArr[i][j];

}

}

}

// 输出得到的稀疏数组

System.out.println("稀疏数组为:");

for (int i = 0 ;i < sparseArray.length;i++) {

System.out.println(sparseArray[i][0]+"\t"+sparseArray[i][1]+"\t"+sparseArray[i][2]);

}

}

}

2.实现二维数组转稀疏数组的步骤

根据稀疏数组的第一行创建新的二维数组

遍历稀疏数组,将row col val 赋给新的二维数组

代码实现:

public class SparseArray {

public static void main(String[] args) {

...... // 接上一段代码

// 输出得到的稀疏数组

System.out.println("稀疏数组为:");

for (int i = 0 ;i < sparseArray.length;i++) {

System.out.println(sparseArray[i][0]+"\t"+sparseArray[i][1]+"\t"+sparseArray[i][2]);

}

// 创建新的二维数组

int newChessArray[][] = new int[sparseArray[0][0]][sparseArray[0][1]];

for (int i = 1 ;i < sparseArray.length;i++) {

newChessArray[sparseArray[i][0]][sparseArray[i][1]] = sparseArray[i][2];

}

// 输出新的二维数组

System.out.println("恢复后的二维数组是:");

for (int[] ints : newChessArray) {

for (int anInt : ints) {

System.out.print(anInt+"\t");

}

System.out.println();

}

}

}

3.将稀疏数组写入磁盘

public static void main(String[] args) {

........

// 将稀疏数组存入磁盘

FileOutputShttp://tream fw = null;

try {

fw = new FileOutputStream("sparseArray.txt");

// 遍历写入磁盘

for (int i = 0; i < sparseArray.length; i++) {

for (int j = 0; j < 3; j++) {

fw.write(sparseArray[i][j]);

}

}

fw.flush();

} catch (FileNotFoundException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

} finally {

if (fw != null){

fw.close();

}

}

}

4.从磁盘读取稀疏数组

public static void main(String[] args) {

.......

// 从磁盘读取稀疏数组

FileInputStream fi = null;

intGakguIbw newSparseArray[][] = new int[sum+1][3]; // sum 指前面二维数组有值的个数

try {

fi = new FileInputStream("sparseArray.txt");

for (int i = 0;i < newSparseArray.length;i++) {

for (int j = 0;j < 3;j++){

newSparseArray[i][j] = fi.read();

}

}

} catch (FileNotFoundException e){

e.printStackTrace();

} finally {

if (fi != null){

fi.close();

}

}

}

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Junit测试多线程无法得到结果的问题解决
下一篇:沧州快递物流查询单号电话(沧州市顺丰快递网点查询)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~