稀疏数组就是数组中大部分的内容都没有被使用(或都为零),在数组中仅有少部分的空间使用,这样造成内存空间的浪费,为了节省内存空间,并且不影响数组中原有的内容值,我们可以采用一种压缩的方式来表示稀疏数组的内容。

package mainimport ("fmt"
)type ValNode struct {row intcol intval int
}func main() {//一、先创建一个原始数组var chessMap [11][11]intchessMap[1][2] = 1 //黑子chessMap[2][3] = 2 //蓝子//输出原始数组for _, v := range chessMap {for _, v2 := range v {fmt.Printf("%d\t", v2)}fmt.Println()}//二、转成稀疏数组//1、遍历chessMap,如果发现有一个元素的值不为0,创建一个node结构体//2、将其放入到对应的切片中即可var sparseArr []ValNode//标准的一个稀疏数组应该还有一个记录元素的二维数组的规模(行和列,默认值)//创建一个ValNode值节点valNode := ValNode{row: 11,col: 11,val: 0,}sparseArr = append(sparseArr, valNode)//遍历for i, v := range chessMap {for j, v2 := range v {if v2 != 0 {//创建一个ValNode值节点valNode := ValNode{row: i,col: j,val: v2,}sparseArr = append(sparseArr, valNode)}}}//输出稀疏数组fmt.Println("当前的稀疏数组是:")for i, valNode := range sparseArr {fmt.Printf("%d: %d %d %d\n", i, valNode.row, valNode.col, valNode.val)}//三、恢复原始的数组//1、这里使用稀疏数组恢复//2、先创建一个原始数组var chessMap2 [11][11]int//遍历稀疏数组(文件的每一行)for i, valNode := range sparseArr {if i != 0 { //跳过第一行的数据chessMap2[valNode.row][valNode.col] = valNode.val}}//输出chessMap2fmt.Println("恢复后的原始数据:")for _, v := range chessMap2 {for _, v2 := range v {fmt.Printf("%d\t", v2)}fmt.Println()}
}

运行结果:

二、

1、将这个稀疏数组,存盘  
2、打开这个文件,恢复原始数组
package mainimport ("bufio""fmt""log""os""strconv""strings"
)type nodeval struct {row intcol intval interface{}
}//文件读取转成原始数据
func ReadData(filename string) {file, err := os.OpenFile(filename, os.O_RDONLY, 0666)if err != nil {log.Fatalf("%s", err)}defer file.Close()bfrd := bufio.NewReader(file)var index = 0var arr [][]intfor {line, err := bfrd.ReadBytes('\n')if err != nil {break}index++temp := strings.Split(string(line), " ")row, _ := strconv.Atoi(temp[0])col, _ := strconv.Atoi(temp[1])value, _ := strconv.Atoi(temp[2])if index == 1 {for i := 0; i < row; i++ {var arr_temp []intfor j := 0; j < col; j++ {arr_temp = append(arr_temp, value)}arr = append(arr, arr_temp)}}if index != 1 {arr[row][col] = value}}// 打印数据fmt.Println("从磁盘读取后的数据")for _, v := range arr {for _, v1 := range v {fmt.Printf("%d\t", v1)}fmt.Println()}
}func main() {var chessmap [11][11]intchessmap[1][2] = 1chessmap[2][3] = 2// 看看原始数据for _, v := range chessmap {for _, v1 := range v {fmt.Printf("%d\t", v1)}fmt.Println()}// 转成稀疏数据var sparseArr []nodeval// 数据规模sparseArr = append(sparseArr, nodeval{row: 11,col: 11,val: 0,})//稀疏数组for row, val := range chessmap {for col, val1 := range val {if val1 != 0 {sparseArr = append(sparseArr, nodeval{row: row,col: col,val: val1,})}}}// 稀疏数组存盘filepath := "c:/test.txt"file, err := os.OpenFile(filepath, os.O_WRONLY|os.O_CREATE, 0666)if err != nil {fmt.Printf("open file err=%v\n", err)}defer file.Close()writer := bufio.NewWriter(file)for _, node := range sparseArr {str := fmt.Sprintf("%d %d %d \n", node.row, node.col, node.val)writer.WriteString(str)}writer.Flush()// 稀疏数据从磁盘读取转换成原始数据ReadData(filepath)
}

运行结果如下:

文件夹

参考:尚硅谷韩顺平Go语言核心编程

文件编程:golang学习(十七):文件编程


欢迎大家指正补充,感谢阅读。

稀疏数组(golang实现)相关推荐

  1. golang数据结构与算法——稀疏数组、队列和链表

    文章目录 一 稀疏数组 1.1 先看一个实际的需求 1.2 稀疏数组基本介绍 1.3 稀疏数组举例说明 1.4 把数组转换为稀疏数组实现 1.5 把稀疏数组还原为原数组 二 队列 2.1 队列的介绍 ...

  2. golang实现稀疏数组(Sparse array)

    基本介绍 所谓稀疏数组就是数组中大部分的内容值都未被使用(或都为零),在数组中仅有少部分的空间使用.因此造成内存空间的浪费,为了节省内存空间,并且不影响数组中原有的内容值,我们可以采用一种压缩的方式来 ...

  3. 稀疏数组——实现五子棋存盘和续上盘功能

    本篇语言使用的是Golang,跟语言无关,主要目的是为了讲解稀疏数组的应用以及二维数组和稀疏数组之间的转化 1.基本介绍 当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数 ...

  4. java 稀疏数组和二维数组转换,并保存稀疏数组到文件后可以读取

    稀疏数组和二维数组转换 稀疏数组:当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组 稀疏数组的处理方法: 记录数组一共有多少行,有多少个不同的值 把具有不同值得元素的行 ...

  5. 数据结构与算法---稀疏数组

    数据结构与算法-稀疏数组 1.基本介绍: ​ 当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组. 2.稀疏数组的处理方法是: ​ (1)记录数组一共有几行几列,有多少个 ...

  6. 一、稀疏数组的实际应用和代码实现

    稀疏数组 1.实际需求 使用二维数组记录棋盘 2.分析问题 因为二维数组中的很多值都是默认值0,因此记录了很多没有意义的数据,由此我们引出稀疏数组 3.稀疏数组的基本介绍 (1)当一个数组中大部分元素 ...

  7. 算法与数据结构(稀疏数组)

    稀疏数组 Sparse Array 当一个数组中有大量元素相同时,可以用稀疏数组来表示,通过将有用信息记录在小规模的数组中来缩减程序规模 原数组: [0000102000300000004000000 ...

  8. python 稀疏数组搜索

    | 稀疏数组搜索 稀疏数组搜索.有个排好序的字符串数组,其中散布着一些空字符串,编写一种方法,找出给定字符串的位置.示例1:输入: words = ["at", "&qu ...

  9. 数据结构之稀疏数组 - SparseArray

    关注 "弋凡"(YiFan)微信公众号吧 记录简单笔记 做你的最爱 1,定义 稀疏数组可以看作普通二维数组的压缩,这里的普通数组指无效数据远大于有效数据 稀疏数组分为3列 行 列 ...

最新文章

  1. Unity中那些事半功倍的好插件
  2. java:BIO, NIO
  3. 万亿条数据查询如何做到毫秒级响应?
  4. Jsoup 抓取和数据页 认识HTTP头
  5. PCB Genesis脚本 C#调用Javascript
  6. 机器学习项目实战----泰坦尼克号获救预测(一)
  7. 专科python应届生工资多少-应届生学Python年薪30万,秘诀是什么?
  8. 网页爬虫实例一(网页截屏)
  9. UI 自动化框架对比2
  10. Mac谷歌浏览器添加JSONView的插件以提高开发的效率
  11. 百度地图离线开发demo(初始化地图)
  12. layui的lay-verify参数验证的问题
  13. BBEdit 12.6.6 代码编辑器
  14. 命令行给Linux安装中文,Linux下命令行安装TeamViewer
  15. 360个人图书馆 轻松解除网页防复制
  16. 关于45°角度地图坐标的计算原理 - LVin_A
  17. 电信运营商云计算战略定位分析
  18. python淘宝爬虫_简单的抓取淘宝图片的Python爬虫
  19. 小羊驼和你一起学习cocos2d-x之六(lua、android.mk)
  20. Java写个简单的记事本()

热门文章

  1. Python搭建开发环境
  2. mac安装配置maven
  3. SAXReader的主要用法(XML)
  4. 谈谈我对协议栈设计和架构的理解
  5. 标量、向量和矩阵的求导法则
  6. Android开发入门到实战精通 完整全套开发教程送给你
  7. Jim Joseph加入Burson Cohn Wolfe,担任新设立的全球职位
  8. 数据窗口Pageup与Pagedown翻页
  9. linux下,fping命令与ping命令解析
  10. Markdown编辑器 公式指导手册