zoukankan      html  css  js  c++  java
  • 稀疏数组

    稀疏数组的应用场景:当二维数组中有大量重复数字(以0为例)时,可以用稀疏数组进行保存,节省保存空间。

    稀疏数组有三列n行

    第一行用来记录原二维数组信息,第一列用来记录原二维数组的行数,第二列用来记录二维数组的列数,第三列用来记录二维数组中非0个数。

    其他行用来记录非0元素的信息,第一列记录其在原二维数组中的行标,第二列记录列标,第三列用来记录其具体的值。

    可见稀疏数组的行数 n=二维数组非0元素的个数+1;

    代码练习:

    public class SparseArray {
        public static void main(String[] args) {
    
            //稀疏数组棋牌案例(0表示空格,1表示黑子,2表示白子)
    
            //创建一个原始棋牌
            int chesArr[][]= new int[11][11];
            chesArr[2][3] = 2;
            chesArr[5][6] = 1;
    
            int sum=0;//用来记录非0的个数
            for(int i=0;i<chesArr.length;i++){
                for(int j=0;j<chesArr[i].length;j++){
                    if(chesArr[i][j] !=0)
                        sum++;
                }
            }
    
            int[][] sparseArray = new int[sum+1][3];
            //第一行用来记录原二维数组的行和列,剩余的行用来记录非0数据的位置和值
            sparseArray[0][0] = 11;
            sparseArray[0][1] = 11;
            sparseArray[0][2] = sum;
    
            int count=1;
            for(int i=0;i<chesArr.length;i++){
                for(int j=0;j<chesArr[i].length;j++){
                    if(chesArr[i][j] !=0){
                        sparseArray[count][0]=i;//第一行用来记录元二维数组的非0数据的行
                        sparseArray[count][1]=j;//第二行用来记录元二维数组的非0数据的列
                        sparseArray[count][2] = chesArr[i][j];//第三行用来记录元二维数组的非0数据的值
                        count++;
                    }
                }
            }
    
            //还原数组
            int[][] chesArr2 = new int[sparseArray[0][0]][sparseArray[0][1]];
            for(int i=1;i<sparseArray.length;i++){
                int row=sparseArray[i][0];
                int line=sparseArray[i][1];
                chesArr2[row][line]=sparseArray[i][2];
            }
    
            //遍历
            for(int[] row : chesArr2){
                for(int data : row){
                    System.out.print(" "+data);
                }
                System.out.println();
            }
        }
    
    }
  • 相关阅读:
    一个貌似比较吊的递归转换为loop--总算成功了.
    为何反转迭代顺序就不会栈溢出了?
    将树形递归转换为loop
    递归和迭代之间的转换简单例子
    非线性递归函数转化为迭代函数举例
    将尾递归函数转换为迭代函数的利器
    转:LINUX/UNIX下的回车换行与WINDOWS下的区别
    property干嘛的
    eval和列表解析的一处陷阱
    剑指offer——16二进制中1的个数
  • 原文地址:https://www.cnblogs.com/susexuexi011/p/14049813.html
Copyright © 2011-2022 走看看