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

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

开发者学堂课程【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月前
|
算法 数据处理 C语言
C语言中的位运算技巧,涵盖基本概念、应用场景、实用技巧及示例代码,并讨论了位运算的性能优势及其与其他数据结构和算法的结合
本文深入解析了C语言中的位运算技巧,涵盖基本概念、应用场景、实用技巧及示例代码,并讨论了位运算的性能优势及其与其他数据结构和算法的结合,旨在帮助读者掌握这一高效的数据处理方法。
51 1
|
2月前
|
机器学习/深度学习 算法 数据挖掘
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构。本文介绍了K-means算法的基本原理,包括初始化、数据点分配与簇中心更新等步骤,以及如何在Python中实现该算法,最后讨论了其优缺点及应用场景。
124 4
|
13天前
|
存储 运维 监控
探索局域网电脑监控软件:Python算法与数据结构的巧妙结合
在数字化时代,局域网电脑监控软件成为企业管理和IT运维的重要工具,确保数据安全和网络稳定。本文探讨其背后的关键技术——Python中的算法与数据结构,如字典用于高效存储设备信息,以及数据收集、异常检测和聚合算法提升监控效率。通过Python代码示例,展示了如何实现基本监控功能,帮助读者理解其工作原理并激发技术兴趣。
50 20
|
2月前
|
存储 算法 搜索推荐
Python 中数据结构和算法的关系
数据结构是算法的载体,算法是对数据结构的操作和运用。它们共同构成了计算机程序的核心,对于提高程序的质量和性能具有至关重要的作用
|
2月前
|
数据采集 存储 算法
Python 中的数据结构和算法优化策略
Python中的数据结构和算法如何进行优化?
|
2月前
|
算法
数据结构之路由表查找算法(深度优先搜索和宽度优先搜索)
在网络通信中,路由表用于指导数据包的传输路径。本文介绍了两种常用的路由表查找算法——深度优先算法(DFS)和宽度优先算法(BFS)。DFS使用栈实现,适合路径问题;BFS使用队列,保证找到最短路径。两者均能有效查找路由信息,但适用场景不同,需根据具体需求选择。文中还提供了这两种算法的核心代码及测试结果,验证了算法的有效性。
112 23
|
2月前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
65 1
|
2月前
|
C语言
【数据结构】栈和队列(c语言实现)(附源码)
本文介绍了栈和队列两种数据结构。栈是一种只能在一端进行插入和删除操作的线性表,遵循“先进后出”原则;队列则在一端插入、另一端删除,遵循“先进先出”原则。文章详细讲解了栈和队列的结构定义、方法声明及实现,并提供了完整的代码示例。栈和队列在实际应用中非常广泛,如二叉树的层序遍历和快速排序的非递归实现等。
241 9
|
2月前
|
存储 算法
非递归实现后序遍历时,如何避免栈溢出?
后序遍历的递归实现和非递归实现各有优缺点,在实际应用中需要根据具体的问题需求、二叉树的特点以及性能和空间的限制等因素来选择合适的实现方式。
40 1
|
2月前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
71 5