Java数据结构与算法_02_稀疏数组和队列

稀疏数组和队列

当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。
稀疏数组的处理方法是:

  1. 记录数组一共有几行几列,有多少个不同的值
  2. 把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模

稀疏数组:
第一行:记录了原始数组的大小,一共有多少行多少列吗,有效数据的个数。
第二行及以后:记录了各个非0数据的位置坐标。

代码:

package org.example;

public class d01 {
    public static void main(String[] args) {
        // 创建数组
        int[][] intArrays = getIntArrays(11, 11);
        // 设置棋子
        intArrays = setValue(1, 2, 1, intArrays);
        intArrays = setValue(2, 4, 2, intArrays);
        // 查看数组
        selectArray(intArrays);
        // 转为稀疏数组
        int[][] tosparsearray = tosparsearray(intArrays);
        //
        System.out.println();
        System.out.println();
        System.out.println();
        System.out.println();
        // 查看稀疏数组
        selectArray(tosparsearray);
        // 恢复二维数组
        int[][] intArrays1 = toIntArrays(tosparsearray);
        selectArray(intArrays1);


    }


    /**
     * 获取一个长度为x,内部长度为y的二维数组
     *
     * @param x
     * @param y
     * @return
     */
    public static int[][] getIntArrays(int x, int y) {
        int[][] ints = new int[x][];
        for (int i = 0; i < ints.length; i++) {
            ints[i] = new int[y];
        }
        return ints;
    }

    /**
     * 根据传入的坐标写入数据
     */
    public static int[][] setValue(int x, int y, int value, int[][] arrays) {
        arrays[x][y] = value;
        return arrays;
    }

    /**
     * 查看数组
     *
     * @param array
     */
    public static void selectArray(int[][] array) {
        for (int[] ints : array) {
            for (int anInt : ints) {
                System.out.print(anInt + "\t");
            }
            System.out.println();

        }
    }


    /**
     * 转为稀疏数组
     *
     * @param intArrays
     * @return
     */
    public static int[][] tosparsearray(int[][] intArrays) {

        // 设置第一行数据
        int[] ints = new int[3];
        ints[0] = intArrays.length;
        ints[1] = intArrays[0].length;
        ints[2] = getsum(intArrays);

        // 设置返回结果集
        int[][] ints1 = new int[ints[2] + 1][];
        ints1[0] = ints;


        // 设置后面的数据
        int f = 0;
        for (int x = 0, intArraysLength = intArrays.length; x < intArraysLength; x++) {
            int[] intArray = intArrays[x];
            for (int y = 0, intArrayLength = intArray.length; y < intArrayLength; y++) {
                int i = intArray[y];
                if (i != 0) {
                    f++;
                    int[] ints2 = new int[3];
                    ints2[0] = x;
                    ints2[1] = y;
                    ints2[2] = i;
                    ints1[f] = ints2;
                    System.out.println("(" + x + "," + y + ")");
                }
            }
        }

        return ints1;
    }


    /**
     * 查询数组中有效数据的个数。
     *
     * @param intArrays
     * @return
     */
    public static int getsum(int[][] intArrays) {
        int sum = 0;
        for (int x = 0, intArraysLength = intArrays.length; x < intArraysLength; x++) {
            int[] intArray = intArrays[x];
            for (int y = 0, intArrayLength = intArray.length; y < intArrayLength; y++) {
                int i = intArray[y];
                if (i != 0) {
                    sum++;
                }
            }
        }
        return sum;
    }


    /**
     * 恢复二维数组
     *
     * @param arrays
     * @return
     */
    public static int[][] toIntArrays(int[][] arrays) {
        int[][] intArrays = getIntArrays(arrays[0][0], arrays[0][1]);
        for (int i = 1; i <= arrays[0][2]; i++) {
            setValue(arrays[i][0], arrays[i][1], arrays[i][2], intArrays);
        }
        return intArrays;
    }

}

输出结果:

0	0	0	0	0	0	0	0	0	0	0	
0	0	1	0	0	0	0	0	0	0	0	
0	0	0	0	2	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0	
(1,2)
(2,4)




11	11	2	
1	2	1	
2	4	2	
0	0	0	0	0	0	0	0	0	0	0	
0	0	1	0	0	0	0	0	0	0	0	
0	0	0	0	2	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0	
0	0	0	0	0	0	0	0	0	0	0	

进程已结束,退出代码0

PS:

  1. 该笔记为网络课程笔记,课程地址:https://www.bilibili.com/video/BV1E4411H73v/?spm_id_from=333.337.search-card.all.click
  2. 如有疑问或有错误之处,欢迎讨论指正;
posted @ 2023-12-05 17:05  20231012  阅读(10)  评论(0)    收藏  举报