数据机构分类

数据结构 大体上分为了 线性结构和非线性结构

  如果再细分,可以把非线性结构分为 树,多维数组(2维以上),再加上集合(一般不研究)

线性结构

  1.数据元素之间存在一对一的关系

  2.数据存储有两种方式,顺序存储(一维数组)链式存储(链表),

    其中顺序存储的叫做线性表,存储的元素物理上是连续的,链式存储的叫做链表,物理上不一定连续

  3.常见的线性结构

      数组,链表,栈,队列

数组

  稀疏数组:当一个数组里面大部分的值都一样的时候,可以使用稀疏数组(列永远是3)

  只记录不同值所在的行,列,以及值(存到一个更小的数组中),以及原数组的大小和不同值的个数

  比如五子棋

左边是正常数组 右边是稀疏数组,右边的意思是

上边的红框存储原数组的大小和有不同的值的个数,下边的红框表示第0行第2列有一个值为1的数据 同理 第0行第3列有一个值为2的数据........

这样存储的容量小于左边的

二维转稀疏

  获得当前不同值的个数(遍历)n

  创建稀疏数组 int [n+1] [3]

  保存数据,第一行一定是二维数组的行,列,n

稀疏转二维

  先读取第一行,获得n行,m列值 创建二维数组 int [n] [m]

   去读后边的数据

public class MainTest {
    public static void main(String[] args) {
            //直接赋值
            int[][] arr1={{0,0,0,0,0},{1,0,4,0,51},{0,0,0,0,0},{0,0,0,0,0},{0,0,0,0,0}};
            //创建一个对象
           /* int[][] arr2=new int[5][5];
            arr2[1][0]=1;
            arr2[1][2]=4;
            arr2[1][4]=51;*/
           //打印arr1
        System.out.println("二维数组:");
            for(int[] row:arr1) {
                for (int i : row) {
                    System.out.print(i);
                    System.out.print(" ");
                }
                System.out.println();
            }
        //遍历arr1二维数组
            int count=0;
            for(int i=0;i<arr1.length;i++){
                for(int j=0;j<arr1[i].length;j++){
                    if(arr1[i][j]!=0)
                        count++;
                }
            }
            //创建稀疏数组 行为个数+1
            int[][] arrmix=new int[count+1][3];
            arrmix[0][0]=5;
            arrmix[0][1]=5;
            arrmix[0][2]=count;

            //把二维数组的值存入
         //稀疏数组的行 第0行已经存过数据了,从第一行开始
        int n=1;
        for(int i=0;i<arr1.length;i++){
            for(int j=0;j<arr1[i].length;j++){
                    if(arr1[i][j]!=0) {
                        arrmix[n][0] = i;
                        arrmix[n][1] = j;
                        arrmix[n][2] = arr1[i][j];
                        n++;
                    }
                }
            }
        //打印稀疏数组
        System.out.println("稀疏数组:");
        /*System.out.println(arrmix[0][0]);
        System.out.println(arrmix[0][1]);
        System.out.println(arrmix[0][2]);*/
        for(int[] row:arrmix) {
            for (int i : row) {
                System.out.print(i);
                System.out.print(" ");
            }
            System.out.println();
        }

        //恢复为二维数组
        int[][] arr2=new int[arrmix[0][0]][arrmix[0][1]];
        for(int i=1;i<count+1;i++){
            arr2[arrmix[i][0]][arrmix[i][1]]=arrmix[i][2];
        }
        System.out.println("打印恢复后的");
        for(int[] row:arr2){
            for(int i:row){
                System.out.print(i);
                System.out.print(" ");
            }
            System.out.println();
        }
    }
}

打印结果

 ------------------------------------------未完待续,继续补充---------------------------------------------------------------

猜你喜欢

转载自www.cnblogs.com/fjd-1004/p/11027215.html