算法与数据结构从零开始学习
数据结构
数据结构包括:线性结构和非线性结构
线性结构
1)线性结构特点是数据元素之间存在的一对一的线性关系。
2)线性结构有两种存储结构:顺序存储、链式存储。顺序存储称为顺序表。主要是存储的地址是连续的。
3)链式存储被称为链表,存储元素的地址不一定是连续的,元素节点中存储着数据元素以及相邻元素的地址信息。
4)线性结构常见的有:数组,队列,链表和栈
非线性结构
非线性结构包括:二位数组、多维数组,广义表,树结构,图结构。
稀疏数组和队列:
稀疏数组的需求:编写的五子棋中,有存盘的功能。在一个数组中有很多没有用的数据,例如零。就可以选择稀疏数组对原数组进行压缩。
基本介绍:
当一个数组中大部分元素为0,或者为同一个值的数组的时,可以使用稀疏数组来保存该数组。
稀疏数组的处理方法是:
1)记录数据一共有几行几列,有多少个不同的值
2)把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模
整体思路分析
二维数组转稀疏数组
1、遍历原始的二维数组,得到有效数据的个数sum
2、根据sum就可以创建稀疏数组sparseArr int [sum+1][3]
3、将二维数组的有效数据存入到稀疏数组
稀疏数组转原始的二维数组的思路
1、先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组,比如上面的chessArr2 = int[11][11]
2、在读取稀疏数组后几行的数据并赋给原始的二维数组即可。
上代码:
package com.cqupt.sparsearray; import java.util.TreeSet; public class SparseArray { public static void main(String[] args) { int chessArr [][] = new int[11][11]; chessArr[1][2] = 1; chessArr[2][3] = 2; chessArr[4][5] = 2; for (int []row:chessArr){ for(int i :row){ System.out.printf("%d\t",i); } System.out.println(); } int sum = 0; for(int i = 0;i<11;i++){ for(int j = 0;j<11;j++){ if(chessArr[i][j]!=0){ sum++; } } } System.out.println(sum); int [][] sparseArr = new int[sum + 1][3]; sparseArr[0][0] = 11; sparseArr[0][1] = 11; sparseArr[0][2] = sum; int count = 1; for(int i = 0;i<11;i++){ for(int j = 0;j<11;j++){ if(chessArr[i][j]!=0){ sparseArr[count][0] = i; sparseArr[count][1] = j; sparseArr[count][2] = chessArr[i][j]; count++; } } } for(int i = 0 ;i<sum+1;i++){ for(int j = 0 ;j<3;j++){ System.out.printf("%d\t",sparseArr[i][j]); } System.out.println(); } System.out.println(sparseArr.length); int chessArr2[][] = new int[sparseArr[0][0]][sparseArr[0][1]]; for(int i = 1;i<sum+1;i++){ chessArr2[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2]; } for(int i = 0 ;i<11;i++){ for(int j = 0;j<11;j++){ System.out.printf("%d\t",chessArr2[i][j]); } System.out.println(); } } }
队列

浙公网安备 33010602011771号