为什么要使用稀疏矩阵??

为什么要使用稀疏矩阵

(1)稀疏矩阵描述了矩阵的存储结构,能用较少的内存描述矩阵的本质
(2)当矩阵中含0的元素非常多的情况下,才适合用稀疏矩阵

稀疏矩阵的存储结构

1 2 3
0 rowCount colCount valueCount(!=0)
1 rowIndex colIndex value
2 rowIndex colIndex value

矩阵转化为稀疏矩阵的常规步骤

Step1 遍历矩阵,记录非零元素的个数count
Step2 根据count创建稀疏矩阵sparseArray=new int[cout+1][3];
Step3 将矩阵中的元素逐一存入到saprseArray中

Java代码实现

public class SparseArray {
   public static void main(String[] args) {
        //定义测试数组
        int[][] demoArry={
            {0,0,0,1},
            {2,0,0,0},
            {0,0,0,3},
            {0,0,0,4},
            {0,0,0,4}
        };
        int[][] sparseArray=ConvertToSparse(demoArry);
        printArry(sparseArray);  
        printArry(ConvertToArry(sparseArray));
   }
   /**
    * 原始数组转化为稀疏矩阵
    * @param array
    * @return
    */
   private static int[][] ConvertToSparse(int[][] array) {
       if(array.length==0){
           return null;
       }
       //遍历二维数组(有两种方式),获取总的非0个数count
       int count = 0;
       int row=0;
       int col=0;
       for (int i=0;i<array.length;i++){
           for(int j=0;j<array[i].length;j++){
               if(array[i][j]!=0){
                   count ++;
               }
               col=i;//二维数组的col
           }
           row++;//二维数组的row;
       }
       //创建稀疏矩阵,并初始化表头
       int[][] sparseArray=new int[count+1][3];
       //初始化稀疏矩阵的表头,记录原始矩阵的rows、col和不相同的非0元素的个数
       sparseArray[0][0]=row;
       sparseArray[0][1]=col;
       sparseArray[0][2]=count;
       //原始矩阵映射到稀疏矩阵
       int sum=0;//记录第几个非0元素
       for(int i=0;i<array.length;i++){
           for(int j=0;j<array[i].length;j++){
               if(array[i][j]!=0){
                   sum++;
                   sparseArray[sum][0]=i;//row
                   sparseArray[sum][1]=j;//col
                   sparseArray[sum][2]=array[i][j];//value
               }
           }
       }
       return sparseArray;
   }

   /**
    * 转化为原始矩阵
    * @param sparseArray
    * @return
    */
   private static int[][] ConvertToArry(int[][] sparseArray){
        if(sparseArray.length==0){
            return null;
        }
        //根据表头信息创建原始数组
        int[][] array=new int[sparseArray[0][0]][sparseArray[0][1]];
        for(int i=1;i<sparseArray.length;i++){
            array[sparseArray[i][0]][sparseArray[i][1]]=sparseArray[i][2];
        }
        return array;
   }

   /**
    * 打印数组内容
    * @param array
    */
   private static void printArry(int[][] array){
       for(int[] tmpArray:array){
            for(int tmp:tmpArray){
                System.out.printf("%d\t",tmp);
            }
            System.out.println("");
       }
   }
}

posted on 2020-05-30 15:24  小毅哥哥Bob  阅读(1150)  评论(0编辑  收藏  举报

导航