Java数据结构与算法——01 数据结构概述与稀疏数组实现
2020-01-15 11:37
1281 查看
数据结构概述
数据结构包括线性结构与非线性结构。
线性结构的两种不同的存储结构:顺序存储结构(数组)和链式存储结构(链表)。
顺序存储的线性表为顺序表,即存储地址连续。
链式存储的线性表成为链表,存储地址不一定连续,元素节点中存放该节点数据以及相邻的节点存储地址。
线性结构常见的有:数组、链表、队列、栈
非线性结构:二维数组、多维数组、广义表、树结构、图结构
稀疏数组
如果一个原有数组中大部分是相同的元素,那么在存储时将相同的元素去掉形成一个新的特定的数组,并且新数组可以还原成原有数组,以此减少存储空间,这个新的特定数组就是稀疏数组。
下图是原始数组与稀疏数组的转换过程:
下面是java带吗对原始数组转换成稀疏数组存储在磁盘中,及从磁盘中读取稀疏数组转换为原始数组的功能:
import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; public class SparseArrayTransform { //将稀疏数组写入文件 public void saveArray(int[][] sparsearray) { try { FileWriter output = new FileWriter(new File("D:\\a.txt")); for (int i = 0; i < sparsearray.length; i++) { for (int j = 0; j < sparsearray[i].length; j++) { output.write(sparsearray[i][j] + "\t"); } output.write("\t\n"); } output.close(); } catch (IOException e) { e.printStackTrace(); } } //将稀疏数组读取出来 public int[][] readArrayFromFile(File f) { int[][] array; try { BufferedReader br = new BufferedReader(new FileReader(f)); String line = br.readLine(); String[] temp = line.split("\t"); array = new int[Integer.valueOf(temp[0])][Integer.valueOf(temp[1])]; while (null != (line = br.readLine())) { String[] t = line.split("\t"); int row = Integer.valueOf(t[0]); int col = Integer.valueOf(t[1]); array[row][col] = Integer.valueOf(t[2]); } return array; } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return null; } public int[][] changeToSparseArray(int[][] originalArray) { int num = 0; String s = ""; //先将数字个数以及每个数字位置与值记录下来到String中 for (int i = 0; i < originalArray.length; i++) { for (int j = 0; j < originalArray[i].length; j++) { if (originalArray[i][j] != 0) { s = s + i + "\t" + j + "\t" + originalArray[i][j] + ";"; num++; } } } //根据数字个数创建稀疏数组,稀疏数组列是3,分别代表数字的行列值(第一列除外) String[] array = s.split(";"); int[][] sparseArray = new int[array.length + 1][3]; int count = 0; sparseArray[0][0] = originalArray.length; sparseArray[0][1] = originalArray[0].length; sparseArray[0][2] = num; for (String v : array) { count++; String[] temp = v.split("\t"); int row = Integer.valueOf(temp[0]); int col = Integer.valueOf(temp[1]); int value = Integer.valueOf(temp[2]); sparseArray[count][0] = row; sparseArray[count][1] = col; sparseArray[count][2] = value; } return sparseArray; } public int[][] changeToOriginalArray(int[][] sparseArray) { //稀疏数组还原,按第一排数据创建数组,然后把数字按位置改好 int row = sparseArray[0][0]; int col = sparseArray[0][1]; int[][] originalArray = new int[row][col]; for (int i = 1; i < sparseArray.length; i++) { int r = Integer.valueOf(sparseArray[i][0]); int c = Integer.valueOf(sparseArray[i][1]); int v = Integer.valueOf(sparseArray[i][2]); originalArray[r][c] = v; } return originalArray; } public void printArray(int[][] array) { for (int[] a : array) { for (int s : a) { System.out.print(s + " "); } System.out.println(); } } public static void main(String[] args) { SparseArrayTransform satf = new SparseArrayTransform(); int[][] originalArray = new int[6][6]; originalArray[1][1] = 1; originalArray[2][3] = 3; originalArray[4][5] = 8; System.out.println("原始数组:"); satf.printArray(originalArray); int[][] sparseArray = satf.changeToSparseArray(originalArray); System.out.println("稀疏数组:"); satf.printArray(sparseArray); satf.saveArray(sparseArray); originalArray = satf.readArrayFromFile(new File("D:\\a.txt")); System.out.println("还原后的数组:"); satf.printArray(originalArray); } }
运行结果:
- 点赞
- 收藏
- 分享
- 文章举报
相关文章推荐
- 【数据结构与算法】数组应用3:稀疏矩阵压缩(Java实现)
- 数据结构之动态数组Java实现
- 数据结构之数组和字符串的反转java实现
- 【数据结构与算法】数组应用3:稀疏矩阵压缩(Java实现)
- 数据结构----数组(java实现代码)
- 数据结构——栈的java实现(一)-使用顺序存储结构(数组)以及实现
- 数据结构之数组的增删改查-java实现
- 数据结构与算法之java语言实现(一):稀疏数组
- 【数据结构与算法】数组应用2:矩阵转置(Java实现)
- 数据结构——队列的java实现(一)-使用顺序存储结构(数组)以及实现
- 【数据结构与算法】数组应用1:矩阵乘法(Java实现)
- java动态数组实现(泛型)------数据结构
- 数据结构之数组16定义及实现
- 【数据结构与算法基础】以数组实现的循环队列 / Circular Queue implemented by array
- 数据结构与算法学习笔记——链表部分实现(数组形式)
- java 二叉树 实现 数据结构 笔试
- 数据结构:用数组实现的定容队列
- JAVA数据结构与算法-第二章-数组
- 数据结构之优先队列--二叉堆(Java实现)
- Java之数据结构基础、线性表、栈和队列、数组和字符串,树—学习笔记