数据结构(一)—— 稀疏数组

数据结构 专栏收录该内容
13 篇文章 0 订阅

稀疏数组定义

稀疏数组又称为稀疏矩阵,是指矩阵中非零元素个数远远小于矩阵元素个数,且非零元素分布没有规律。设m * n的矩阵有t个非零元素,则称 σ=t/(m * n) 为矩阵的稀疏因子,通常σ<=0.05的矩阵称为稀疏矩阵。比如下面的二维数组就是稀疏数组,它是11*11的

在这里插入图片描述

这样的数据结构往往会占用大量的内存,并且大多数的元素为0就造成了内存浪费,我们需要解决这样稀疏数据结构,采用一种更加便捷高效的数据结构——稀疏矩阵非零元素三元组

稀疏矩阵非零元素三元组

由于稀疏矩阵中的零元素非常多,且分布没有规律,所以稀疏矩阵的压缩存储原则是只储存矩阵中的非零元素。我们需要储存矩阵中非零元素 的值和所在行列位置,并且要储存原始稀疏数组的大小,以及所包含的非零元素个数。一个矩阵元素的行号、列号和元素值称为元素的三元组,结构如下:

(row行号,column列号,value元素值)
稀疏矩阵非零元素三元组:
(row_sum行数,col_sum列数,val_sum非零元素个数)
(row行号,column列号,value元素值)
(row行号,column列号,value元素值)
......

因此压缩后的矩阵第一行是特殊的,用来存储原始数组的大小和元素个数,第二行开始存储每一个元素的值和位置,有n个非零元素该数组大小就是(n+1) * 3

比如上述数组压缩后的三元数组为
在这里插入图片描述

程序实现

package com.tunan.sparsearray;

public class SparseArray {

	public static void main(String[] args) {
		// 创建一个原始稀疏数组11*11
		//0:表示没有棋子  1:表示黑子  2:表示蓝子
		int chessArr1[][] = new int[11][11];
		chessArr1[1][2] = 1;
		chessArr1[2][3] = 1;
		chessArr1[5][3] = 2;
		chessArr1[2][4] = 2;
		//输出原始的稀疏数组
		System.out.println("原始的稀疏数组");
		for(int[] row : chessArr1) {
			for(int data : row) {
				System.out.printf("%d\t",data);
			}
			System.out.println();
		}
		
		//将稀疏数组转三元数组
		//1、先遍历稀疏数组 得到非0数据的个数
		int sum = 0;
		for (int i = 0; i < chessArr1.length; i++) {
			for (int j = 0; j < chessArr1.length; j++) {
				if (chessArr1[i][j] != 0) {
					sum++;
				}
			}
		}
		//System.out.println("sum= " + sum);
		
		//2、创建三元数组
		int sparseArr[][] = new int[sum+1][3];
		//给三元数组赋值
		sparseArr[0][0] = 11;
		sparseArr[0][1] = 11;
		sparseArr[0][2] = sum;
		
		//遍历稀疏数组,将非零值存放到sparseArr中
		int count = 0;//count用来记录是第几个非0数据
		for (int i = 0; i < chessArr1.length; i++) {
			for (int j = 0; j < chessArr1.length; j++) {
				if (chessArr1[i][j] != 0) {
					count++;
					sparseArr[count][0] = i;
					sparseArr[count][1] = j;
					sparseArr[count][2] = chessArr1[i][j];
				}
			}
		}
		
		//输出三元数组的形式
		System.out.println();
		System.out.println("三元数组为");
		for (int i = 0; i < sparseArr.length; i++) {
			System.out.printf("%d\t%d\t%d\t\n", sparseArr[i][0], sparseArr[i][1], sparseArr[i][2]);
		}
		System.out.println();

		//将三元数组返回成稀疏数组
		//1、先读取三元数组第一行,根据第一行数据初始化原始稀疏数组
		int chessArr2[][] = new int[sparseArr[0][0]][sparseArr[0][1]];
		
		//2、读取三元数据后几行的数据(从第二行开始),并赋给原始的稀疏数组即可
		for (int i = 1; i < sparseArr.length; i++) {
			chessArr2[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
		}
		
		System.out.println("转换回的稀疏数组");
		for(int[] row : chessArr2) {
			for(int data : row) {
				System.out.printf("%d\t",data);
			}
			System.out.println();
		}
	}

}

这里保留一个练习:
将稀疏数组和三元组保存到磁盘,并从磁盘中读出文件。
这里涉及到Java的IO流操作。

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

参与评论 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:精致技术 设计师:CSDN官方博客 返回首页

打赏作者

_Tunan

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值