IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 数据结构与算法第一天:稀疏数组 -> 正文阅读

[数据结构与算法]数据结构与算法第一天:稀疏数组

一、数据结构与算法

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 {
        /*
        * 第一步:初始化二维数组
        * */
        // 1、创建二维数组
        int[][] chessArray = new int[11][11];
        // 2、初始化二维数组(0表示没有棋子,1表示黑棋子,2表示白棋子)
        chessArray[1][1] = 1;
        chessArray[2][3] = 2;
        chessArray[2][1] = 1;
        // 3、打印二维数组
        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();
        }

        /*
        * 第二步:遍历二维数组,得到有效的数据个数sum
        * */
        int sum = 0;
        for (int[] chessArr : chessArray) {
            for (int chess : chessArr) {
                if (chess != 0){
                    sum++;
                }
            }
        }

        /*
        * 第三步:根据sum创建稀疏数组`sparseArray[sum+1][3]`
        * */
        int[][] sparseArray = new int[sum+1][3];

        /*
        * 第四步:将二维数组的有效数据存入稀疏数组
        * */
        // 1、第一行存入二维数组行、列及有效值个数
        sparseArray[0][0] = chessArray.length;
        sparseArray[0][1] = chessArray[0].length;
        sparseArray[0][2] = sum;
        // 2、存入二维数组有效值的行、列及有效值
        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];
                }
            }
        }
        // 3、打印稀疏数组
        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();
        }

        /*
        * 第五步:将稀疏数组中的数据存入文件
        * */
        // 1、创建file对象,指定文件
        File file = new File("map.data");
        // 2、造缓冲流
        BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(file));
        // 3、存入数据
        for (int[] row : sparseArray) {
            for (int data : row) {
                bufferedWriter.write(data + "\t");
            }
            bufferedWriter.newLine();
        }
        // 4、关闭流
        bufferedWriter.close();
    }

    
    
    /*
    * 文件 ===> 稀疏数组 ===> 二维数组
    * */
    private static void method2() throws IOException {
        /*
        * 第一步:读取文件,并创建稀疏数组
        * */
        // 1、读取文件,指定要读取的文件
        File file = new File("map.data");
        // 2、读取文件数据,存入集合
        List<String> list = new ArrayList<>();
        String line;
        BufferedReader reader = null;
        if (file.exists()){
            // 2.1、造缓冲流
            reader = new BufferedReader(new FileReader(file));
            // 2.2、读取文件内容
            while ((line = reader.readLine()) != null){
                list.add(line.trim());
            }
        }

        /*
        * 第二步:将文件数据写入稀疏数组
        * */
        // 1、初始化稀疏数组
        int[][] sparseArray = new int[0][];
        if (list.size() > 0 && list != null ){
            // 1.1、获取稀疏数组行、列、有效数据
            String[] fistLine = list.get(0).split("\t");
            int row = list.size();// 行
            int col = fistLine.length;// 列
            // 1.2、创建稀疏数组
            sparseArray = new int[row][col];
            // 1.3、初始化稀疏数组
            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]);
                }
            }
        }
        // 2、打印稀疏数组
        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]];

        /*
        * 第四步:根据稀疏数组中的数据,还原二维数组
        * */
        // 1、还原二维数组
        for (int row = 1; row < sparseArray.length; row++) {
            chessArray[sparseArray[row][0]][sparseArray[row][1]] = sparseArray[row][2];
        }
        // 2、输出二维数组
        System.out.println("=====二维数组=====");
        for (int[] row : chessArray) {
            for (int data : row) {
                System.out.printf("%d\t",data);
            }
            System.out.println();
        }

        // 关闭流
        reader.close();
    }
}

声明:如有文章侵权,请及时联系本人,以便后续及时作出修改。

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-12-23 15:58:58  更:2021-12-23 15:59:10 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 16:23:33-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码