稀疏数组--数据结构和算法笔记

当一个数组中大部分元素为0 或者为同一个值的数组时,可以使用稀疏数组来保存该数组

处理方法:

1.记录数组一共有几行几列,有多少个不同的值

2.把不同值的元素的行、列、值记录在另一个数组中,从而缩小程序的规模

注:把一个数组转换成稀疏数组并保存到.data文件 ,再读取.data文件恢复把稀疏数组恢复为原数组


import java.io.BufferedOutputStream;
import java.io.BufferedWriter;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class App {
    public static void main(String[] args) throws IOException {

        // 原数组
        int[][] i = new int[7][7];
        i[1][3] = 1;
        i[3][4] = 2;
        i[3][3] = 2;
        i[2][2] = 1;
        i[0][0] = 1;
        System.out.println("原数组");
        for (int[] js : i) {
            for (int j : js) {
                System.out.print(j + "  ");
            }
            System.out.println();
        }
        // 记录原数组有多少个数据
        int num = 0;
        for (int j = 0; j < i.length; j++) {
            for (int j2 = 0; j2 < i[0].length; j2++) {
                if (i[j][j2] != 0) {
                    num++;
                }
            }
        }
        System.out.println("有效数据");
        System.out.println(num);
        // 用于行的自增长
        int count = 1;
        // 稀疏数组
        int[][] ii = new int[num + 1][3];
        ii[0][0] = i.length;
        ii[0][1] = i[0].length;
        ii[0][2] = num;
        for (int j = 0; j < i.length; j++) {
            for (int j2 = 0; j2 < i[0].length; j2++) {
                if (i[j][j2] != 0) {
                    ii[count][0] = j;
                    ii[count][1] = j2;
                    ii[count++][2] = i[j][j2];

                }
            }
        }
        // 输出到文件 q.data
        FileOutputStream out = new FileOutputStream("d://q.data");
        System.out.println("稀疏数组");
        for (int[] js : ii) {
            for (int js2 : js) {
                System.out.print(js2 + "  ");
                out.write(js2);
            }
            System.out.println();

        }
        out.close();
        // 读取文件 q.data文件
        FileInputStream in = new FileInputStream("d://q.data");
        int row;
        // 恢复数组 第一个值为行,第二个值为列
        int iii[][] = new int[in.read()][in.read()];
        // 第三个为有多少个有效数据
        in.read();
        int column;
        int value;
        // 开始遍历恢复(每三个一组)
        while ((row = in.read()) != -1) {
            column = in.read();
            value = in.read();
            iii[row][column] = value;
        }
        in.close();
        System.out.println("恢复的数组");
        for (int[] js : iii) {
            for (int js2 : js) {
                System.out.print(js2 + "  ");
            }
            System.out.println();
        }
    }
}

输出:

原数组

1  0  0  0  0  0  0
0  0  0  1  0  0  0
0  0  1  0  0  0  0
0  0  0  2  2  0  0
0  0  0  0  0  0  0
0  0  0  0  0  0  0
0  0  0  0  0  0  0
有效数据
5
稀疏数组
7  7  5
0  0  1
1  3  1
2  2  1
3  3  2
3  4  2
恢复的数组
1  0  0  0  0  0  0
0  0  0  1  0  0  0
0  0  1  0  0  0  0
0  0  0  2  2  0  0
0  0  0  0  0  0  0
0  0  0  0  0  0  0
0  0  0  0  0  0  0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值