数据结构-稀疏数组

应用场景

数组中大部分的值都为同一个值。

处理方式

1)第一行记录数组中行数,列数,不同值的数值个数。
2)记录下每个不同值的行列值。

示例

基本的稀疏矩阵:

import java.util.ArrayList;
import java.util.Random;

public class SparseArraysText {
    public static void main(String[] args) {
        //随机生成矩阵的行列
        Random rd = new Random();
        int row=0,column=0,sum=0;//行,列,总数
        while (row == 0){
            row = rd.nextInt(18);
        }
        column = row;
        System.out.println("随机生成:" + row + "行," + column + "列");
        int[][] arr = new int[row][column];//创建矩阵
        sum = row*column;//计算矩阵元素总数
        int pieceNum = 0;//矩阵中的非0数的个数
        while (pieceNum == 0){
            pieceNum = rd.nextInt((int)Math.floor(Math.sqrt(sum))-1);
        }
        System.out.println("棋牌中共有:"+pieceNum+"个棋子。");
        //棋子所在的坐标
        ArrayList<Integer> rowCoordinateList = new ArrayList();//行坐标
        ArrayList<Integer> columnCoordinateList = new ArrayList();//列坐标
        for (int i = 0; i < pieceNum; i++) {
            boolean repeat = true;
            int rowCoordinate=0,columnCoordinate=0;
            rowCoordinate = rd.nextInt(row);//随机行坐标
            columnCoordinate = rd.nextInt(column);//随机列坐标
            while (arr[rowCoordinate][columnCoordinate] != 0){
                rowCoordinate = rd.nextInt(row);//随机行坐标
                columnCoordinate = rd.nextInt(column);//随机列坐标
            }
            arr[rowCoordinate][columnCoordinate] = rd.nextInt(2)+1;
            rowCoordinateList.add(rowCoordinate);//随机行坐标填入集合
            columnCoordinateList.add(columnCoordinate);//随机列坐标填入集合
        }
        //打印
        for (int[] ints : arr) {
            for (int anInt : ints) {
                System.out.printf("%d\t",anInt);
            }
            System.out.println();
        }
        //生成稀疏矩阵
        int [][] sparseArrays = new int[pieceNum+1][3];
        sparseArrays[0][0] = row;//行数
        sparseArrays[0][1] = column;//列数
        sparseArrays[0][2] = pieceNum;//棋子总数
        //正常的获取稀疏矩阵中的棋子的位置以及元素
        int count = 1;
        for (int i = 0; i < row; i++) {
            for (int j = 0; j < column; j++) {
                if (arr[i][j] != 0){
                    sparseArrays[count][0] = i;
                    sparseArrays[count][1] = j;
                    sparseArrays[count][2] = arr[i][j];
                    count++;
                }
            }
        }
        //打印稀疏矩阵
        System.out.println("构造的稀疏矩阵如下:");
        for (int[] sparseArray : sparseArrays) {
            for (int i : sparseArray) {
                System.out.printf("%d\t",i);
            }
            System.out.println();
        }
        //根据稀疏矩阵还原数组
        row = sparseArrays[0][0];
        column = sparseArrays[0][1];
        int[][] reductionArrays = new int[row][column];//得到行列构造矩阵
        for (int i = 1; i < sparseArrays[0][2]+1; i++) {
            reductionArrays[sparseArrays[i][0]][sparseArrays[i][1]] = sparseArrays[i][2];//放入棋子
        }
        System.out.println("还原后的稀疏矩阵:");
        for (int i = 0; i < row; i++) {
            for (int j = 0; j < column; j++) {
                System.out.printf("%d\t",reductionArrays[i][j]);
            }
            System.out.println();
        }
    }
}

这个只是示例,稀疏矩阵是生成的,因此在之前就已经有记录棋子的位置,但一般来说,棋子的位置是不知道的,因此需要遍历整个棋牌获得。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值