一、数据结构与算法
1、数据结构与算法关系
数据结构是对计算机内存中数据的一种安排,包括数组、链表、栈、二叉树、哈希表等等。算法是对这些结构中的数据进行各种处理。例如,查找一条特殊的数据项或对数据进行排序。
2、线性结构和非线性结构
1、线性结构
- 线性结构,特点是数据元素之间存在一对一的线性关系
- 线性结构有两种不同的存储结构,即顺序存储结构和链式存储结构
- 顺序存储的线性表称为顺序表,顺序表中的存储元素是连续的
- 链式存储的线性表称为链表,链表中的存储元素不一定是连续的
- 线性结构常见的有:数组、队列、链表、栈
2、非线性结构
- 非线性结构常见的有:二维数组、多维数组、广义表、树结构、图结构
二、稀疏数组
1、何时使用
当一个数组中大部分元素相同或为0,则可以使用稀疏数组来保存该数组。
2、怎样使用
(1)第一行记录数组共有几行几列,有多少个不同的值
(2)第二行及以后记录不同值在原数组中的行、列及值,从而缩小程序的规模
3、整体思路
二维数组===>稀疏数组===>存入文件
- 第一步:遍历二维数组,得到有效的数据个数sum
- 第二步:根据sum创建稀疏数组
sparseArray[sum+1][3] - 第三步:将二维数组的有效数据存入稀疏数组
- 第四步:将稀疏数组中的数据存入文件
读取文件===>稀疏数组===>二维数组
- 第一步:读取文件,并创建稀疏数组
- 第二步:将文件数据写入稀疏数组
- 第三步:根据稀疏数组首行数据,创建二维数组
- 第四步:根据稀疏数组中的数据,还原二维数组
4、代码实现(以棋盘为例)
public class Demo03_SparseArrayFile {
public static void main(String[] args) {
try {
method1();
method2();
} catch (IOException e) {
e.printStackTrace();
}
}
private static void method1() throws IOException {
int[][] chessArray = new int[11][11];
chessArray[1][1] = 1;
chessArray[2][3] = 2;
chessArray[2][1] = 1;
System.out.println("=====二维数组=====");
for (int i = 0; i < chessArray.length; i++) {
for (int j = 0; j < chessArray[i].length; j++) {
System.out.printf("%d\t",chessArray[i][j]);
}
System.out.println();
}
int sum = 0;
for (int[] chessArr : chessArray) {
for (int chess : chessArr) {
if (chess != 0){
sum++;
}
}
}
int[][] sparseArray = new int[sum+1][3];
sparseArray[0][0] = chessArray.length;
sparseArray[0][1] = chessArray[0].length;
sparseArray[0][2] = sum;
int count = 0;
for (int row = 0; row < chessArray.length; row++) {
for (int col = 0; col < chessArray[row].length; col++) {
if (chessArray[row][col] != 0){
count++;
sparseArray[count][0] = row;
sparseArray[count][1] = col;
sparseArray[count][2] = chessArray[row][col];
}
}
}
System.out.println("=====稀疏数组=====");
for (int i = 0; i < sparseArray.length; i++) {
for (int j = 0; j < sparseArray[i].length; j++) {
System.out.printf("%d\t",sparseArray[i][j]);
}
System.out.println();
}
File file = new File("map.data");
BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(file));
for (int[] row : sparseArray) {
for (int data : row) {
bufferedWriter.write(data + "\t");
}
bufferedWriter.newLine();
}
bufferedWriter.close();
}
private static void method2() throws IOException {
File file = new File("map.data");
List<String> list = new ArrayList<>();
String line;
BufferedReader reader = null;
if (file.exists()){
reader = new BufferedReader(new FileReader(file));
while ((line = reader.readLine()) != null){
list.add(line.trim());
}
}
int[][] sparseArray = new int[0][];
if (list.size() > 0 && list != null ){
String[] fistLine = list.get(0).split("\t");
int row = list.size();
int col = fistLine.length;
sparseArray = new int[row][col];
for (int i = 0; i < list.size(); i++) {
String[] oneLine = list.get(i).split("\t");
for (int j = 0; j < oneLine.length; j++) {
sparseArray[i][j] = Integer.parseInt(oneLine[j]);
}
}
}
System.out.println("=====稀疏数组=====");
for (int[] row : sparseArray) {
for (int data : row) {
System.out.printf("%d\t",data);
}
System.out.println();
}
int[][] chessArray = new int[sparseArray[0][0]][sparseArray[0][1]];
for (int row = 1; row < sparseArray.length; row++) {
chessArray[sparseArray[row][0]][sparseArray[row][1]] = sparseArray[row][2];
}
System.out.println("=====二维数组=====");
for (int[] row : chessArray) {
for (int data : row) {
System.out.printf("%d\t",data);
}
System.out.println();
}
reader.close();
}
}
声明:如有文章侵权,请及时联系本人,以便后续及时作出修改。
|