(一)Java数据结构之稀疏数组

简介: 稀疏数组(sparse array)是一种只为数组中的非零元素分配内存的特殊类型数组,分为三列:1.行下标2.列下标3.值第一行为总行数、总列数、值的个数,其他行存储了非零元素的下标和值。

稀疏数组(sparse array)是一种只为数组中的非零元素分配内存的特殊类型数组,分为三列:

1.行下标

2.列下标

3.值

第一行为总行数、总列数、值的个数,其他行存储了非零元素的下标和值。

2020100521002613.png


根据上图我们可以写出如下代码实现稀疏数组:

package top.baikunlong.sparsearray;
import java.io.*;
/**
 * @author baikunlong
 * @date 2020/10/5 20:38
 * @apiNote
 */
public class SparseArray {
    public static void main(String[] args) {
        //创建原数组
        int[][] originArray = new int[11][11];
        //赋值
        originArray[1][2] = 1;
        originArray[2][3] = 2;
        int length = originArray.length;
        System.out.println("原数组:");
        //打印一下原数组并得到原数组有效的个数
        int count = 0;
        for (int i = 0; i < length; i++) {
            for (int j = 0; j < length; j++) {
                System.out.print(originArray[i][j] + "  ");
                if (originArray[i][j] != 0) {
                    count++;
                }
            }
            System.out.println();
        }
        System.out.println("有效值个数:" + count);
        //创建稀疏数组,因为第一行是用来存 行列数 和 值个数(文件读取恢复稀疏数组时会用到这个数) 的,所以要多一行
        int[][] sparseArray = new int[count + 1][3];
        sparseArray[0][0] = length;
        sparseArray[0][1] = length;
        sparseArray[0][2] = count;
        //给稀疏数组赋值,把原数组里非零的值存起来
        int rowIndex=1;//这里需要一个行下标记录下当前存储第几行,第一行已经存了行列数和值个数,所以从第二行开始存
        for (int i = 0; i < length; i++) {
            for (int j = 0; j < length; j++) {
                if (originArray[i][j] != 0) {
                    sparseArray[rowIndex][0]=i;
                    sparseArray[rowIndex][1]=j;
                    sparseArray[rowIndex][2]=originArray[i][j];
                    rowIndex++;
                }
            }
        }
        System.out.println("稀疏数组:");
        for (int i = 0; i < sparseArray.length; i++) {
            for (int j = 0; j < sparseArray.length; j++) {
                System.out.print(sparseArray[i][j]+"  ");
            }
            System.out.println();
        }
        //把稀疏矩阵存入文件SparseArray.data
        final String fileName = "SparseArray.data";
        File file = new File(fileName);
        try(FileOutputStream out = new FileOutputStream(file)) {
            int i = 0;
            for (; i < sparseArray.length-1; i++) {
                out.write((sparseArray[i][0]+"  "+sparseArray[i][1]+"  "+sparseArray[i][2]+"\n").getBytes());
            }
            //最后行不用回车
            out.write((sparseArray[i][0]+"  "+sparseArray[i][1]+"  "+sparseArray[i][0]).getBytes());
        } catch (IOException e) {
            e.printStackTrace();
        }
        //==========================================================
        //到这里我们已经把原数组进行了压缩,使用稀疏数组进行存储,现在要开始读出来,并恢复成原数组
        try(BufferedReader reader = new BufferedReader(new FileReader(fileName))) {
            //读取第一行,用于创建稀疏数组
            String s = reader.readLine();
            String[] strings = s.split("  ");
            //注意,这里创建大小用到了第一行第三列那个 值个数 这个值,它加一就是行数了,列数固定还是三
            int[][] sparseArrayFromFile = new int[Integer.parseInt(strings[2])+1][3];
            //赋值第一行的数据,包含了行列式数和值个数
            sparseArrayFromFile[0][0]=Integer.parseInt(strings[0]);
            sparseArrayFromFile[0][1]=Integer.parseInt(strings[1]);
            sparseArrayFromFile[0][2]=Integer.parseInt(strings[2]);
            //开始读取下面的下标和值
            rowIndex=1;//行下标
            while ((s=reader.readLine())!=null){
                strings = s.split("  ");
                sparseArrayFromFile[rowIndex][0]=Integer.parseInt(strings[0]);
                sparseArrayFromFile[rowIndex][1]=Integer.parseInt(strings[1]);
                sparseArrayFromFile[rowIndex][2]=Integer.parseInt(strings[2]);
                rowIndex++;
            }
            //打印文件读取出来的稀疏数组
            System.out.println("打印文件读取出来的稀疏数组:");
            for (int i = 0; i < sparseArrayFromFile.length; i++) {
                for (int j = 0; j < sparseArrayFromFile.length; j++) {
                    System.out.print(sparseArrayFromFile[i][j]+"  ");
                }
                System.out.println();
            }
            //恢复原始数组
            int[][] recoveredArray = new int[sparseArrayFromFile[0][0]][sparseArrayFromFile[0][1]];
            for (int i = 1; i < sparseArrayFromFile.length; i++) {
                recoveredArray[sparseArrayFromFile[i][0]][sparseArrayFromFile[i][1]]=sparseArrayFromFile[i][2];
            }
            //打印恢复的数组
            System.out.println("打印恢复的数组");
            for (int i = 0; i < recoveredArray.length; i++) {
                for (int j = 0; j < recoveredArray.length; j++) {
                    System.out.print(recoveredArray[i][j]+"  ");
                }
                System.out.println();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}


运行结果如下:

20201005215831379.png

目录
相关文章
|
21天前
|
存储 Java 索引
Java快速入门之数组、方法
### Java快速入门之数组与方法简介 #### 一、数组 数组是一种容器,用于存储同种数据类型的多个值。定义数组时需指定数据类型,如`int[]`只能存储整数。数组的初始化分为静态和动态两种: - **静态初始化**:直接指定元素,系统自动计算长度,如`int[] arr = {1, 2, 3};` - **动态初始化**:手动指定长度,系统给定默认值,如`int[] arr = new int[3];` 数组访问通过索引完成,索引从0开始,最大索引为`数组.length - 1`。遍历数组常用`for`循环。常见操作包括求和、找最值、统计特定条件元素等。
|
4月前
|
存储 Java
Java中的HashMap和TreeMap,通过具体示例展示了它们在处理复杂数据结构问题时的应用。
【10月更文挑战第19天】本文详细介绍了Java中的HashMap和TreeMap,通过具体示例展示了它们在处理复杂数据结构问题时的应用。HashMap以其高效的插入、查找和删除操作著称,而TreeMap则擅长于保持元素的自然排序或自定义排序,两者各具优势,适用于不同的开发场景。
60 1
|
4月前
|
存储 Java
告别混乱!用Java Map优雅管理你的数据结构
【10月更文挑战第17天】在软件开发中,随着项目复杂度增加,数据结构的组织和管理至关重要。Java中的Map接口提供了一种优雅的解决方案,帮助我们高效、清晰地管理数据。本文通过在线购物平台的案例,展示了Map在商品管理、用户管理和订单管理中的具体应用,有效提升了代码质量和维护性。
109 2
|
5天前
|
存储 人工智能 算法
C 408—《数据结构》算法题基础篇—数组(通俗易懂)
408考研——《数据结构》算法题基础篇之数组。(408算法题的入门)
51 23
|
21天前
|
存储 Java 索引
Java基础(六):数组
Java基础(六):数组
Java基础(六):数组
|
19天前
|
存储 Java C++
Java数组:静态初始化与动态初始化详解
本文介绍了Java中数组的定义、特点及初始化方式。
51 12
|
2月前
|
存储 缓存 安全
Java 集合江湖:底层数据结构的大揭秘!
小米是一位热爱技术分享的程序员,本文详细解析了Java面试中常见的List、Set、Map的区别。不仅介绍了它们的基本特性和实现类,还深入探讨了各自的使用场景和面试技巧,帮助读者更好地理解和应对相关问题。
53 5
|
3月前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
94 5
|
3月前
|
存储 人工智能 算法
数据结构实验之C 语言的函数数组指针结构体知识
本实验旨在复习C语言中的函数、数组、指针、结构体与共用体等核心概念,并通过具体编程任务加深理解。任务包括输出100以内所有素数、逆序排列一维数组、查找二维数组中的鞍点、利用指针输出二维数组元素,以及使用结构体和共用体处理教师与学生信息。每个任务不仅强化了基本语法的应用,还涉及到了算法逻辑的设计与优化。实验结果显示,学生能够有效掌握并运用这些知识完成指定任务。
77 4
|
3月前
|
缓存 算法 Java
本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制
在现代软件开发中,性能优化至关重要。本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制。通过调整垃圾回收器参数、优化堆大小与布局、使用对象池和缓存技术,开发者可显著提升应用性能和稳定性。
66 6

热门文章

最新文章