Java-数据结构与算法分析(1)——稀疏数组与二维数组的转换

一、 数据结构和算法内容介绍

  • 字符串匹配问题:KMP算法(部分匹配表)
  • 汉诺塔游戏:分治算法
  • 八皇后问题:回溯算法
  • 马踏棋盘算法:图深度优化遍历算法(DFS)+贪心算法优化

二、 数据结构与算法概述

  • 数据结构和算法的关系:数据结构是算法的基础;程序=数据结构+算法
  • 数据结构:线性结构和非线性结构
  • 线性结构:元素之间一对一的线性关系;顺序存储结构和链式存储结构。顺序存储的线性表称为顺序表,顺序表中的存储元素是连续的(地址连续,如数组);链式存储的线性表称为链表,链表中的存储元素不一定连续,元素节点中存放数据元素以及相邻元素的地址信息(可以利用碎片化内存)
  • 常见的线性结构:数组、队列、链表和栈
  • 非线性结构:二维数组、多维数组、广义表、树结构、图结构

三、 稀疏数组和队列

  • 实际需求:五子棋程序中存盘和续上盘功能,使用二维数组记录棋盘;
  • 分析问题:因为二维数组很多默认值0,记录了无意义的数据,所以要进行压缩——>稀疏数组。
  • 稀疏数组基本介绍:当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组
  • 稀疏数组处理方法:记录数组一共几行几列,有多少个不同的值把具有不同值得元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模。
  • 二维数组转稀疏数组的思路:
  1. 遍历原始的二维数组,得到有效数据的个数 sum
  2. 根据sum 就可以创建 稀疏数组 sparseArr int[sum + 1] [3]
  3. 将二维数组的有效数据数据存入到 稀疏数组
  • 稀疏数组转原始的二维数组的思路
  1. 先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组,比如上面的 chessArr2 = int [11][11]
  2. 在读取稀疏数组后几行的数据,并赋给原始的二维数组即可.
    Java-数据结构与算法分析(1)——稀疏数组与二维数组的转换_第1张图片

四、代码实现

package com.xyb.first.sparsearray;

public class SparseArray {
    public static void main(String[] args) {
        //创建一个原始的二维数组11*11
        //0:表示没有棋子,1表示黑子,2表示白子
        int chessArr1[][]=new int[11][11];
        chessArr1[1][2]=1;
        chessArr1[2][3]=2;
        chessArr1[5][8]=1;
        //输出原始数二维组
        for(int[] row:chessArr1){
            for(int data:row){
                System.out.print(data+" ");
            }
            System.out.println();
        }
        //将二维数组转为稀疏数组
        //1、先遍历二维数组得到非0数据的个数
        int sum=0;
        for(int i=0;i<11;i++){
            for(int j=0;j<11;j++){
                if(chessArr1[i][j]!=0){
                    sum++;
                }
            }
        }
        //2、创建对应的稀疏数组
        int sparArr[][]=new int[sum+1][3];
        //给稀疏数组赋值
        sparArr[0][0]=11;
        sparArr[0][1]=11;
        sparArr[0][2]=sum;
        //遍历二维数组,将非0值存到稀疏数组中
        int count=0;//count用于记录是第几个非0数据
        for(int i=0;i<11;i++){
            for(int j=0;j<11;j++){
                if(chessArr1[i][j]!=0){
                    count++;
                    sparArr[count][0]=i;
                    sparArr[count][1]=j;
                    sparArr[count][2]=chessArr1[i][j];
                }
            }
        }
        //输出稀疏数组的形式
        System.out.println();
        System.out.println("得到的稀疏数组为:");
        for(int i=0;i<sparArr.length;i++){
            System.out.printf("%d\t%d\t%d\t\n",sparArr[i][0],sparArr[i][1],sparArr[i][2]);
        }

        //将稀疏数组恢复成原始二维数组
        //1、先读取稀疏数组的第一行,根据第一行,创建原始二维数组
        int chessArr2[][]=new int[sparArr[0][0]][sparArr[0][1]];
        //读取稀疏数组后几行的数据,并福个哦二维数组即可
        for(int i=1;i<sparArr.length;i++){
            chessArr2[sparArr[i][0]][sparArr[i][1]]=sparArr[i][2];
        }
        //输出恢复后的二维数组
        System.out.println("恢复后的二维数组为:");
        for(int[] row:chessArr2){
            for(int data:row){
                System.out.print(data+" ");
            }
            System.out.println();
        }
    }
}

你可能感兴趣的:(Java-数据结构与算法分析(1)——稀疏数组与二维数组的转换)