数据结构第一章——稀疏数组

本文介绍了数据结构中的稀疏数组,重点讲述了当数组中大部分元素为0或相同值时,如何利用稀疏数组进行存储优化。内容包括稀疏数组的基本概念、处理方法,以及通过一个棋盘存储的例子进行了具体阐述,并提供了稀疏数组的代码实现。
摘要由CSDN通过智能技术生成

尚硅谷–数据结构笔记

数据结构是什么?

线性结构

1)线性结构作为最常用的数据结构,其特点是数据元素之间存在一对一的线性关系
2)线性结构有两种不同的存储结构,即顺序存储结构和链式存储结构。顺序存储的,线性表称为顺序表,顺序表中的存储元素是连续的(这里指的是内存地址是连续的)
3)链式存储的线性表称为链表,链表中的存储元素不一定是连续的,元素节点中存,放数据元素以及相邻元素的地址信息
4)线性结构常见的有:数组、队列、链表和栈

非线性结构

非线性结构包括:二维数组,多维数组,广义表,树结构,图结构(比较常见)

第一章:稀疏数组
基本介绍

1、当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。
2、稀疏数组的处理方法是:
1)记录数组一共有几行几列,有多少个不同的值
2)把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模

例子:棋盘存储成稀疏数组

在这里插入图片描述
问题描述:棋盘上黑棋子对应1,蓝色棋子对应2,没有棋子的为0。
稀疏数组存储方式:
在这里插入图片描述
第一行存储的值是原数组的行、列和多少个不为0的值。

稀疏数组代码实现
package datastructures;

public class SparseArry {

	public static void main(String[] args) {
		//创建一个二维数组
		int[][] sparse = new int[10][9]; 
		sparse[1][2] = 1;
		sparse[2][3] = 2;
		sparse[3][4] = 1;
		sparse[1][5] = 1;
		int count = 0;//记录不为0个数,用作稀疏数组行数。
		//遍历二维数组 找出要存的值(即不为0的值)
		for (int i = 0; i < sparse.length; i++) {
			for (int j = 0; j < sparse[i].length; j++) {
				if(sparse[i][j] != 0) {
					count++;
				}
			}
		}
		//1、创建一个稀疏数组,2、把二维数组存入稀疏数组  
		int[][] sparseArry = new int[count+1][3];//count+1:因为稀疏数组第一行用于记录原始二维数组的行数和每行个数以及不为0的个数 row col val
		sparseArry[0][0] = sparse.length;//数组行数
		sparseArry[0][1] = sparse[0].length;//数组个数
		sparseArry[0][2] = count;//要存的个数
		
		//存入稀疏数组 
		int spIndex = 1;//用来做稀疏数组的下标
		for (int i = 0; i < sparse.length; i++) {
			for (int j = 0; j < sparse[i].length; j++) {
				if(sparse[i][j] != 0) {
					sparseArry[spIndex][0] = i;//拿到行号
					sparseArry[spIndex][1] = j;//拿到第几个
					sparseArry[spIndex][2] = sparse[i][j];//把值存入稀疏数组
					spIndex++;
				}
			}
		}
		//遍历稀疏数组
		System.out.println("遍历稀疏数组开始-----------");
		for (int i = 0; i < sparseArry.length; i++) {
			System.out.print(sparseArry[i][0]+"\t");
			System.out.print(sparseArry[i][1]+"\t");
			System.out.print(sparseArry[i][2]+"\t");
			System.out.println();
		}
		System.out.println();
		
		//还原成棋盘(原始二维数组)
		int[][] reset = new int[sparseArry[0][0]][sparseArry[0][1]];//用稀疏数组中存的行数和个数还原二维数组
		for (int i = 1; i < sparseArry.length; i++) {
			reset[sparseArry[i][0]][sparseArry[i][1]] = sparseArry[i][2];
		}
		
		System.out.println("还原成原始二维数组-----------");
		for (int i = 0; i < reset.length; i++) {
			for (int j = 0; j < reset[i].length; j++) {
				System.out.print(reset[i][j]+"\t");
			}
			System.out.println();
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值