算法与数据结构从零开始学习

  数据结构

数据结构包括:线性结构和非线性结构

线性结构

1)线性结构特点是数据元素之间存在的一对一的线性关系。

2)线性结构有两种存储结构:顺序存储、链式存储。顺序存储称为顺序表。主要是存储的地址是连续的。

3)链式存储被称为链表,存储元素的地址不一定是连续的,元素节点中存储着数据元素以及相邻元素的地址信息。

4)线性结构常见的有:数组,队列,链表和栈

非线性结构

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

 

稀疏数组和队列:

稀疏数组的需求:编写的五子棋中,有存盘的功能。在一个数组中有很多没有用的数据,例如零。就可以选择稀疏数组对原数组进行压缩。

基本介绍:

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

稀疏数组的处理方法是:

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

2)把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模

 

整体思路分析

二维数组转稀疏数组

1、遍历原始的二维数组,得到有效数据的个数sum

2、根据sum就可以创建稀疏数组sparseArr int [sum+1][3]

3、将二维数组的有效数据存入到稀疏数组

 

稀疏数组转原始的二维数组的思路

1、先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组,比如上面的chessArr2 = int[11][11]

2、在读取稀疏数组后几行的数据并赋给原始的二维数组即可。

上代码:

package com.cqupt.sparsearray;

import java.util.TreeSet;

public class SparseArray {

    public static void main(String[] args) {
        int chessArr [][] = new int[11][11];
        chessArr[1][2] = 1;
        chessArr[2][3] = 2;
        chessArr[4][5] = 2;
        for (int []row:chessArr){

            for(int i :row){
                System.out.printf("%d\t",i);
            }
            System.out.println();
        }
        int sum = 0;
        for(int i = 0;i<11;i++){
            for(int j = 0;j<11;j++){

                if(chessArr[i][j]!=0){
                    sum++;
                }
            }
        }
        System.out.println(sum);
        int [][] sparseArr = new int[sum + 1][3];
        sparseArr[0][0] = 11;
        sparseArr[0][1] = 11;
        sparseArr[0][2] = sum;
        int count = 1;
        for(int i = 0;i<11;i++){
            for(int j = 0;j<11;j++){

                if(chessArr[i][j]!=0){
                    sparseArr[count][0] = i;
                    sparseArr[count][1] = j;
                    sparseArr[count][2] = chessArr[i][j];
                    count++;
                }
            }
        }


        for(int i = 0 ;i<sum+1;i++){

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

                System.out.printf("%d\t",sparseArr[i][j]);
            }
            System.out.println();
        }

        System.out.println(sparseArr.length);

        int chessArr2[][] = new int[sparseArr[0][0]][sparseArr[0][1]];
        for(int i = 1;i<sum+1;i++){
            chessArr2[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
        }

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

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

                System.out.printf("%d\t",chessArr2[i][j]);
            }
            System.out.println();
        }
    }
}

 

 

 

队列

 

posted @ 2021-10-19 09:58  夏天·烟火·我的尸体  阅读(102)  评论(0)    收藏  举报