编程语言
首页 > 编程语言> > Java 数据结构与算法2——稀疏数组

Java 数据结构与算法2——稀疏数组

作者:互联网

目录

1 线性结构

  1. 线性结构是最常用的数据结构,特点是数据元素之间存在一对一的线性关系
  2. 线性结构有两种不同的存储结构,即顺序存储和链式存储结构。顺序存储的线性表称为顺序表,表中的存储元素是连续的;链式存储的线性表称为链表,表中的存储元素不一定是连续的,元素节点中存储数据元素及相邻元素的地址信息。
  3. 线性结构常见的有:数组、队列、链表和栈

2 非线性结构

非线性结构包括:二维数组、多维数组、广义表、树结构、图结构

3 稀疏数组

先看一个实际需求

编写的五子棋程序中,有存盘退出和续上盘的功能。
在这里插入图片描述
因为该二维数组的很多值是默认值0,因此记录了很多没有意义的数据—>稀疏数组

稀疏数组

  1. 使用场景:当一个数组中大部分元素为0,或为同一个值的数组时,可以使用稀疏数组来保存该数组。
  2. 处理方法:(1)第一行记录数组一共几行几列,有多少不同的值;(2)之后把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模
  3. 稀疏数组举例说明:
    在这里插入图片描述
    左图为原始二维数组,包含67=42个元素;右图为稀疏数组,包含93=27个元素。其第一行表示原始数组为6行7列且有值元素共8个,第二行到九行分别记录原始数组的位置及值。

二维数组转稀疏数组思路:

  1. 遍历原始二维数组,得到有效数据的个数sum
  2. 根据sum就可以创建稀疏数组 sparseArr int[sum+1][3]
  3. 将二维数组的有效数据存入到稀疏数组

稀疏数组转二维数组思路:

  1. 先读取稀疏数组第一行,根据第一行的数据,创建二维数组chessArr = int[6][7]
  2. 在读取稀疏数组后几行的数据,并赋值给二维数组

4 代码实现(五子棋)

在这里插入图片描述
上图是实现五子棋数据存储和读取的示意图,关键部分依然是二维数组与稀疏数组的转换。其基本思路在第3点已经阐述,这里实现代码。

  1. 创建一个原始的二维数组
        //0:表示没有;1:表示黑子;2:表示白子
        int chessArr1[][] = new int[11][11];
        chessArr1[1][2] = 1;
        chessArr1[2][4] = 2;
        
		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	2	0	0	0	0	0	0	
		0	0	0	0	0	0	0	0	0	0	0	
		0	0	0	0	0	0	0	0	0	0	0	
		0	0	0	0	0	0	0	0	0	0	0	
		0	0	0	0	0	0	0	0	0	0	0	
		0	0	0	0	0	0	0	0	0	0	0	
		0	0	0	0	0	0	0	0	0	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. 二维数组转为稀疏数组
		//1. 遍历原始二维数组,得到有效数据的个数sum
        int sum = 0;
        for (int i = 0; i < chessArr1.length; i++) {
            for ( int j = 0; j < chessArr1[0].length; j++){
                if(chessArr1[i][j] != 0){
                    sum++;
                }
            }
        }
        //2. 根据sum就可以创建稀疏数组 sparseArr int[sum+1][3]
        int sparseArr[][] = new int[sum + 1][3];
        //给稀疏数组赋值
        sparseArr[0][0] = chessArr1.length;
        sparseArr[0][1] = chessArr1[0].length;
        sparseArr[0][2] = sum;
        //3. 遍历二维数组,将有值的元素存放到稀疏数组中
        int count = 0 ;
        for (int i = 0; i < chessArr1.length; i++) {
            for ( int j = 0; j < chessArr1[0].length; j++){
                if(chessArr1[i][j] != 0){
                    count ++ ;
                    sparseArr[count][0] = i;
                    sparseArr[count][1] = j;
                    sparseArr[count][2] = chessArr1[i][j];
                }
            }
        }
        
        得到的稀疏数组为:
		11	11	2	
		1	2	1	
		2	4	2	  	
  1. 将稀疏数组恢复为二维数组
		//1. 先读取稀疏数组第一行,根据第一行的数据,创建二维数组chessArr = int[6][7]
        int chessArr2[][] = new int[sparseArr[0][0]][sparseArr[0][1]];

        //2. 在读取稀疏数组后几行的数据,并赋值给二维数组
        for (int i = 1; i<sparseArr.length; i++){
            chessArr2[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
        }

        //输出恢复的二维数组
        System.out.println("恢复后的二维数组:");
        for (int[] row : chessArr2){
            for (int data : row){
                System.out.printf("%d\t",data);
            }
            System.out.println();
        }

输出结果显然和原始二维数组一模一样,哈哈!
这里在加上将稀疏数组存入和读取文件的代码

		保存稀疏数组
		String filename = "D:\\workspaceJava\\src\\数据结构\\稀疏数组\\sparseArray.txt";
        BufferedWriter bw = new BufferedWriter(new FileWriter(filename));
        System.out.println("保存稀疏数组---");
        for (int[] row : sparseArr){
            for (int data : row){
                bw.write(String.valueOf(data)+"\t");
            }
            bw.write("\n");
            bw.flush();
        }
        bw.close();

		读取稀疏数组
        int sparseArr2[][] = new int[sum + 1][3];
        int count2 = 0 ;
        BufferedReader br = new BufferedReader(new FileReader(filename));
        System.out.println("读取稀疏数组---");
        String s;
        while((s=br.readLine()) != null){
            sparseArr2[count2][0] = Integer.parseInt(s.split("\t")[0]);
            sparseArr2[count2][1] = Integer.parseInt(s.split("\t")[1]);
            sparseArr2[count2][2] = Integer.parseInt(s.split("\t")[2]);
            count2++;
        }
        br.close();

小结

1稀疏数组可以减少空间复杂度;2稀疏数组实现二维数组的数据压缩与数据恢复

标签:Java,int,chessArr1,稀疏,算法,二维,数组,sparseArr,数据结构
来源: https://blog.csdn.net/weixin_45968656/article/details/113771987