稀疏数组-数据结构-压缩算法

概述:

  当一个数组中大部份元素为0,或者为同一值的数组时,可以使用稀疏数组来保存该数组。

处理方式:

  记录数组一共有几行几列,有多少不同值

  把具有不同值的元素和行列及值记录在一个小规模的数组中,从而缩小程序规模

 

复制代码
public class main {

    //棋盘方式
    public static void main(String []args) {
        //创建一个二维数组11*11,规定:0:没有棋子,1:黑棋,2:白棋
        int [][]arr=new int [11][11];//创建一个行11列11的数组
        arr[1][2]=1;
        arr[2][3]=2;
        System.out.println("输出原始数组");
        for(int[] ip:arr){//因为打印的是二维数组所以要有两次的for循环
            for(int a:ip){
                System.out.print(a+"\t");
            }
            System.out.println();
        }


        //转换为稀疏数组保存:怎么样遍历有效值 创建一个稀疏数组保存方式
        //获取有效值的个数
        int sum=0;
        for(int i=0;i<11;i++){
            for(int j=0;j<11;j++){
                if(arr[i][j]!=0){
                    sum++;
                }
            }

        }
        System.out.println("有效值个数:"+sum);

        //2.创建一个稀疏数组
        int [][]arr2=new int [sum+1][3];//根据有效个数+1就是他的行数(因为计算有效个数的时候,标题列,他是不会计算的所以他要+1,把标题行算进去),固定列为3列,因为无论有多少个数,我们都只需要行、列、值,这三个数据就可以了
        //打印稀疏数组的头部,图可以看上面的,坐标0就是头部
        arr2[0][0]=11;//存了多少行
        arr2[0][1]=11;//存了多少列
        arr2[0][2]=sum;//存了多少个有效值
        //遍历二维数组,将非0的值,存放稀疏数组中
        int count=0;//总共有多少个数,这个数值可以当做行
        for(int i=0;i<arr.length;i++){//原来的数组
            for(int j=0;j<arr[i].length;j++){//arr[i].length:arr数组中,每个i的值的length是多少
                if(arr[i][j]!=0){//遍历数组后,获取数组值,然后判断,如果获取到的值不等于0,那我们就把值存到稀疏数组中
                    count++;//计算不相同的数
                    arr2[count][0]=i;//count的第一个数出来后,他们里面的第0个值,就存放横坐标
                    arr2[count][1]=j;//他们里面的第1个值,就存放纵坐标
                    arr2[count][2]=arr[i][j];//他们里面的第2个值,就存放他的值
                }
            }

        }
        //输出稀疏数组
        System.out.println("输出稀疏数组");

        for(int i=0;i<arr2.length;i++){
            System.out.print(arr2[i][0]+"\t"+arr2[i][1]+"\t"+arr2[i][2]+"\t");//因为他只有0,1,2列
            System.out.println(""+arr2[i][0]+""+"\t"+""+arr2[i][1]+""+"\t"+"值:"+arr2[i][2]+"\t");//因为他只有0,1,2列

        }
        System.out.println("还原稀疏数组");
        //1.读取稀疏数组的值
        int [][]arr3=new int [arr2[0][0]][arr2[0][1]];//[arr2[0][0]]:行,[arr2[0][1]]列
        //2.给其中的元素还原值
        for(int i=1;i<arr2.length;i++){
            //把arr2的值放在新数组里
            arr3[arr2[i][0]][arr2[i][1]]=arr2[i][2];//通过行列的坐标把arr2对应的值赋值给arr3,arr3通过arr2[i][0]坐标  arr2[i][1]坐标,获取到arr2[i][0]  arr2[i][1]元素的值

        }
        //3.打印还原后的数组
        System.out.println("输出原始数组");
        for(int[] ip:arr3){//因为打印的是二维数组所以要有两次的for循环
            for(int a:ip){
                System.out.print(a+"\t");
            }
            System.out.println();
        }
    }

}
复制代码

 

posted @   hollg  阅读(127)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
点击右上角即可分享
微信分享提示