数据结构与算法的关系

几个实际编程中遇到的问题

要想写出优秀的算法,首先应该能读懂别人写好的算法。

将生活中遇到的实际问题,使用程序来解决

线性结构和非线性结构

线性结构和非线性结构的关系:
数据结构:线性结构 + 非线性结构
线性结构:数据元素之间是 一对一 的关系
非线性结构:数据元素之间是 一对多 或 多对多 的关系
线性结构的存储方式:顺序存储 + 链式存储
顺序存储:数据存储在一片连续的地址空间中
链式存储:数据的存储空间可能并不连续。元素节点中存储的是「数据元素」和「相邻元素的地址信息」
常见的线性结构:数组、链表(两种不同的存储方式)、栈、队列
非线性结构:树、图、(集合)、二维数组、多维数组、广义表

1. 线性结构

2. 非线性结构

一、稀疏数组


1. 应用场景

普通的二维数组记录数据时,可能存放大量的无效数据,导致存储空间的浪费

2. 基本介绍

稀疏数组的应用背景二维数组中存放大量的无效数据时,可使用稀疏数组

稀疏数组的处理方法

  1. 记录数组一共有 几行几列有多少个有效数据(第一行)
  2. 将有效数据的 行、列、值 存储到数组中(其余行)

二维数组稀疏数组对应关系图

第一行:数组信息
其余行:有效数据信息

3. 案例

有大量的无效数据0

4. 分析

二维数组如何转换为稀疏数组
需要知道
稀疏数组的行:有效数据的个数+1
稀疏数组的列:3
有效数据的个数:设置一个计数器,通过遍历来获取
有效数据的信息:通过遍历数组来获取

稀疏数组如何转换为二维数组
根据稀疏数组的第一行:创建二维数组
遍历稀疏数组:然后为二维数组赋值

最终保存到磁盘即可(IO)

整体思路:

5. 代码实现:






6. 课后题:

7. 完整代码

package com.SparseArray_01;import java.io.*;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.List;public class SparseArray {public static void main(String[] args) {/*** 1. 创建一个二维数组,并存储数据* 2. 输出二维数组中的数组* 3. 将二维数组转换为稀疏数组* 4. 输出稀疏数组中的数据* 5. 将稀疏数组的数据转为二维数组* 6. 输出二维数组中的数据* 7. 将稀疏数组写入到 map.txt 文件中* 8. 将稀疏数组从 map.txt 文件中读取出来* 9. 从文件中读出稀疏数组的结果,打印在控制台*/// 1. 创建一个二维数组,并存储数据int chessArr1[][] = new int[11][11];chessArr1[1][2] = 1;chessArr1[2][3] = 2;chessArr1[3][4] = 1;chessArr1[3][3] = 2;// 2. 输出二维数组中的数组System.out.println("二维数组的内容:");for(int i = 0; i < chessArr1.length; i++) {for (int j = 0; j < chessArr1[i].length; j++) {System.out.print(chessArr1[i][j] + "\t");}System.out.println();}// 3. 将二维数组转换为稀疏数组int sum = 0;    // 记录有效数据的个数for(int i = 0; i < chessArr1.length; i++) {for (int j = 0; j < chessArr1[i].length; j++) {if (chessArr1[i][j] != 0) {sum++;}}}//稀疏数组int sparseArray[][] = new int[sum+1][3];sparseArray[0][0] = 11;sparseArray[0][1] = 11;sparseArray[0][2] = sum;//填充有效数据int count = 0;for (int i = 0; i < chessArr1.length; i++) {for (int j = 0; j < chessArr1[i].length; j++) {if (chessArr1[i][j] != 0) {count++;sparseArray[count][0] = i;sparseArray[count][1] = j;sparseArray[count][2] = chessArr1[i][j];}}}// 4. 输出稀疏数组中的数据System.out.println("稀疏数组如下图所示:");for (int i = 0; i < sparseArray.length; i++) {System.out.print(sparseArray[i][0] + "\t" + sparseArray[i][1] + "\t" + sparseArray[i][2] + "\n");}// 5. 将稀疏数组的数据转为二维数组int[][] chessArr2 = new int[sparseArray[0][0]][sparseArray[0][1]];for (int i = 1; i < sparseArray.length; i++) {chessArr2[sparseArray[i][0]][sparseArray[i][1]] = sparseArray[i][2];}// 6. 输出二维数组中的数据System.out.println("稀疏数据转为二维数组后,如下图所示:");for (int i = 0; i < chessArr2.length; i++) {for (int j = 0; j < chessArr2[i].length; j++) {System.out.print(chessArr2[i][j] + "\t");}System.out.println();}// 7. 将稀疏数组写入到 map.txt 文件中PrintWriter pw = null;try {pw = new PrintWriter("D:/map.txt");StringBuffer stringBuffer = new StringBuffer();for (int i = 0; i < sparseArray.length; i++) {for (int j = 0; j < sparseArray[i].length; j++) {stringBuffer.append(sparseArray[i][j] + "\t");}stringBuffer.append("\n");}pw.println(stringBuffer);} catch (FileNotFoundException e) {e.printStackTrace();}finally {pw.close();}// 8. 将稀疏数组从 map.txt 文件中读取出来try {List<String> lines = Files.readAllLines(Paths.get("D:/map.txt"), StandardCharsets.UTF_8);// 这里lines集合,最后一行是空行,需要省去for (int i = 0; i < lines.size()-1; i++) {// 这里在分割时要注意,如果使用" "来分割的话,会将\t也存入到数组中,这里我们只想将字符串存入到数组中String[] s = lines.get(i).split("\t");for (int j = 0; j < s.length; j++) {sparseArray[i][j] = Integer.parseInt(s[j]);}}} catch (IOException ioException) {ioException.printStackTrace();}// 9. 从文件中读出稀疏数组的结果,打印在控制台System.out.println("从文件中读出稀疏数组的结果:");for (int i = 0; i < sparseArray.length; i++) {for (int j = 0; j < sparseArray[i].length; j++) {System.out.print(sparseArray[i][j] + "\t");}System.out.println();}}
}

尚硅谷01 数据结构与算法_数据结构与算法介绍+稀疏数组相关推荐

  1. 【Matlab】智能优化算法_蜻蜓优化算法DA

    [Matlab]智能优化算法_蜻蜓优化算法DA 1.背景介绍 2.灵感 3.公式推导 3.1 勘探和开发操作 4.算法流程图 5.文件结构 6.伪代码 7.详细代码及注释 7.1 DA.m 7.2 d ...

  2. 数据挖掘经典十大算法_条件熵、信息增益介绍

    数据挖掘经典算法_条件熵.信息增益介绍 一.条件熵 首先与信息熵进行类比,从信息熵的计算公式中我们知道它是考虑到该随机变量的所有可能取值,即所有可能发生事件所带来信息量的期望.由此顾名思义 条件熵的定 ...

  3. 【Matlab】智能优化算法_蚁狮优化算法ALO

    [Matlab]智能优化算法_蚁狮优化算法ALO 1.背景介绍 2.基本思想 3.公式推导 3.1 ALO算法的运算符 3.2 蚂蚁的随机游动 3.3 困在蚂蚁坑里 3.4 修建陷阱 3.5 蚂蚁划向 ...

  4. 【Matlab】智能优化算法_灰狼优化算法GWO

    [Matlab]智能优化算法_灰狼优化算法GWO 1.背景介绍 2.基本思想 2.1 等级制度 2.2 狩猎方式 3.公式推导 3.1 社会等级制度 3.2 包围猎物 3.3 包围猎物 3.4 攻击猎 ...

  5. 尚硅谷【韩顺平】 | Java数据结构和算法【详细笔记】(持续更新)

    这里写目录标题 数据结构 线性结构和非线性结构 线性结构 非线性结构 稀疏 sparsearray 数组 和队列 稀疏 sparsearray 数组 基本介绍 应用实例 代码的实现 队列 数组模拟队列 ...

  6. python数据结构视频百度云盘_数据结构与算法Python视频领课

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 课程简介: 本课程包含Python编程基础的基本语法及变量,基本数据结构,Code Structure,Function.让学生在学会Python基础的同 ...

  7. 沃舍尔算法_[数据结构拾遗]图的最短路径算法

    前言 本专题旨在快速了解常见的数据结构和算法. 在需要使用到相应算法时,能够帮助你回忆出常用的实现方案并且知晓其优缺点和适用环境.并不涉及十分具体的实现细节描述. 图的最短路径算法 最短路径问题是图论 ...

  8. python数据结构算法_数据结构与算法(Python)

    数据结构与算法(Python) Why? 我们举一个可能不太恰当的例子: 如果将最终写好运行的程序比作战场,我们码农便是指挥作战的将军,而我们所写的代码便是士兵和武器. 那么数据结构和算法是什么?答曰 ...

  9. prim算法_数据结构与算法

    根据MOOC上课程总结,文章目录为: 一.引论 数据结构的基本概念 数据的逻辑结构和存储结构 算法及其时间复杂度 时间复杂度及应用 二.线性表 线性表的概念及顺序存储 单链表的概念及其基本操作 建立单 ...

最新文章

  1. 寻找冬日里的流量美食,发现了李子柒走红的秘密
  2. fpga初始化错误_一种SRAM型FPGA单粒子效应加固平台设计
  3. python字符串截取_Python容器类型公共方法汇总
  4. boost::is_sorted相关的测试程序
  5. element table 组件内容换行方案
  6. LeetCode 1061. 按字典序排列最小的等效字符串(并查集)
  7. mysql主键重复会覆盖还是_mysql如果主键重复了会发生什么情况
  8. 运维真的被云革命掉了吗?
  9. 用python建云盘_超简单!基于Python搭建个人“云盘”
  10. [2018.04.29 T1] 图
  11. 《Java语言程序设计》(基础篇原书第10版)第十一章复习题答案
  12. html对话框取消确定,alert 确定 取消
  13. Ubuntu 18.04 究极美化教程
  14. 植物大战僵尸原版完整版 免安装中文版
  15. 后渗透权限维持的方法
  16. Golang可视化工具——go-callvis
  17. T(n)=25T(n/5)+n*n的时间复杂度
  18. 20行Python代码,轻轻松松获取各路书本,你还在花钱买着看嘛~
  19. Android 9 (P)之init进程启动源码分析指南之三
  20. Click House设置远程登陆及修改默认用户名密码

热门文章

  1. 水仙花数(输出全部水仙花数)
  2. django 自定义中间件实现访问频率限制和IP禁用
  3. mac上截图的快捷键以及一些快捷键使用
  4. java annotation class,Java Class类 isAnnotation()方法及示例
  5. 西方投资组合理论及其新发展综述
  6. Android自定义View实现三角到八角的属性分布图-雷达图(蜘蛛网图)
  7. CommandArgument属性 绑定参数
  8. 《数据库系统概念》8-选择、投影等关系运算
  9. 寻路机器人单片机程序示例_单片机典型案例开发(四)
  10. k8s添加pod,k8常用命令,k8s删除pod