稀疏数组 JAVA实现

稀疏数组的实现(直接上代码):

/*
使用场景:简化二维数组(棋盘上的棋子)
稀疏数组的处理方法:
1.记录数组有几行几列,有多少个不同的值
2.把具有不同的元素的行列以及值记录在一个小规模的数组中,从而缩小程序规模
 */
public class SpareArray {
    public  int[][] ordinary_to_sparsrarray(int ar[][]) {
        int sp_row = 1;//定义稀疏数组的行,1.由于稀疏数组第一行记录的是原数组的行、列和有几个不同的值
        // 2.由于现在不知道具体值,所以用下面的双for()循环确定

        /*
        使用双for()循环确定有几个不同的值
         */
        for (int i = 0; i < ar.length; i++) {
            for (int j = 0; j < ar[i].length; j++) {
                if (ar[i][j] != 0) {
                    sp_row++;
                }
            }
        }

        int SpareArray[][] = new int[sp_row][3];//创建系数数组
        SpareArray[0][0] = ar.length;//稀疏数组第一行记录的原数组的行数
        SpareArray[0][1] = ar[0].length;//。。。。。列数
        SpareArray[0][2] = sp_row - 1;//因为稀疏数组第一行是已知数据,所以行数比不同的数据多1;

        /*
        现在向稀疏数组中存放数据:利用双for()循环,遇到不同元素时,进行记录;
         */
        int sp_row01 = 1;//由于sp_row的值已经不是1,所以重新定义一个值
        for (int i = 0; i < ar.length; i++) {
            for (int j = 0; j < ar[i].length; j++) {
                if (ar[i][j] != 0) {
                    SpareArray[sp_row01][0] = i;
                    SpareArray[sp_row01][1] = j;
                    SpareArray[sp_row01][2] = ar[i][j];
                    sp_row01++;
                }
            }
        }
        return SpareArray;
    }
    /*
    稀疏数组转普通数组
     */
    public int [][]sparse_to_ordinary(int ar[][]){
        //因为稀疏数组第一行存储原数组的行和列信息,所以可以直接new原二维数组
        int ordinaryArr[][]=new int [ar[0][0]][ar[0][1]];
        //接下来就是给原数组赋值
        /*
        因为决定原数组特殊值的是稀疏数组,所以还是对稀疏数组的一个遍历。
        不用考虑对原数组的遍历。
        这里是要把稀疏数组遍历完全的,所以i=ar[0][2];
         */
        for(int i=1;i<=ar[0][2];i++){
            ordinaryArr[ar[i][0]][ar[i][1]]=ar[i][2];
        }
        return ordinaryArr;
    }

    public static void main(String[] args) {
        int ar[][]=new int [5][4];
        ar[1][1]=1;
        ar[2][0]=1;
        ar[2][1]=2;
        System.out.println("原数组");
        for (int i=0;i<ar.length;i++){
            for (int j=0;j<ar[j].length;j++){
                System.out.print(" "+ar[i][j]);
            }
            System.out.println();
        }
        System.out.println(".......................................");

        SpareArray spareArray =new SpareArray();
        spareArray.ordinary_to_sparsrarray(ar);
        int ar1[][]= spareArray.ordinary_to_sparsrarray(ar).clone();
        System.out.println("稀疏数组");
        for (int i=0;i<ar1.length;i++){
            for (int j=0;j<ar1[0].length;j++){
                System.out.print(" "+ar1[i][j]);
            }
            System.out.println();
        }
        System.out.println("------------------------------------");
        System.out.println("再次输出原数组!");
        int ar2[][]=spareArray.sparse_to_ordinary(ar1);
        for (int i=0;i<ar2.length;i++){
            for (int j=0;j<ar2[i].length;j++){
                System.out.print(" "+ar2[i][j]);
            }
            System.out.println();
        }

    }
}

我这里就是自己写的,运行结果:
原数组
0 0 0 0
0 1 0 0
1 2 0 0
0 0 0 0
0 0 0 0

稀疏数组
5 4 3
1 1 1
2 0 1
2 1 2

再次输出原数组!
0 0 0 0
0 1 0 0
1 2 0 0
0 0 0 0
0 0 0 0
感觉没什么问题,不过也希望大佬多多指点。。
最后:这里没有给出分析是否使用系数数组,我的一个思路是
1、先对数组的规模进行判断,如果原数组的 (行列) > (不同值个数3) 那么就可以使用稀疏数组。(不同值的个数可以通过双for()来得到)
2、接下来就是对不同值得记录了。这个我还没有好的思路,如果通过一个新的一位数组进行记录,在下标位置进行++。这样的话最好数值是连续的或者不是很大。。。其他的感觉就是用栈记录了。。。

你可能感兴趣的:(数据结构,稀疏数组,java,数据结构)