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


    为什么要使用稀疏矩阵

    (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	",tmp);
                }
                System.out.println("");
           }
       }
    }
    
  • 相关阅读:
    Windows Phone 一步一步从入门到精通
    备忘录模式(Memento)
    开放封闭原则(OCP)
    建造者模式(Bulider)
    原型模式(Prototype)
    Windows Workflow Foundation(WF) 一步一步从入门到精通
    模板方法模式
    代理模式(Proxy)
    装饰模式(Decorator)
    迪米特法则(LoD)最少知识原则
  • 原文地址:https://www.cnblogs.com/Thinker-Bob/p/12992854.html
Copyright © 2020-2023  润新知