爲何要使用稀疏矩陣??

爲何要使用稀疏矩陣

(1)稀疏矩陣描述了矩陣的存儲結構,能用較少的內存描述矩陣的本質
(2)當矩陣中含0的元素很是多的狀況下,才適合用稀疏矩陣java

稀疏矩陣的存儲結構

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("");
       }
   }
}
相關文章
相關標籤/搜索