稀疏数组

稀疏数组

前言

  • 使用语言 go
  • 学习笔记库使用+
  • 有地方需要填坑

思路

  1. 普通数组 压缩精简
  2. 将单个有效元素相关数据放入结构体
  3. 结构体作为元素存入数组切片,
  4. 实现文件对数组切片的读写
  • 个人认为关键点:有效数据 转为 结构体 、 数组切片

1.概念

是普通数组的压缩,此处数组有大量重复一样的数据(或者无效的数据)

普通数组
0 0 0 0 0                                        
0 0 1 0 0         
0 0 0 0 0       
0 0 0 2 0      

数组分析:以上数组分析:总行数4 总列数5 有效数据2
转为稀疏数组,这样有效数据就又转为新的数组

行 列 值  (普通数组中代表的含义)
4  5  2
1  2  1
3  3  2

2.优势

  • 原数组中存在大量的无效数据,占据了大量的存储空间,真正有用的数据却少之又少
  • 压缩存储可以节省存储空间以避免资源的不必要的浪费,在数据序列化到磁盘时,压缩存储可以提高IO效率

3.整体思考

  1. 普通数组转化为稀疏数组以后,得到一个新的数组,

  2. 每行数据含有的信息是(普通数组的 行、列、值 ),也就是说每一行就是一组关于有效数据的定位信息,(但是不要被这个新的数组干扰,新数组只是为了方便观看分析)

  3. 现在要考虑如何将这些数据写入文件,简单思考,两个for 循环就可以了,但是当你储存以后,在展开的时候,在使用for 循环还原成普通数组,期间的逻辑将会是一个很麻烦的事情

    当然可以使用限制 列 的值,实现行的跳转,来进行二维数组的还原,但是为什么不用呢?

    (我也不知道,暂时定义成寻找另外的方法吧 。。。)

  4. 每一行是一组数据,每组数据都有三个信息,这么多的数据可以考虑结构体,这样利用结构体可以精确达到对每个信息的访问。这样每一行就是一个结构体,稀疏数组就变成了一个 元素为结构体的一维数组,一维数组在进行磁盘的读写就方便多了

    (好吧,我也扯不下去了,底层的原因,应该是数组可以进行地址访问,更快吧,等补完了数据结构在填坑吧)

4.代码

普通数组 > 建立个普通数组 > 打印出来验证是否正确建立 > 转为稀疏数组 > 每个有效数据存入一个结构体 > 结构体作为元素放入数组

package main
import(
	"fmt"
	)

func main(){
    //定义一个的数组,并初始化,打印出来查看是否初始化成功
var chessMap [4][5]int    //初始默认值全为0
chessMap[1][2] = 1
chessMap[3][3] = 2
    for i , v = range chessMap{
        for j , v2 = range v{
            fmt.Print(v2)
        } 
    }
    
    //普通数组简化成稀疏数组,每一行中的数据是有效数据的定位信息(行,列,具体数据)
    //遍历普通数组,将非零项遍历出来,然后把他的信息储存在结构体中
    //将结构体再作为数据存入数组切片中,能够动态增加元素
    
    //定义一个结构体
    var valNode struct{
        row int
        col int
        value int
      }
    //定义一个数组切片用来动态追加结构体元素
    var sparseArry []valNode
    
    //结构体、数组 初始化
    valNode := valNode{
        row = 4,
        col = 5,
        value = 2
    }
    //通过索引位置可以区别不同的valNode
    sparseArry := append(sparseArry,valNode)
    //遍历普通数组找到非零项
    for i , v := range chessMap{  //注意这个 v 仍旧是一个一维数组,普通数组每一行的数组
        for j , v2 := range v{    //这个地方才真正遍历出来了每个元素
            if v2 != 0{
                valNode := valNode{
                    row = i
                    col = j
                    value = v2
                }
                 sparseArry := append(sparseArry , valNode)  //结构体追加入切片数组
            }
        }
    }
    //写入磁盘文件
    以后补
    //从磁盘文件写出
    以后补
    
    //将稀疏数组恢复成普通数组中,注意把第一行的普通数组信息去除掉
    //对于很多数据的,可以考虑一个,其他的都用 for 循环遍历实现
    var newChessMap [4][5]int
    for i ,value := range sparseArry{ //遍历每个数组元素(结构体)赋值给value
        if i != 0{
            newChessMap[value.row][value.col] := value.value
        }
    }
    //将新的数组打印出来,验证是否正确
    for i , v:= range newChessMap{
        for j , v2 := range v{
            fmt.Print(v2)
        }
    }
    
    }

5.总结

  1. 该块代码设计 切片数组、结构体的创建声明、赋值、追加元素
  2. 要深刻理解多维数组每一维度的数据关系每一行是一个数组,所以遍历的时候,最外层先遍历出来的是一个数组(二维数组为例)
  3. 数据写入/写出磁盘操作

6.参考

  1. https://blog.youkuaiyun.com/weixin_41922289/article/details/94555391
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值