请选择 进入手机版 | 继续访问电脑版

[Golang] golang数据布局 之golang奇怪 数组sparsearray详解

[复制链接]
查看185 | 回复34 | 2021-9-15 03:07:55 | 显示全部楼层 |阅读模式
目次

一、希奇 数组

1. 先看一个现实 的需求

编写的五子棋程序中,有存盘退出和续上盘的功能

golang数据布局
之golang奇怪


数组sparsearray详解

分析按照原始的方式来的二维数组的标题

由于 该二维数组的很多值是默认值0,因此记录了很多没故意 义的数据

2. 基本先容

  1. 当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。
  2. 稀疏数组的处理方法是:
  3. 1)记录数组一共有几行几列,有多少个不同的值
  4. 2)思想:把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模
复制代码

举例:

golang数据布局
之golang奇怪


数组sparsearray详解

3. 应用实例

  1. 1)使用稀疏数组,来保留类似前面的二维数组(棋盘、地图等等)
  2. 2)把稀疏数组存盘,并且可以重新恢复原来的二维数组数
  3. 3)整体思路分析
复制代码

golang数据布局
之golang奇怪


数组sparsearray详解

  1. 4)代码实现
复制代码
  1. package main
  2. import (
  3. "fmt"
  4. )
  5. type ValNode struct {
  6. row int
  7. col int
  8. val int
  9. }
  10. func main() {
  11. // 1. 创建一个原始数组
  12. var chessMap [11][11]int
  13. chessMap[1][2] = 1 // 1表示黑子
  14. chessMap[2][3] = 2 // 2表示蓝子
  15. // 2. 输出看看原始的数组
  16. for _, v1 := range chessMap {
  17. for _, v2 := range v1 {
  18. fmt.Printf("%d\t",v2)
  19. }
  20. fmt.Println()
  21. }
  22. // 3. 转成稀疏数组
  23. // 思路:
  24. // (1)遍历 chessMap,如果我们发现有一个元素的值不为0,我们就创建一个node结构体
  25. // (2)将其放入到对应的切片即可
  26. var sparseArr []ValNode
  27. // 标准的一个稀疏数组应该还有一个 记录元素的二维数组的规模(行和列,默认值)
  28. // 创建一个ValNode值结点
  29. valNode := ValNode {
  30. row: 11,
  31. col: 11,
  32. val: 0,
  33. }
  34. sparseArr = append(sparseArr,valNode)
  35. for i1, v1 := range chessMap {
  36. for i2, v2 := range v1 {
  37. if v2 != 0 {
  38. // 创建一个ValNode 值结点
  39. valNode = ValNode {
  40. row: i1,
  41. col: i2,
  42. val: v2,
  43. }
  44. sparseArr = append(sparseArr,valNode)
  45. }
  46. }
  47. }
  48. // 输出稀疏数组
  49. fmt.Println("当前的稀疏数组是:::::")
  50. for i, valNode := range sparseArr {
  51. fmt.Printf("%d:%d %d %d \n",i,valNode.row,valNode.col,valNode.val)
  52. }
  53. // 将这个稀疏数组,存盘 d:/chessmap.data
  54. // 如果恢复原始的数组
  55. // 1. 打开这个存盘的文件:d:/chessmap.data => 恢复原始数组
  56. // 2. 这里使用稀疏数组恢复
  57. // 先创建一个原始数组
  58. var chessMap2 [11][11]int
  59. // 遍历稀疏数组 sparseArr [遍历文件的每一行]
  60. for index, valNode := range sparseArr {
  61. if (index == 0) {
  62. continue
  63. }
  64. chessMap2[valNode.row][valNode.col] = valNode.val
  65. }
  66. // 看看chessMap2看看是不是恢复了
  67. for _,value1 := range chessMap2 {
  68. for _, value2 := range value1 {
  69. fmt.Printf("%d \t",value2)
  70. }
  71. fmt.Println()
  72. }
  73. }
复制代码
  1. 稀疏数组的作用,对重复量数据大的数据可以使用,减少存储的内容
复制代码

到此这篇关于golang数据布局 之golang希奇 数组sparsearray的文章就先容 到这了,更多干系 golang希奇 sparsearray数组内容请搜刮 脚本之家从前 的文章或继续欣赏 下面的干系 文章盼望 大家以后多多支持脚本之家!


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

avatar 杰尼亚斯痔 | 2021-9-15 05:31:24 | 显示全部楼层
我对admin楼主的敬仰犹如滔滔江水绵延不绝!
回复

使用道具 举报

avatar 未来看得见吗敲 | 2021-9-21 00:48:13 | 显示全部楼层
关注一下!
回复

使用道具 举报

avatar Rudy64077 | 2021-9-22 09:26:40 | 显示全部楼层
楼上的真不讲道理!
回复

使用道具 举报

avatar 上是中国十七地 | 2021-9-26 17:28:24 | 显示全部楼层
admin楼主练了葵花宝典吧?
回复

使用道具 举报

avatar 阳子1989 | 2021-10-4 10:09:39 | 显示全部楼层
宇宙第一贴诞生了!
回复

使用道具 举报

avatar 静美人2017 | 2021-10-7 07:10:17 | 显示全部楼层
灌水不是我的目的!
回复

使用道具 举报

avatar Gordon520 | 2021-10-14 14:34:59 | 显示全部楼层
admin楼主的帖子越来越有深度了!
回复

使用道具 举报

avatar 小仙女要起飞 | 2021-10-16 18:43:36 | 显示全部楼层
admin楼主会死的很有节奏的!
回复

使用道具 举报

avatar 同行866 | 2021-10-17 01:31:35 | 显示全部楼层
顶!顶!顶!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则