数据结构和算法-原始数组转稀疏数组(二)|学习笔记

简介: 快速学习数据结构和算法-原始数组转稀疏数组(二)

开发者学堂课程【Go 语言核心编程 - 数据结构和算法:数据结构和算法-原始数组转稀疏数组(二)】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/627/detail/9829


数据结构和算法-原始数组转稀疏数组(二)


(4)做标准的稀疏数组

这样做有一个巨大的问题,就是没有做一个标准的稀疏数组,标准的行数组,前面应该还有整个这个数据,原始数据规模有多大,原先是几行几列的,前面大家知道他是往后面追,而且在之前11本身就是确定的,所以如果这要做一个标准的稀疏数组,输入如下代码:

//标准的一个稀疏数组还有一个 记录元素的二维数组的规模(行和列,默认值)

//创建一个 ValNode 值结点

valNode := ValNode{

row : 11,

col : 11,

val : 0,

}

apparseArr = append(sparseArr,valNode)

接着输入稀疏数组的代码,如下:

//输出稀疏数组

fmt.Println(当前的稀疏数组是:::::“)

for i, valNode := range sparseArr {

fmt.Println(%d: %d %d %d\n, i, valNode.row, valNode.col,valNode.val)

}

运行一下上述代码,测试结果如下:

image.png

(5)对以上代码的小结

原始的数组是长这个样子的,将原始数组转成稀疏数组处理,看变得非常小了,第一个结点是11110,第二个结点是121,第三个结点是222,会原先这么大一个速度,变得这么小了其实在实际的开发中,大量存在着这种情况的,这种数组,字符串有很多很多。

如果做一个程序员,脑海里面从来没这种思想,那是很失败的,为什么说有些程序员他的代码一跑起来又节省内存速度还快,而且都很有灵魂,因为他是有想法的,你当然也能实现,就是多占点内存,速度稍微慢一点儿,但是做一个优秀的程序员,肯定要去想怎么样让它变得更小一点对原先11乘11现在一下就变成这么几个数据,而且都有用这个好处对于像有些编程语言来说这个行和列可以直接从这读取出来直接初始化一个新的二维数组只是构念不行Java 里边,还有 APP 里面,一旦自己把这个读出来,就知道原始规模是什么而且还可以变化,假如原始模式以前是十乘十的也可以做,只是 Go 语言里面这样写死,所以这有点基础用的不是特别好还有别的办法,用切片

(6)存入问题的代码实现

那现在有了这个东西,要反过来适应它要反过来把存到磁盘里面因为你的目标是希望将来存盘退出,那还得把它搞到这个磁盘里面去,然后等到别人保存恢复的时候,要把它重新读出来,再恢复成原来的这个数字。

这里面又得动脑筋,之前讲过怎么把一个数把一个东西存到一个文件里面去,在 chapter14/filedemo03/main.go 中有以下代码:

package main

import (

fmt

io/ioutil

)

func main() {

//使用 ioutil.ReadFile 一次性将文件读取到位

file := d:/test.txt

content, err := ioutil.ReadFile(file)

if err != nil {

fmt.Printf(read err=%v, err)

}

//把读取到的内容显示到终端

fmt.Printf(%v ,string(content)) //[]bye

fmt.Printf(%v, string(content)) //[]bye

//我们没有显式的 Open 文件,因此也不需要显式的 Close 文件

//因为,文件的 Open 和 Close 被封装到 ReadFile 函数内部

这是一次性写入,肯定不合理,不能用这个工具,肯定是一个一个、一行一行有效数据存入的。

打开文件 chapter14/filedemo04/main.go,其中有以下代码:

func main() {

//创建一个新文件,写入内容5句”hello,Gardon

//1.打开文件d:/abc.txt

filePath := d:/abc.txt

file, err := os.OpenFile(filePath, os.O_WRONLY | os.O_CREATE,0666)

if err != nil {

fmt.Println(open file err=%v\n,err)

return

}

//没有及时关闭 file 句柄

defer file.Close()

//准备写入5句hello,Gardon

str := hello,Gardon\r\n //\r\n表示换行

//写入时,使用带缓存的 *Write

writer := bufio.NewWriter(file)

for i := 0; i < 5; i++ {

writer.WriteString(str)

}

//因为 writer 是带缓存,因此在调用 WriteString 方法时,其实

//内容是先写入到缓存的,所以需要调用 Flush 方法,将缓存的数据

//真正写入到文件中去,否则文件中会没有数据!!!

writer。Flush()

}

也可以先建一个新文件,比如以上代码中的文件,注意后缀它是无所谓,一般来讲,存东西一般是自己的一个文件格式文件的一个后缀,这就相当于之前写的代码中,在不停的遍历稀疏数组,可以把里面的”valNode.row, valNode.col, valNode.val”做成一串,用空格隔开,把它保存进去这个地方一保存进去过后,应该有思路了,找到 chapter14/filedemo04/main.go 位置,每有一个字符串,就写一行进去,一行后面再换一行,所以最后在数据库里边,应该是保存了一个东西其实真正保存的数据应该是

chessMap.data ,再把它保存起来,在里面的东西应该是这样的,如下图:

image.png

在压缩后的文件,其实就这么点数据,那么下一步该做什么事情?经过一番这个折腾把它保存到一个文件里面了这个文件就是 chessMap.data ,也有别的方法,但是最好用这个,就是最简单的方式放进去,放进去之后,这个就叫存盘退出当需要把东西经过一系列的操作恢复到这个地方的时候,就盘退出,就是要把这个东西重新恢复回来,显然很简单,恢复的时候恢复到这个数组,那么稀疏数组在中间就意义不大了。

如果在遍历整个这个地图的时候,直接把它恢复成原始的速度,这是可以的,因为每遍历一行,就可以建一个,每遍历一次,就知道现在哪个是第一个数,哪一个是零,把它初始化就行了,

如下图:

image.png

相关文章
|
2月前
|
存储 人工智能 算法
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
这篇文章详细介绍了Dijkstra和Floyd算法,这两种算法分别用于解决单源和多源最短路径问题,并且提供了Java语言的实现代码。
80 3
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
|
2月前
|
存储 算法 Java
Set接口及其主要实现类(如HashSet、TreeSet)如何通过特定数据结构和算法确保元素唯一性
Java Set因其“无重复”特性在集合框架中独树一帜。本文解析了Set接口及其主要实现类(如HashSet、TreeSet)如何通过特定数据结构和算法确保元素唯一性,并提供了最佳实践建议,包括选择合适的Set实现类和正确实现自定义对象的hashCode()与equals()方法。
35 4
|
2月前
|
机器学习/深度学习 搜索推荐 算法
探索数据结构:初入算法之经典排序算法
探索数据结构:初入算法之经典排序算法
|
2月前
|
算法 Java 索引
数据结构与算法学习十五:常用查找算法介绍,线性排序、二分查找(折半查找)算法、差值查找算法、斐波那契(黄金分割法)查找算法
四种常用的查找算法:顺序查找、二分查找(折半查找)、插值查找和斐波那契查找,并提供了Java语言的实现代码和测试结果。
23 0
|
2月前
|
算法 安全 数据安全/隐私保护
基于game-based算法的动态频谱访问matlab仿真
本算法展示了在认知无线电网络中,通过游戏理论优化动态频谱访问,提高频谱利用率和物理层安全性。程序运行效果包括负载因子、传输功率、信噪比对用户效用和保密率的影响分析。软件版本:Matlab 2022a。完整代码包含详细中文注释和操作视频。
|
12天前
|
算法 数据安全/隐私保护 索引
OFDM系统PAPR算法的MATLAB仿真,对比SLM,PTS以及CAF,对比不同傅里叶变换长度
本项目展示了在MATLAB 2022a环境下,通过选择映射(SLM)与相位截断星座图(PTS)技术有效降低OFDM系统中PAPR的算法实现。包括无水印的算法运行效果预览、核心程序及详尽的中文注释,附带操作步骤视频,适合研究与教学使用。
|
20天前
|
算法 数据挖掘 数据安全/隐私保护
基于FCM模糊聚类算法的图像分割matlab仿真
本项目展示了基于模糊C均值(FCM)算法的图像分割技术。算法运行效果良好,无水印。使用MATLAB 2022a开发,提供完整代码及中文注释,附带操作步骤视频。FCM算法通过隶属度矩阵和聚类中心矩阵实现图像分割,适用于灰度和彩色图像,广泛应用于医学影像、遥感图像等领域。
|
21天前
|
算法 调度
基于遗传模拟退火混合优化算法的车间作业最优调度matlab仿真,输出甘特图
车间作业调度问题(JSSP)通过遗传算法(GA)和模拟退火算法(SA)优化多个作业在并行工作中心上的加工顺序和时间,以最小化总完成时间和机器闲置时间。MATLAB2022a版本运行测试,展示了有效性和可行性。核心程序采用作业列表表示法,结合遗传操作和模拟退火过程,提高算法性能。
|
21天前
|
存储 算法 决策智能
基于免疫算法的TSP问题求解matlab仿真
旅行商问题(TSP)是一个经典的组合优化问题,目标是寻找经过每个城市恰好一次并返回起点的最短回路。本文介绍了一种基于免疫算法(IA)的解决方案,该算法模拟生物免疫系统的运作机制,通过克隆选择、变异和免疫记忆等步骤,有效解决了TSP问题。程序使用MATLAB 2022a版本运行,展示了良好的优化效果。
|
21天前
|
机器学习/深度学习 算法 芯片
基于GSP工具箱的NILM算法matlab仿真
基于GSP工具箱的NILM算法Matlab仿真,利用图信号处理技术解析家庭或建筑内各电器的独立功耗。GSPBox通过图的节点、边和权重矩阵表示电气系统,实现对未知数据的有效分类。系统使用MATLAB2022a版本,通过滤波或分解技术从全局能耗信号中提取子设备的功耗信息。